![]() |
Objekt in Datei 'speichern
Moin zusammen.
Ich hab ein Objekt welches in etwa so aussieht:
Delphi-Quellcode:
Nun möchte ich die Möglichkeit haben den Inhalt diese Objektes in eine Datei zu speichern. Solch eine Datei soll ein Objekt dann auch wieder laden können.
TTermine = record
Name : string; Zeit : TTime; end; TPerson = class(TObject) private FVorname : string; FNachname : string; FBild : TImage; FTermine : array of TTermine; protected public ... ... procedure SaveFahrer(ID: string); ... ... end; Ich möchte mir Quasi Datensätze speichern ohne eine Datenbank zu benutzen. Die einzige Idee die ich bis jetzt habe, ist die Strings und das Array of record irgendwie in eine ini Datei reinzufummeln und das Bild mit FBild.Picture.SaveToFile(ID + '.gfx'); zu speichern. Zwei Sachen gefallen mir an der Lösung nicht. Zum einen, dass ich dann zwei Dateien habe anstatt nur eine und zum anderen, dass strings etc. im Klartext abgespeichert sind. Ich möchte die Daten nich verschlüsseln oder so. Finde es aber nicht so gut wenn man sie so einfach mit einem Texteditor ändern kann. Wie kann man das speichen besser realisieren? Vielen Dank |
Re: Objekt in Datei 'speichern
Wie willst du Zeichenketten nicht im Klartext speichern ohne sie zu verschlüsseln? Des Weiteren würde ich wohl her XML-Dateien vorziehen.
|
Re: Objekt in Datei 'speichern
Speicher doch alles in einem FileStream?
und Picture bietet auch SaveToStream |
Re: Objekt in Datei 'speichern
Und in einem FileStream stehen die Zeichenkette nicht im Klartext?
|
Re: Objekt in Datei 'speichern
Klartext ist ihm doch egal ... man soll nur nicht einfach mit 'nem Texteditor was ändern können
bei XML müßte man verschlüsseln oder eine Prüfsumme mitspeichern |
Re: Objekt in Datei 'speichern
Zitat:
|
Re: Objekt in Datei 'speichern
Dann musst du vorher die Länge mit abspeichern.
|
Re: Objekt in Datei 'speichern
So, vielen Dank erstmal für die Hilfe. Meine Speicherroutine sieht jetzt so aus:
Delphi-Quellcode:
Ist das so korrekt? Kann man da irgendetwas besser lösen?
TTermine = record
Name : string; Zeit : TTime; end; TPerson = class(TObject) private FVorname : string; FNachname : string; FBild : TImage; FTermine : array of TTermine; protected public ... ... procedure SaveFahrer(ID: string); ... ... end; TFieldLength = record FVorname : Cardinal; FNachname : Cardinal; FBild : Cardinal; FTermine : Cardinal; end; procedure TPerson.SavePerson(ID: string); var FileStream : TFileStream; PicStream : TMemoryStream; TempString : string; FieldLength : TFieldLength; begin // Bilddaten packen PicStream := TMemoryStream.Create; FBild.Picture.Bitmap.SaveToStream(PicStream); // Strings packen TempString := FVorname + FNachname; FieldLength.FVorname := length(FVorname); FieldLength.FNachname := length(FNachname); FieldLength.FBild := PicStream.Size; FieldLength.FTermine := sizeof(FTermine) FileStream := TFileStream.Create(ID + '.dat', fmCreate); // LängenInfo schreiben FileStream.Write(FFieldLength, SizeOf(FFieldLength)); // Strings schreiben FileStream.Write(TempString , Length(TempString )); // Array schreiben FileStream.Write(FTermine, SizeOf(FTermine)); // Bilddatem schreiben FileStream.CopyFrom(PicStream, PicStream.Size); FreeAndNil(FileStream); end; Bei der Leseroutine habe ich auch noch Probleme. Denke dass das mit den Strings so funtioniert. Aber vielleicht kann man das auch noch eleganter machen. Bin für jeden Hinweis dankbar. Allerdings weiss ich nicht wie das Bild zurückladen kann und wie ich genau mein array of record handeln muss:
Delphi-Quellcode:
Bräuchte also noch etwas Hilfe :)
procedure TPerson.LoadPerson(ID: string);
var FileStream : TFileStream; PicStream : TMemoryStream; TempString : string; begin FileStream := TFileStream.Create(ID + '.dat', fmInput); // LängenInfo lesen FileStream.Read(FFieldLength, sizeof(FFieldLength)); FileStream.Position := FileStream.Position + sizeof(FFieldLength); // Strings lesen FileStream.Read(FVorname, length(FVorname)); FileStream.Position := FileStream.Position + FFieldLength.FVorname; FileStream.Read(FNachname, length(FNachname)); FileStream.Position := FileStream.Position + FFieldLength.FNachname; // Record lesen <- geht so schonmal nicht //FileStream.Read(FTermine, FTermine); //FileStream.Position := FileStream.Position + FFieldLengthFTermine; // Bilddaten lesen // ?????? FreeAndNil(FileStream); end; |
Re: Objekt in Datei 'speichern
Delphi-Quellcode:
Hallo Viktorii, die Dynamische Struct kannst du nicht als ganzes speichern.
// Array schreiben
FileStream.Write(FTermine, SizeOf(FTermine)); Alles durchiterieren und Size merken, oder maskieren und abspeichern. Tip, verwende wenn möglich keinen Dynamischen Speicher, dh, statt strings Array [0..256] of Char, usw. Hilft, da du dann alles im Memory laden und in einem Rutsch kopieren kannst. Bei records packed nicht vergessen.
Delphi-Quellcode:
lg. Astattype TTermine = packed record Name : array [0..255] of Char; Zeit : TTime; end; TPerson = class(TObject) public FVorname : array [0..255] of Char; FNachname : array [0..255] of Char; FBild : TImage; FTermine : array of TTermine; end; //-- Abspeichern .. var ms, PicStream: TMemoryStream; s, ss: string; Person: TPerson; cbPicStreamSize: integer; i: integer; begin ms := TMemoryStream.Create; ms.Seek(0, SizeOf(integer)); Person.FBild.Picture.Bitmap.SaveToStream(ms); cbPicStreamSize := ms.Size - SizeOf(integer); ms.Seek(0, 0); ms.Write(cbPicStreamSize, SizeOf(integer)); ms.Seek(0, ms.size); ms.Write(Person.FVorname, 256); ms.Write(Person.FNachname, 256); for i:= 0 to Length(Person.FTermine) - 1 do ms.Write(Person.FTermine[i], SizeOf(TTermine)); ms.savetofile('c:\out.dat'); end; |
Re: Objekt in Datei 'speichern
Zu dem generellen Problem Daten zu serialisieren und wieder zu laden:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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