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 ?
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.
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…
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)…
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.