Frage zum TTreeView

Ich arbeite mit dem Borland C++ Builder (also Delphi) und habe eine generelle Verständnisfrage zum Umgang mit dem TTreeView. Aus den Manuals habe ich bereits entnommen, wie Element eingefügt werden.

Im OnChange Ereignis erhalte ich nun einen Zeiger auf den auslösenden Knoten. Ich kann den Namen auslesen und es gibt sogar ein Data Feld. Mein Problem ist nun, wie bekomme ich heraus, auf welchem Ausgangsdatenobjekt dieser Knoten basiert? Mit dem Data Element gibt es Probleme, wenn verschiedenartige Datenobjekte verwenden werden. Gibt es vielleicht eine Mögichkeit, jedem Knoten bereits beim Erstellen eine Aktion mitzugeben?

Ich hoffe, jemand hat mein Kernproblem verstanden. Bei google finde ich nur allgemeine Tutorials und aktuell kann ich mir nicht vorstellen, dass bei der VCL die gesucht Funktionalität nicht enthalten ist …

Gruß Markus

Hallo Markus,

Wenn Du Deinen Nodes direkt Objekte mitgibst, empfiehlt es sich die als Typecast von TObject also als TObject(myObject) mitzugeben. Wichtig hierbei ist, dass Du bei Abruf wieder einen Typecast in den richtigen Typen vollziehst also TMeineKlasse(Node.Data)…
Es wäre hilfreich wenn Du mal ein paar Codeschnipsel posten würdest, aber bitte diese vom pre-Tag umschließen, damit er lesbar bleibt.

Gruß
Thorsten

Hallo Markus,

Wenn Du Deinen Nodes direkt Objekte mitgibst, empfiehlt es
sich die als Typecast von TObject also als TObject(myObject)
mitzugeben. Wichtig hierbei ist, dass Du bei Abruf wieder
einen Typecast in den richtigen Typen vollziehst also
TMeineKlasse(Node.Data)…
Es wäre hilfreich wenn Du mal ein paar Codeschnipsel posten
würdest, aber bitte diese vom pre-Tag umschließen, damit er
lesbar bleibt.

Der typecast ist mir klar, im C++ Builder ist der vorgegebene Typ ohnehin ein void* (also kein TObject). Bei mir ergeben sich folgende Fragen:

1.) Ich habe einen wirklich komplexen TTReeView initialisiert, d.h. es gibt zig Knoten. Mit dem Aufruf von Clear() ist die Ansicht wieder leer, meine mitgegeben Objecte existieren aber noch immer und bilden nun ein Speicherleck. Bislang merke ich mir alle Objekte in einer separaten Liste und führe zusammen mit dem Aufruf von Clear() ein „delete Object“ aus. (Laut Docu ist der direkte Zugriff auf die Elemente von Items per Index sehr langsam und sollte nicht verwendet werden)
Selbst bei direktem Zugriff auf items erscheint mir diese Vorgehensweise sehr aufwendig…

2.) In meinem Baum befinden sich verschiedenartige Objekte hinter den Knoten. Beim Erstellen kann ich jedes Object nach TObject (oder void*) casten, beim OnChange-Event erhalte ich dann aber nur den TObject-Pointer. In welches Zielobject soll ich TObject casten? Ich weiss nicht, was sich hinter dem Pointer verbirgt.

Gruß Markus

Hallo Markus,

zu 1.
Ja, das Problem hatte ich auch mal. Ich habe dann eine eigene Garbagecollection geschrieben, ähnlich Deinem Ansatz. Eventuell wäre es ja möglich auch nur die Liste zu pflegen und den Nodes als Data einfach den Index des Objektes innerhalb der Liste zu geben womit jeder Zugriff über die Liste passieren würde.

zu 2.
Möglichkeit a)

 if Item.Data is TForm then

Möglichkeit b)
Die Namenseigenschaft so verwenden, dass aus dem Prefix ersichtlich wird um welchen Typen es sich wirklich handelt. Also Buttons fangen mit btn an, Tables mit tbl und so… Über TObject(Node.Data).Name kämest Du dann sofort auf den dahinter liegenden Typen.

Gruß
Thorsten