Moin Nickel,
dazu müsstest Du Dir mal den Aufbau der jeweiligen Datentypen zu Gemüte führen:
Name ist ein Pointer (4 Byte) auf den eigentlichen String (wo auch immer der stehen mag).
Wenn Du jetzt also schreibst:
fs.Write(Name,Length(Name));
wird nicht der String, sondern der Pointer auf den String, und alle Bytes dahinter in den Stream geschrieben bis Length(Name) erreicht ist.
Bei Strings und Streams geht es so:
Delphi-Quellcode:
var
sBuf : string;
dwLen : DWORD;
fs : TFileStream;
begin
// Schreiben
sBuf := 'Irgendwas';
dwLen := Length(sBuf);
fs := TFileStream.Create(....,....);
try
// Erst die Länge
fs.Write(dwLen,SizeOf(dwLen)); // Besser SizeOf als direkt 4, falls man den Typ ändert
// Dann den eigentlichen Inhalt
fs.Write(sBuf[1],dwLen);
finally
fs.Free;
end;
// Lesen
fs := TFileStream.Create(....,....);
try
// Erst die Länge
fs.Read(dwLen,SizeOf(dwLen));
// Jetzt muss erst mal der Lesebuffer initialisiert werden
sBuf := StringOfChar(#00,dwLen); // oder SetLength(sBuf,dwLen), aber dann ist der Speicher nicht initalisiert
fs.Read(sBuf[1],dwLen);
finally
fs.Free;
end;
end;
Solche Bestandteile wie QuestText (TStringList) oder Waren (TCollection) ist es ähnlich.
Auch das sind nur Pointer. Was Du das speicherst hat also nichts mit den Daten zu tun, die Du eigentlich Speichern willst.
Bei einer StringList ist das schon vorgesehen (Methode SaveToFile bzw. LoadFromFile), bei der Collection musst Du Dir das wohl selber zusammenbauen.