Du benutzt den VST (meiner Meinung nach) recht .. ungewöhnlich
Ich schaue später daheim nochmal genauer drüber und poste ein paar Verbesserungsvorschläge.
Edit:
Also, ich bin immer sehr gut damit gefahren, wenn ich einen
einzigen Record-Typ für alle Nodes verwendet habe. Das ist auch die einzig valide Anwendungsweise. In deinem Falle hast du nur "Glück", dass deine Records alle gleich groß sind.
Wenn ich verschiedene Node Typen habe, mache ich das immer so:
Delphi-Quellcode:
type
TNodeType = (ntCustomer, ntBulding, ..);
PNodeData = ^TNodeData;
TNodeData = record
NodeType: TNodeType;
NodeObject: TObject;
end;
Deine Methode über das NodeLevel zu differenzieren geht natürlich auch.
Die
NodeDataSize
ist aber in jedem Falle immer
SizeOf(TNodeData)
für alle Nodes.
Bezüglich der Objektverwaltung sehe ich zwei Möglichkeiten:
- Du behälst die einzelnen Objekte in einer gemeinsamen Liste (jeweils eine für Kunden, Gebäude, etc) und gibst dem NodeData Record jeweils nur einen Zeiger auf das Objekt mit. Die Freigabe der Objekte erfolgt dann gemeinsam beim Freigeben der Liste (Achtung: Je nachdem musst du manuell iterieren und Free
aufrufen.
Diese Methode trennt ganz gut Daten von der Anzeige, allerdings hast du ein Problem, wenn zur Laufzeit dynamisch Einträge aus der Liste gelöscht oder hinzugefügt werden sollen, bzw. musst du dann doppelten Aufwand betreiben.
- Die zweite Möglichkeit wäre deshalb beim Hinzufügen der Nodes deine Objekte mit Create
zu konstruieren und den Zeiger wieder entsprechend zuzuweisen. Dann implementierst du noch das OnFreeNode
Event und rufst darin NodeData^.NodeObject.Free
auf.
Beim Löschen einer Node wird dann automatisch auch das Objekt freigegeben.