Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   VirtualStringTree Objekte speichern (https://www.delphipraxis.net/155891-virtualstringtree-objekte-speichern.html)

Berni68 11. Nov 2010 20:32

VirtualStringTree Objekte speichern
 
Hallo zusammen,

ich bastel gerade mit einem VST an einer Baumstruktur, in der verschiedene Objekte an Nodes angehängt sind. In etwa so:

Delphi-Quellcode:
type
  TKnotenTyp = (ktAll, ktEx);
type
  TDatObjAll = class(TObject) // <- gibt es hier einen besseren Vorfahr als TObject?? 
    private
      Zahl1: integer;
      String1: string;
      String2: string;
  end;
type
  TDatObjEx = class(TDatObjAll)
    private
      String3: string;
  end;
type
  PDat = ^TDat;
  TDat = record
    KnotenTyp: TKnotenTyp;
    FObject: TObject; // hier dann entweder TDatObjAll oder TDatObjEx
  end;
Klappt soweit auch ganz gut.
Die Frage ist nun, ob es was geeigneteres als TDatObjAll = class(TObject)
gibt, daß man beim Speichern und Lesen des Nodes von Datei
(Ereignisse:
Delphi-Quellcode:
   procedure VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
   procedure VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
)
Das ganze Objekt à la .SaveTostream bzw .LoadFromStream abhandeln kann.
Gibt es da eine geeignete Klasse?

Bummi 11. Nov 2010 21:09

AW: VirtualStringTree Objekte speichern
 
Ich denke den Streamreader/writer wirst Du selbst schreiben müssen, Du hast je keine Properties sondern Klassen, sonst könntest Du etwas in der Art machen:
http://delphi.about.com/od/windowssh...der-writer.htm

generic 12. Nov 2010 08:56

AW: VirtualStringTree Objekte speichern
 
Zitat:

Zitat von Berni68 (Beitrag 1061066)
Delphi-Quellcode:
type
  TKnotenTyp = (ktAll, ktEx);
[...]
type
  PDat = ^TDat;
  TDat = record
    KnotenTyp: TKnotenTyp;
    FObject: TObject; // hier dann entweder TDatObjAll oder TDatObjEx
  end;
Delphi-Quellcode:
   procedure VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
   procedure VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
)
Das ganze Objekt à la .SaveTostream bzw .LoadFromStream abhandeln kann.

Schau dir mal die Demos vom Stammtisch an. Dort ist das (glaube ich) gezeigt.

Ansonsten ist es in den Source von diesen Artikel zu finden:
  • Entwickler Magazin (Ausgabe: 03.08/14.04.2008) Artikel: Von Bäumen und Listen Teil 2 - Komponente VirtualStringTree im Detail
http://entwickler-magazin.de/zonen/m...e,254,p,0.html
Source Download

Den Record (TDAT, PDAT) mit Knotentyp kannst du weg lassen und direkt die Objekte einhängen (s.h. Demos).
Mit dem "is" Operator kannst du dann prüfen, um welches Objekttyp es sich handelt.
Durch die Vererbung aber nur bedingt notwendig.
Für die Serialisierung der Objekte bietet sich TPersistent als Vorfahre an.
In den OnLoad/OnSave kannst du das Object dann einfach Streamen (s.h. Beispiele).

Wenn du doch den Record verwenden willst:
Delphi-Quellcode:
 FObject: TObject;
Warum definierst du da nicht deinen Basistyp?
Dann brauchst du nicht zu casten.

Mit Record wird das Streaming schwieriger.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz