![]() |
Fehler beim Laden von Array of record aus Datei
Ich habe folgendes Problem:
Ich speicher ein Array of record in einer Datei. Wenn ich diese Datei nun lade dann steht nicht mehr das im Array was dort vorher stand. :gruebel: Hier ist der Code:
Delphi-Quellcode:
Ich hoffe ihr könnt mir helfen. Danke.var Feld :array [1 .. 1000] of TFeld ; // TFeld ist ein record Procedure Speichern; var fs:TFileStream; begin if SaveDialog1.Execute then begin fs:=TFileStream.create(SaveDialog1.FileName,fmCreate); try fs.write(feld,sizeOf(feld)); finally fs.free; end; end; end; Procedure Laden: var fs:TFileStream; begin if openDialog1.Execute then begin if fileExists(openDialog1.FileName) then begin fs := TFileStream.create(openDialog1.FileName,fmOpenread); try if fs.size >= sizeOf(feld) then fs.read(feld,sizeOf(feld)); finally fs.free; end; end else showMessage('foobar not da'); end; end; |
Re: Fehler beim Laden von Array of record aus Datei
Hallo Michael,
kann es sein, dass Du in TFeld Datentypen verwendest, die auf Referenzen beruhen (zB TObject, TButton, Pointer aber auch string)? Dann fällt mir nur noch auf, dass an dieser Stelle
Delphi-Quellcode:
afeld dem Leser nicht bekannt ist. Sollte
fs.write(feld,sizeOf(afeld));
Code:
gelten, ist das ebenfalls ein Problem.
SizeOf(afeld)<SizeOf(feld)
|
Re: Fehler beim Laden von Array of record aus Datei
Mit dem AFeld habe ich mich verschrieben das muss natürlich Feld heißen.
TFeld besteht aus Strings und Integer! |
Re: Fehler beim Laden von Array of record aus Datei
Danke an choose und alle anderen die sich gedanken gemacht haben.
Ich habe den Fehler gefunden und mein Problem ist gelöst. |
Re: Fehler beim Laden von Array of record aus Datei
die zeilen kommen mir bekannt vor :-D
Zitat:
Delphi-Quellcode:
..denn diese records brauchen eine feste länge, was dynamische strings naturgemäss nicht haben!
text:string[128];
cu. |
Re: Fehler beim Laden von Array of record aus Datei
Zitat:
Zitat:
Delphi-Quellcode:
wird diese Struktur lediglich
type
TFeld = record AnInt: Integer; AString: string; AnotherInt: Integer; AnotherString: string; end;
Delphi-Quellcode:
16 Bytes beanspruchen, obgleich Du vielleicht Strings der Länge 300 "in" ihnen ablegen wirst. Die Stringdaten selbst liegen, wie der OH zu entnehmen ist, auf dem Heap und nicht innerhalb dieser Struktur!
SizeOf(Integer)+SizeOf(string)+SizeOf(Integer)+SizeOf(string)
= 4 4 4 4 Solltest Du eine solche Struktur mit TStream.Write in einen Strom schreiben, werden tatsächlich nur die Daten innerhalb der Struktur, also, im Falle der Strings, Referenzen auf Speicherbereiche auf dem Heap geschrieben. Zu den AnsiStrings schreibt die OH weiter Zitat:
Wenn die "Logik von Delphi" entscheidet, dass die Daten nicht länger benötigt werden, und Du ein Exemplar von TFeld aus der Datei lädst, können die Referenzen auf Bereiche zeigen, die inzwischen nicht länger gültig sind. Aus diesem Grund sollten Deine Strings "komische Werte" aufweisen, während die Integers korrekt abgelegt und wieder geladen worden sind. Eine kleine Anmerkung: Durch das Laden von Referenzen über direkten Speicherzugriff (zB TStream.Write) wird das Prinzip der Referenzzählung untergraben, so dass (möglicherweise erst zu einem späteren Zeitpunkt) Probleme bei der Verwendung von Strings auftreten können, obwohl die geschriebenen Referenzen auf gültige Bereiche auf dem Heap verweisen. |
Re: Fehler beim Laden von Array of record aus Datei
@ maximov:
Dies ist mir nach der Antwort von choose auch eingefallen. :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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