Ich versuche es mal direkt 'on the fly' - ohne den Code zu testen.
Irgendwie hast Du eine sehr umständliche, unschöne und ressourcenfressende Lade bzw. Speicherroutine geschrieben. Die Lösung ist denkbar einfach!
Zur Vereinfachung habe ich die Try...Finally Blöcke ausgelassen.
Zuerst die save_memos Prozedur:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TMainForm.Save_Memos; var s:string; fs:TFileStream len:integer; begin fs:=TFileStream.Create(IncludeTrailingBackSlash(ExtractFilePath(application.Exename))+'data\news.fk',fmCreate); // ein direkter Bezug wie Du ihn benutzt funktioniert nur begrenzt. Änderst Du den aktuellen Pfad Deiner Anwendung z.B. über chDir landest Du in einem anderen Ordner!!
s:=ueberw_memo.text; //memo.text enthält den kompletten Memotext inkl. Zeilenumbrüche len:=length(s); fs.Write(len, SizeOf(len)); //Längeninformationen für das erste Memo speichern - wird zum Laden benötigt if len>0 then //Nur Speichern wenn Memo nicht leer fs.Write(s[1], Len); //schreibe ab Position s[1] len Zeichen in den Stream
s:=kauf_memo.text; //memo.text enthält den kompletten Memotext inkl. Zeilenumbrüche len:=length(s); fs.Write(len, SizeOf(len)); //Längeninformationen für das zweite Memo speichern - wird zum Laden benötigt if len>0 then //Nur Speichern wenn Memo nicht leer fs.Write(s[1], Len); //schreibe ab Position s[1] len Zeichen in den Stream s:=verkauf_memo.text; //memo.text enthält den kompletten Memotext inkl. Zeilenumbrüche len:=length(s); fs.Write(len, SizeOf(len)); [i]//Längeninformationen für das dritte Memo speichern - wird zum Laden benötigt[/i] if len>0 then //Nur Speichern wenn Memo nicht leer fs.Write(s[1], Len); //schreibe ab Position s[1] len Zeichen in den Stream fs.Free; end; |
Das Laden funktioniert ähnlich:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TMainForm.Load_Memos; var s:string; fs:TFileStream len:integer; begin fs:=TFileStream.Create(IncludeTrailingBackSlash(ExtractFilePath(application.Exename))+'data\news.fk', fmOpenRead); // ein direkter Bezug wie Du ihn benutzt funktioniert nur begrenzt. Änderst Du den aktuellen Pfad Deiner Anwendung z.B. über chDir landest Du in einem anderen Ordner!!
fs.Read(len, SizeOf(Len)); //Länge des ersten Memofeldes lesen SetLength(s, Len); //Die Länge von S anpassen - wichtig, da wir gleich direkt auf die Speicherzellen zugreifen if Len>0 then //Bedingung ist hier wichtig, da fs.read(beliebigeVariable, 0); eine Exception wirft!!! fs.Read(s[1], Len); //schreibe an die Speicherzelle des ersten Zeichens von s den Inhalt des ersten, gespeicherten Memofeldes ueberw_memo.text:=s; //Memoinhalt ersetzen
fs.Read(len, SizeOf(Len)); //Länge des zweiten Memofeldes lesen SetLength(s, Len); //Die Länge von S anpassen - wichtig, da wir gleich direkt auf die Speicherzellen zugreifen if Len>0 then //Bedingung ist hier wichtig, da fs.read(beliebigeVariable, 0); eine Exception wirft!!! fs.Read(s[1], Len); //schreibe an die Speicherzelle des ersten Zeichens von s den Inhalt des zweiten, gespeicherten Memofeldes kauf_memo.text:=s; //Memoinhalt ersetzen
fs.Read(len, SizeOf(Len)); //Länge des dritten Memofeldes lesen SetLength(s, Len); //Die Länge von S anpassen - wichtig, da wir gleich direkt auf die Speicherzellen zugreifen if Len>0 then //Bedingung ist hier wichtig, da fs.read(beliebigeVariable, 0); eine Exception wirft!!! fs.Read(s[1], Len); //schreibe an die Speicherzelle des ersten Zeichens von s den Inhalt des dritten, gespeicherten Memofeldes verkauf_memo.text:=s; //Memoinhalt ersetzen
fs.Free; end; |
Was lernen wir daraus?
Wenn wir statische Variablen speichern wollen (also Felder mit fester Größe, wie Char, Integertypen, booleische Felder, Mengen, Records mit fester Größe, etc) und die Position bekannt ist dann können wir direkt den Speicherinhalt ersetzen.
Strings, Stringlisten und andere dynamische Datentypen haben leider keine feste Größe. Deshalb müssen wir ersteinmal die Länge speichern, reservieren dann exakt soviel Speicher (bei Strings über Setlength) wie benötigt, damit dann im letzten Schritt unsere Daten endlich einlesen können - genau die Anzahl Bytes wie wir in dem Größenfeld gespeichert haben, natürlich nur, falls ungleich 0
MfG
GPF