AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein stringlist zu filestream , filestream zu datei
Thema durchsuchen
Ansicht
Themen-Optionen

stringlist zu filestream , filestream zu datei

Ein Thema von davtix · begonnen am 2. Jan 2018 · letzter Beitrag vom 3. Jan 2018
Antwort Antwort
davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

stringlist zu filestream , filestream zu datei

  Alt 2. Jan 2018, 21:07
Hi, ich versuche hier mal, um es zu verstehen, eine iniDatei in ein Filestream zu packen und dann diese ggf. zu ändern und diese wieder zu speichern.

was mir fehlt ist nun, die ini Einträge in nen filestream zu bekommen und diesen filestream dann als datei abzuspeichern.

Ich denke das ich Funktion von FileStream völlig falsch verstehe und somit auch nicht weiterkomme.
Im Sppeicher wird die Datei in Zeilen abgelegt ähnlich einer Stringliste ?

Code:
var
  Form1: TForm1;
  ini : Tmeminifile;

  STL1: TStringList;

  FileStream1:tfilestream;
  FileStream2:tfilestream;


procedure TForm1.Button1Click(Sender: TObject);
begin

 FileStream1 := tfilestream.Create(  ExtractFilePath ( application.ExeName ) + '\testdatei.txt' , fmOpenReadWrite);

 ini := TMemIniFile.Create( '' );

 form1.ListBox1.Items.Insert(0,'data:=TMemIniFile.Create');
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  STL1 := TStringList.Create;
  try
    STL1.LoadFromStream( FileStream1 );
    ini.SetStrings( STL1 );

  finally
    STL1.Free;
  end;

  form1.ListBox1.Items.Insert(0,'s1.LoadFromStream(str)');
end;




procedure TForm1.Button4Click(Sender: TObject);
begin
 form1.edit1.text := ini.ReadString('section', 'eintrag1' , 'nix');

 form1.ListBox1.Items.Insert(0,'data.ReadString('+' section ' + 'eintrag1 ');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 ini.WriteString('section', 'eintrag2' , form1.Edit2.Text );

 form1.ListBox1.Items.Insert(0,'data.ReadString('+' section ' + 'eintrag2 ');
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 form1.edit3.text := ini.ReadString('section', 'eintrag2' , 'nix');

 form1.ListBox1.Items.Insert(0,'data.ReadString('+' section ' + 'eintrag2 ');
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
   STL1 := TStringList.Create;

   ini.GetStrings( STL1 );

   listbox2.items.assign( STL1 );
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: stringlist zu filestream , filestream zu datei

  Alt 2. Jan 2018, 21:23
Ich würd's mal damit probieren:

ini := TMemIniFile.Create(ExtractFilePath ( application.ExeName ) + '\testdatei.txt');

Warum bitteschön zuerst eine INI-Datei in einen Stream laden, diesen dann in eine Stringliste kopieren, um diese dann im Speicher in eine leere INI-Datei zu bekommen (oder so ähnlich).

Bitte was hast Du genau vor, so erscheint mir das erstmal nicht so zwingend ersichtlich

Ansonsten müsstest Du die bereits "vorwärts" gemachten Schritte nochmal "rückwärts" machen:
Delphi-Quellcode:
FileStream1.Free;
STL1.Clear;
STL1.AddStrings(ini);
FileStream2 := tfilestream.Create( ExtractFilePath ( application.ExeName ) + '\testdatei.txt' , fmOpenReadWrite);
STL1.SaveToStream(FileStream2);
FileStream2.Free;
STL1.Free;
ini.free;
Oder irgendwie so ähnlich. Sinnvoll erscheint mir das momentan noch nicht, was genau hast Du vor?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: stringlist zu filestream , filestream zu datei

  Alt 2. Jan 2018, 21:45
Ich komme auch nicht so ganz hinterher, aber ich glaube es ist Folgendes:

Du hast eine TMemIniFile und siehst (zu Recht!) nicht ein, weshalb man hier an Speicherung auf der Festplatte gebunden sein sollte. Du möchtest die ini-Daten in einen TStream packen. Da TMemIniFile hier leider nichts anbietet bleibt nur der Umweg über die Methoden GetStrings(..) und SetStrings(..).

Richtig verstanden?
  Mit Zitat antworten Zitat
davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: stringlist zu filestream , filestream zu datei

  Alt 2. Jan 2018, 21:52
hi danke für die schnelle Antwort.

nun sobald ich mir mit den Details (des programms)im klaren bin wollte ich die komplette ini Datei verschlüsseln und nicht nur die Einträge. Diese Verschlüsselung benötigt zwei Filestream s.
Das was ich hier versuche ist nur der erste Versuch wie ich mit den Files umgehe.Und ich habe Filestream noch nie benutzt bzw. noch nicht wirklich verstanden.
...nachdem ich alle Möglichkeiten durchsucht habe kommt mir meine Frage fast peinlich vor.
STL1.SaveToStream(FileStream2); <<<< (SaveToStream) das hab ich wohl überlesen.
  Mit Zitat antworten Zitat
davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: stringlist zu filestream , filestream zu datei

  Alt 2. Jan 2018, 21:57
Ich komme auch nicht so ganz hinterher, aber ich glaube es ist Folgendes:

Du hast eine TMemIniFile und siehst (zu Recht!) nicht ein, weshalb man hier an Speicherung auf der Festplatte gebunden sein sollte. Du möchtest die ini-Daten in einen TStream packen. Da TMemIniFile hier leider nichts anbietet bleibt nur der Umweg über die Methoden GetStrings(..) und SetStrings(..).

Richtig verstanden?
weshalb man hier an Speicherung auf der Festplatte gebunden sein sollte. <<< das hatte ich bei meiner Erkundung dieser Zeilen auch im Hinterkopf. Weiss aber noch nicht wozu ich es bräuchte. Ab grossen Daten mag das Sinn ergeben um eine permanente Schreibrate zu senken. bspw.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#6

AW: stringlist zu filestream , filestream zu datei

  Alt 3. Jan 2018, 06:33
Wenn du IniFile als Steam ausgeben möchtest schau doch mal was MemIniFile selber macht.
Intern arbeitet das schon mit Stringlists, gibt diese aber nicht 1:1 nach aussen:

Delphi-Quellcode:
procedure TMemIniFile.GetStrings(const List: TStrings);
var
  I: Integer;
begin
  List.BeginUpdate;
  try
    for I := 0 to FSections.Count - 1 do
    begin
      List.Add('[' + FSections[I] + ']');
      List.AddStrings(TStrings(FSections.Objects[I]));
      List.Add('');
    end;
  finally
    List.EndUpdate;
  end;
end;

procedure TMemIniFile.UpdateFile;
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    GetStrings(List);
    List.SaveToFile(FFileName, FEncoding); // Hier könntest du auch List.SaveToStream benutzen
  finally
    List.Free;
  end;
  Modified := False;
end;
Rollo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#7

AW: stringlist zu filestream , filestream zu datei

  Alt 3. Jan 2018, 11:15
Es würde also ein Nachfahre von TMemIniFile ausreichen, der eine zusätzliche Methode für's Speichern bekommt. Ungefähr sowas:
Delphi-Quellcode:
Type
  TMyMemIniFile = class(TMemIniFile)
    FFileStream : TFileStream;
  private
    procedure LoadValues; override;
  public
    constructor Create(st : TFileStream); override;
    procedure UpdateSream;
  end;

constructor TCustomIniFile.Create(st : TFileStream);
begin
  FFileStream := st;
end;

procedure TMyMemIniFile.UpdateStream;
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    GetStrings(List);
    List.SaveToStream(FFileStream, FEncoding);
  finally
    List.Free;
  end;
  Modified := False;
end;

procedure TMyMemIniFile.LoadValues;
var
  List: TStringList;
begin
  if Assigned(fFileStream) then
  begin
    List := TStringList.Create;
    try
      List.LoadFromStream(fFileStream);
      SetStrings(List);
    finally
      List.Free;
    end;
  end
  else
    Clear;
end;
Ungetest hingedaddelt. Und ggfls. muss man mal schauen, was sonst noch so angepasst werden muss.

Eine ggfls. erwünschte Verschlüsselung bzw. Entschlüsselung ließe sich aber sicherlich dann direkt im LoadValue bzw. im UpdateStream mit einbauen.

Man könnte aber auch bei der bisherigen, dateibasierten, Variante bleiben und nur die Routinen überschreiben, die für das Laden bzw. Speichern der Datei verantwortlich sind. Damit wäre das Ganze für bestehende Implementierungen (weitgehend) transparent. Man muss halt dann nur dort, wie bisher sowas wie ini : TMemIniFile; ini := TMemInifile.Create('dateiname'); steht, aus TMemIniFile TMyMemIniFile machen. Der Rest der bisherigen Implementierungen dürfte von der Änderung unbelastet bleiben.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz