Nochmal als Erklärung, falls dir nicht klar ist, warum das nicht so geht: In dem Record wird lediglich ein Zeiger auf einen bestimmten Speicherbereich gespeichert (wie schon gesagt), der die Bitmap enthält. Nun ja, und wenn du den speicherst, dann speicherst du dessen 4 Byte, nicht aber den Inhalt der Bitmap.
Die einzige gespeicherte Information ist also, wo im Speicher sich die Bitmap befunden hat.
Das gilt auch für die Strings.<
Wie es geht?
Indem du dir eine eigene Prozedur schreibst, die das Speichern des Records in Einzelteilen übernimmt (und eine entsprechende Laderoutine).
Diese Prozedur speichert zunächst mit SaveToStream die Bitmap in einen MemoryStream. Dann nimmt sie einen FileStream und speichert zunächst eine Integer-Variable mit der Größe dieses MemoryStreams hinein, danach wird der Inhalt des MemoryStreams mit CopyFrom hineingeholt. (Nicht vergessen vorher die Position im MemoryStream auf 0 zu setzen!)
So, und jetzt nich die beiden Strings hinterherspeichern mit folgender Routine (die zum Laden ist auch gleich dabei):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function LoadStringFromStream(Stream: TStream): String; var Size: Integer; begin try Stream.ReadBuffer(Size, SizeOf(Size)); SetString(Result, nil, Size); Stream.Read(Pointer(Result)^, Size); except Result := ''; end; end;
procedure SaveStringToStream(S: String; Stream: TStream); var Size: Integer; begin Size := Length(S); Stream.WriteBuffer(Size, SizeOf(Size)); Stream.WriteBuffer(Pointer(S)^, Size); end; |
Beim Laden muss das ganze umgekehrt gemacht werden.
Zu erst aus dem mit fmOpenRead geöffneten FileStream die Größe der gespeicherten Bitmap als Integer-Variable auslesen, dann soviele Bytes in einen MemoryStream kopieren, dessen Position auf 0 setzen und dann die Daten aus dem MemoryStream mit LoadFromStream in die Bitmap laden.
Nun noch die beiden Strings laden, fertig.