Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi record abspeichern und wieder laden (https://www.delphipraxis.net/31519-record-abspeichern-und-wieder-laden.html)

yankee 10. Okt 2004 19:18


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:
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;
wenn save true ist, wird gespeichert, sont geladen. Planeten ist mein array (array of TPlanet) und Planet ist der genannte große record.
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.

mirage228 10. Okt 2004 19:22

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

yankee 10. Okt 2004 19:35

Re: record abspeichern und wieder laden
 
hmm, ok, ich habe den qt abgeändert:
Delphi-Quellcode:
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;
Aber es funzt immernoch nicht. Die erstellte datei ist jetzt 488Bytes groß, aber beim klick auf Laden verändert sich nichts.

mirage228 10. Okt 2004 19:40

Re: record abspeichern und wieder laden
 
Hi,

Versuchs mal mit
Delphi-Quellcode:
sizeof(TPlanet) // statt sizeof(Planeten[i])
// und
sizeof(Integer) // statt sizeof(len)
Ansonsten: Hast du mal versucht, das Programm schrittweise auszuführen?

mfG
mirage228

yankee 10. Okt 2004 19:59

Re: record abspeichern und wieder laden
 
Noch ein paar Bugs gefixt. Aktueller stand:
Delphi-Quellcode:
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;
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...

mirage228 10. Okt 2004 20:01

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

Keldorn 10. Okt 2004 20:01

Re: record abspeichern und wieder laden
 
Zitat:

Ich habe mithilfe der Suchenfunktion bereits ein paar Ansätze gefunden, einen array zu speichern.
muß ja eine unheimlich intensive suche gewesen sein :roll:
http://www.delphipraxis.net/internal...547&highlight=

Deine geposteten codes nützen dir auch nix, solange du deine record-definition nicht mit dazuschreibst. steht auch alles im genannten thread.

Mfg Frank

yankee 10. Okt 2004 20:03

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)

yankee 10. Okt 2004 20:07

Re: record abspeichern und wieder laden
 
Zitat:

Zitat von Keldorn
muß ja eine unheimlich intensive suche gewesen sein :roll:
http://www.delphipraxis.net/internal...547&highlight=

Oh, den muss ich irgendwie übersehen haben.
Zitat:

Zitat von Keldorn
Deine geposteten codes nützen dir auch nix, solange du deine record-definition nicht mit dazuschreibst. steht auch alles im genannten thread.

ich habe dir record-definition angegeben, les' dir dochmal meinen ersten Beitrag durch!
Zitat:

Zitat von yankee
Planeten ist mein array (array of TPlanet)


Keldorn 10. Okt 2004 20:13

Re: record abspeichern und wieder laden
 
Zitat:

Zitat von yankee
ich habe dir record-definition angegeben

ich meinte damit wie Planet mit deinen 50 Vars aussieht, aber das hat sich mit den Strings und shortstring erledigt ;)


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