Moin Karsten,
Du versuchst ein Objekt vom Typ TDatenliste zu speichern, also inklusive aller Methoden, also nicht nur die Daten.
Das heisst, Du müsstest zum Speichern die Daten alleine bereitstellen.
SizeOf(TDatenListe) gibt übrigens vier zurück, da TDatenListe ein Objekt ist, und somit die Grösse die eines Pointers ist.
Warum TDaten bei Dir ein Objekt ist, und kein Record bzw. packed record, kann ich im Moment nicht nachvollziehen.
Dann könntest Du eine Variable vom Typ TDaten Schreiben, mit SizeOf(TDaten). Dass könnte dann grundsätzlich funktionieren, wobei der Typ String auch wieder ein Problem darstellt, da strings dynamische Arrays, und somit auch wieder Pointer sind. Die von Dir genannte Struktur wäre also, als packed record, 12 Byte gross.
Strings müsstest Du dann also entweder als ShortStrings einbauen (mit Längenangabe, aber nur maximal 255 Stellen), oder mittels einer Routine schreiben, die den Inhalt ausliest, und die Längen berücksichtigt.
Das Schreiben könnte z.B. so aussehen:
(hier nur die Änderungen, create usw. fehlt)
Delphi-Quellcode:
type
TDaten = packed record
dwLen1 : DWORD;
sValue : string;
//...
end;
var
tdWork : TDaten;
begin
// erst einmal die Länge merken
tdWork.dwLen1 := length(tdWork.sValue);
// Vier Byte schreiben, da ein DWORD 4 Byte gross ist
DatenStream.Write(tdWork.dwLen1,4);
// Nur den String schreiben, wenn er etwas enthält
if tdWork.dwLen1 > 0 then begin
// Den String ab der ersten Stelle schreiben
// Ohne [1] funktioniert es nicht, da dieser Parameter nicht typisiert ist
DatenStream.Write(tdWork.sValue[1],tdWork.dwLen1);
end;
end;
Die Längen solltest Du auf jeden Fall mit speichern (müssen allerdings nicht in TDaten enthalten sein), damit Du auch bei leeren Strings weisst was zu tun ist.
Wichtig: Beim Auslesen muss der auszulesende String vor dem Auslesen schon auf die richtige Länge bebracht werden, z.B. mit SetLength.
Was übrigens noch fehlt, ist der Resourcenschutzblock try/finally. Damit müsste sichergestellt werden, dass das Dateihandle auch wieder freigegeben wird.
Beispiel:
Delphi-Quellcode:
// Resource belegen
DatenStream := TFileStream.Create(....);
try
// Mach was mit DatenStream
finally
// Resource freigeben
FreeAndNil(DatenStream);
end;