Instanzvariablen meinen auch normale Datentypen, nur da die regelmäßig nicht von TPersistent abgeleitet sind, muß für solche Typen Objektintern die Parameterspeicherung gesondert vereinbart werden. Aber grundsätzlich sind auch die speicherbar.
#Edit
Code: Alles auswählen
procedure TMyObject.SaveToStream(Strm: TStream);
begin
if (Strm <> nil) then begin
Strm.Write(FMyVar, SizeOf(FMyVar));
Strm.Write(FMyNextVar, SizeOf(FMyNextVar));
end;
end;
procedure TMyObject.ReadFromStream(Strm: TStream);
begin
if (Strm <> nil) and (Strm.Size - Strm.Pos >= SizeOf(FMyVar) + SizeOf(FMyNextVar)) then begin
Strm.Read(FMyVar, SizeOf(FMyVar);
Strm.Read(FMyNextVar, SizeOf(FMyNextVar));
end;
end;
Der Datentyp muß im Beispiel nicht angegeben werden, weil die jeweilige Variable einfach als Folge von Bytes gespeichert wird. Allerdings ist die Reihenfolge genau einzuhalten. Strings sind allerdings gesondert zu behandeln. Hier muß zunächst die Länge gespeichert werden und dann über eine Hilfsvariable einzulesen. Etwa so:
Code: Alles auswählen
procedure TMyObject.SaveToStream(Strm: TStream);
begin
if (Strm <> nil) then begin
Strm.Write(FMyVar, SizeOf(FMyVar));
Strm.Write(FMyStr[0], SizeOf(integer));
Strm.Write(FMyStr[1], length(FMyStr);
end;
end;
procedure TMyObject.ReadFromStream(Strm: TStream);
var
len: integer;
str: string;
begin
if (Strm <> nil) and (Strm.Size - Strm.Pos > 0) then begin
Strm.Read(FMyVar, SizeOf(FMyVar));
Strm.Read(len, SizeOf(len));
SetLength(s, len);
Strm.Read(s[1], len);
FMyStr:= s;
{auch erlaubt
SetLength(FMyStr, len);
Strm.Read(FMyStr[1], len));
}
end;
end;
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)