![]() |
record abspeichern und wieder laden
Ich habe eine ziemlich großen record. (Enthält so um die 50 Variablen). Und von diesem record habe ich zu allem überfluss noch einen dynamischen array (der wird nie größer als 12). Jetzt will cih das ganze abspeichern und wieder laden. Ich habe mithilfe der Suchenfunktion bereits ein paar Ansätze gefunden, einen array zu speichern. Ich habe mal das daraus gemacht:
Delphi-Quellcode:
wenn save true ist, wird gespeichert, sont geladen. Planeten ist mein array (array of TPlanet) und Planet ist der genannte große record.
procedure TMainForm.SaveLoadFile(const FileName:TFileName; const save:Boolean);
var datei: TFileStream; begin datei :=TFileStream.Create(FileName, fmCreate); if save then datei.Write(Planeten, sizeof(Planeten)) else datei.Read(Planeten, sizeof(Planeten)); datei.Free; end; Das funzt allerdings nicht. Bzw. Die Datei wird gepsichert (danach existiert auch eine Datei, die komischerweise nur 4bytes groß ist, nur wenn ich die Datei laden will, passiert nichts. Es kommt auch keine Fehlermeldung. Ich habe schon ein paar Ideen, woran das liegen könnte: - beim readen ist die größe von TPlaneten je eigentlich nicht bekannt - vielleicht geht das mit dem array nicht aber keine Ahnunhg, wie ich das umgehen könnte. Bitte schreibt mir eure Ideen. Es muss auch nicht auf meinen Ansatz aufsetzten, schließlich ist das nur eine Idee. |
Re: record abspeichern und wieder laden
Hi,
der Code funktioniert, wenn Planeten ein record wäre - Jedoch ist es hier ein dynamischer Array! Du musst beim Speichern erst die Länge des Arrays abspeichern und dann schließlich jedes einzelne Element. Beim Laden musst du erst die Anzahl auslesen und dann nacheinander die Einträge. mfG mirage228 |
Re: record abspeichern und wieder laden
hmm, ok, ich habe den qt abgeändert:
Delphi-Quellcode:
Aber es funzt immernoch nicht. Die erstellte datei ist jetzt 488Bytes groß, aber beim klick auf Laden verändert sich nichts.
procedure TMainForm.SaveToFile(const FileName: TFileName);
var datei: TFileStream; i,len: integer; begin len :=length(Planeten); datei :=TFileStream.Create(FileName, fmCreate); datei.Write(len, sizeof(len)); for i :=0 to len-1 do datei.Write(Planeten[i], sizeof(Planeten[i])); datei.Free; end; procedure TMainForm.LoadFromFile(const FileName: TFileName); var len,i:integer; datei: TFileStream; begin datei :=TFileStream.Create(FileName, fmOpenRead); datei.Read(len, sizeof(len)); for i :=0 to len-1 do datei.Read(Planeten[i], sizeof(Planeten[i])); datei.Free; end; |
Re: record abspeichern und wieder laden
Hi,
Versuchs mal mit
Delphi-Quellcode:
Ansonsten: Hast du mal versucht, das Programm schrittweise auszuführen?
sizeof(TPlanet) // statt sizeof(Planeten[i])
// und sizeof(Integer) // statt sizeof(len) mfG mirage228 |
Re: record abspeichern und wieder laden
Noch ein paar Bugs gefixt. Aktueller stand:
Delphi-Quellcode:
auf den ersten Blick scheint alles zu funzen. Aber der record enthält einen einzigen String (alles andere ist integer oder byte) und mit diesem string klappt das nicht so wirklich.da kommen dann irgendwelche komischen zeichen bei raus...
procedure TMainForm.SaveToFile(const FileName: TFileName);
var datei: TFileStream; i,len: integer; begin len :=length(Planeten); //Länge des arrays datei :=TFileStream.Create(FileName, fmCreate); //datei "öffnen" datei.Write(len, sizeof(len)); //Länge des array abspeichern for i :=0 to len-1 do datei.Write(Planeten[i], sizeof(Planeten[i])); //Planeten abspeichern datei.Free; //Speicher freigebn end; procedure TMainForm.LoadFromFile(const FileName: TFileName); var len,i:integer; datei: TFileStream; begin datei :=TFileStream.Create(FileName, fmOpenRead); //Datei "öffnen" datei.Read(len, sizeof(len)); //länge des arays einlesen setlength(Planeten, len); //arraylänge einstellen for i :=0 to len-1 do datei.Read(Planeten[i], sizeof(Planeten[i])); //Planeten auslesen datei.Free; //speicher freigeben end; |
Re: record abspeichern und wieder laden
Hi,
wenn Du Deine Records so speichern möchtest, dann darfst du nicht den String benutzen, sondern musst ShortString oder String[<laenge>] verwenden! mfG mirage228 |
Re: record abspeichern und wieder laden
Zitat:
![]() Deine geposteten codes nützen dir auch nix, solange du deine record-definition nicht mit dazuschreibst. steht auch alles im genannten thread. Mfg Frank |
Re: record abspeichern und wieder laden
Problem gelöst: Länge des strings genau angegeben:
variable: string[30]; (für alle, die das nicht kennen und das gleich Prob haben: Der string kann jetzt max. 30 Zeichen lang werden) |
Re: record abspeichern und wieder laden
Zitat:
Zitat:
Zitat:
|
Re: record abspeichern und wieder laden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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 by Thomas Breitkreuz