![]() |
stringlist zu filestream , filestream zu datei
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 ); |
AW: stringlist zu filestream , filestream zu datei
Ich würd's mal damit probieren:
Delphi-Quellcode:
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:
Oder irgendwie so ähnlich. Sinnvoll erscheint mir das momentan noch nicht, was genau hast Du vor?
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; |
AW: stringlist zu filestream , filestream zu datei
Ich komme auch nicht so ganz hinterher, aber ich glaube es ist Folgendes:
Du hast eine
Delphi-Quellcode:
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
TMemIniFile
Delphi-Quellcode:
packen. Da
TStream
Delphi-Quellcode:
hier leider nichts anbietet bleibt nur der Umweg über die Methoden
TMemIniFile
![]() ![]() Richtig verstanden? |
AW: stringlist zu filestream , filestream zu datei
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. |
AW: stringlist zu filestream , filestream zu datei
Zitat:
|
AW: stringlist zu filestream , filestream zu datei
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:
Rollo
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; |
AW: stringlist zu filestream , filestream zu datei
Es würde also ein Nachfahre von TMemIniFile ausreichen, der eine zusätzliche Methode für's Speichern bekommt. Ungefähr sowas:
Delphi-Quellcode:
Ungetest hingedaddelt. Und ggfls. muss man mal schauen, was sonst noch so angepasst werden muss.
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; 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
Delphi-Quellcode:
steht, aus TMemIniFile TMyMemIniFile machen. Der Rest der bisherigen Implementierungen dürfte von der Änderung unbelastet bleiben.
ini : TMemIniFile; ini := TMemInifile.Create('dateiname');
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz