Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehlerhaftes Laden eines Records


HenryHux - Fr 15.02.13 18:01
Titel: Fehlerhaftes Laden eines Records
Hi,

nach längerer Zeit melde ich mich mal wieder mit einem Problem :wink:
Und zwar speichere ich diesen record

Delphi-Quelltext
1:
2:
3:
4:
5:
    TStatistics = record
      Values : Double;
      Series : array [0..3of TChartSeries;
      procedure Clear;
    end;

wie folgt ab :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var StatsFile : File of TStatistics;
[...]
  try
    AssignFile(StatsFile, ExtractFilePath(ParamStr(0)) + '\Stats' +
                                         IntToStr(Nr) + '.dat');
    ReWrite(StatsFile);
    Write(StatsFile, Statistics[Nr]);
  finally
    CloseFile(StatsFile);
  end;


und lade ihn dann später so :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var StatsFile : File of TStatistics;
begin
  try
    AssignFile(StatsFile, FilePath);
    Reset(StatsFile);
    Read(StatsFile, Stats);
  finally
    CloseFile(StatsFile);
  end;
end;


Das klappt auch, wenn ich das Programm starte, speichere und wieder lade.
Starte ich das Programm jedoch neu, kriege ich eine access violation.
Habe schon länger gesucht, aber nichts gefunden.
Kann mir jemand weiterhelfen?

Vielen Dank! :wink:


platzwart - Fr 15.02.13 18:06

Wie lautet die Fehlermeldung genau?


HenryHux - Fr 15.02.13 18:14


Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x004084dc: read of address 0x07241270'.
---------------------------
Break   Continue   Help   
---------------------------


Die Datei an sich lädt er, wenn ich auf das record zugreifen will, kommt diese Meldung


Keldorn - Fr 15.02.13 18:29

Hallo,

was ist Tchartseries? wirklich ein Diagramm oder Teile?
deine Datei wird dann ziemlich klein sein?

Du kannst keine Pointerdatentypen in typisierten Datein speichern, das geht nicht.

Gruß Frank


HenryHux - Fr 15.02.13 18:36

Vielen Dank für die Antwort!
In der Tat, Datein sind immer nur 48Byte groß.
TChatSeries besteht zudem nur aus XY Werten.
Wie könnte ich die denn abspeichern?

Lg


jaenicke - Fr 15.02.13 18:54

In typisierten Dateien kannst du nur Datentypen mit einer festen Größe speichern. Wenn deine TChartSeries ein dynamisches Array ist, musst du das Speichern selbst übernehmen, z.B. mit TStream bzw. TFileStream und ReadBuffer/WriteBuffer. Dann kannst du deinem Record (bzw. besser gleich einer Klasse) die Methoden LoadFromStream und SaveToStream und das noch einmal mit File statt Stream spendieren und darin die Werte lesen und schreiben.
Um die später in der Datei besser zu finden, bietet sich ein Inhaltsverzeichnis am Anfang der Datei an.

Oder du nimmst gleich eine richtige Datenbank.


Mr_Emre_D - Sa 16.02.13 07:35

Wie genau sind "Statistics" & "Stats" definiert?


HenryHux - Sa 16.02.13 13:53

Hi,

Danke für eure Hilfe, aber nachdem ich gestern lange vergeblich versucht habe, das record zu speichern, habe ich mich entschlossen, die einzelnen werte in einer Textdatei zu speichern, das ging dann um einiges leichter.
Stats und Statistics waren beide von Typ TStatistics, nur in verschiedenen Units.
Danke!

Lg