AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

record abspeichern und wieder laden

Ein Thema von yankee · begonnen am 10. Okt 2004 · letzter Beitrag vom 10. Okt 2004
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

record abspeichern und wieder laden

  Alt 10. Okt 2004, 18:18
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.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 18:22
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#3

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 18:35
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.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 18:40
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 18:59
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...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 19:01
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 19:01
Zitat:
Ich habe mithilfe der Suchenfunktion bereits ein paar Ansätze gefunden, einen array zu speichern.
muß ja eine unheimlich intensive suche gewesen sein
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#8

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 19:03
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)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#9

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 19:07
Zitat von Keldorn:
muß ja eine unheimlich intensive suche gewesen sein
http://www.delphipraxis.net/internal...547&highlight=
Oh, den muss ich irgendwie übersehen haben.
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 von yankee:
Planeten ist mein array (array of TPlanet)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

Re: record abspeichern und wieder laden

  Alt 10. Okt 2004, 19:13
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz