[D4] Objekte in Streams

Hallo !

Ich könnte mal einen Tipp brauchen:
Ich möchte die Felder eine Liste unterschiedlicher Objekte in einem Stream speichern und daraus auch wieder laden. Beim Laden sollen die Objekte erzeugt werden. Wie bekomme ich’s am geschicktesten hin, daß der korrekte Typ des Objekts erkannt und erzeugt wird ? - Wegen der Möglichkeit der Weiterentwicklung muß der zu ladende Objekttyp nicht schon bekannt sein (wenn ein Programmierer neue, eigene Objekte in die Liste einfügt, sollen die gleich mit gespeichert und geladen werden können). Kann man da irgendwie mit „ClassInfo“ arbeiten oder sowas ?

Bin dankbar für jeden Tipp,

Jochen

Das ist vermutlich nicht mal so kompliziert wie’s klingt - mit dem IS-Operator kannst du feststellen um was es sich handelt.

if Sender is TEdit then

Wie aber speichere ich das ab ? Ich dachte an sowas in der Art:

speichern:

stream.write(Objects.count);
for i:=0 to Objects.count-1 do
with TStreamObj(Objects[i]) do
begin
stream.write(ClassType,SizeOf(Classtype));
WriteDataToStream(Stream);
end;

laden:

Stream.read(n);
for i:=0 to n-1 do begin
stream.read(aClassType,SizeOf(aClasstype));
Obj := aClassType.create;
Obj.readDataFromStream(Stream);
Objects.add(Obj);
end;

so… oder so ähnlich… ???

Gruß, Jochen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ganz so einfach, wird’s nicht gehen, weil ein Delphi-Objekt nur ein Zeiger auf irgendwas ist. In der Regel muss das Format der Daten bekannt sein, sonst kannst du mit einem binären Byte-Stream ja nicht viel anfangen. Du wirst wohl eine Liste der Felder und deren Typeninfos (bzw. grösse) speichern und das ganze in 3 Schritten bereitstellen.

  1. Stream lesen (welches OBJ)
  2. Objekt erzeugen
  3. Stream weiterlesen und Felder initialisieren

Ok. Danke.

Wenn man nun neue Objekte mit abspeichern will, muß man dem Typ ja irgendeine ID geben und die muß beim Auslesen wieder interpretiert werden. Das kann das Basis-Objekt natürlich nicht, also müssen die Schreib- und Lesemethoden eines jeden neuen abgeleiteten Objekttyps überschrieben werden. Ich hätte mir gewünscht, dieser Umstand sei umschiffbar… :frowning:

Dennoch: Danke !

Hi Jo,
Delphi hat für solche Fälle den TFiler dabei und arbeitet auch intern beim Abspeichern und Laden der Formulare damit.

Es gibt auch noch die Methoden „ObjectBinaryToText“ und „ObjectTextToBinary“, die ein Objekt in Text umwandeln und umgekehrt. Du erhältst dann so eine Datei wie beim Ansehen eines Formulars als Text (rechte Maustaste/Ansicht als Text). Das kannst Du dann locker abspeichern und lesen (auch in Textdatei oder Datenbank)…

Gruß Thomas

Hallo Thomas !

Das klingt interessant, nur habe ich damit noch 2 kleine Probleme:

a) ich dachte, das sei speziell für Komponenten und
b) ich werde aus der Online-Hilfe nicht schlau, sonst habe ich keine Dokumentation.

Gibt’s ein Buch, wo die Verwendung von TFiler, TReader und TWriter mal ordentlich + einfach + mit Beispielen erklärt sind ?

Danke auch & Gruß

Jochen

Hi Jo,
TFiler (TReader und TWriter) sind schon speziell für Komponenten gedacht, die beiden anderen Methoden müßten aber auch für alle Objekte funktionieren…selbst probiert habe ich es aber noch nicht.

Gruß Thomas

dann müssten die Methoden theoretisch in einem Buch zum Thema VCL-Komponentenentwicklung beschrieben sein :smile: