Die TTreeView Delphi-Komponente zeigt eine hierarchische Liste von Elementbaumknoten an. Ein Knoten wird durch Knotentext und ein optionales Bild dargestellt. Jeder Knoten in einer Baumansicht ist eine Instanz einer TTreeNode-Klasse.
Während Sie die Baumansicht zur Entwurfszeit mit Elementen füllen können, verwenden Sie den TreeView-Elementeditor. In den meisten Fällen füllen Sie die Baumansicht zur Laufzeit, je nachdem, worum es in Ihrer Anwendung geht.
Im TreeView-Elementeditor werden nur eine Handvoll Informationen angezeigt, die Sie an einen Knoten "anhängen" können: Text und einige Bildindizes (für den normalen Status erweitert, ausgewählt und ähnlich)..
Im Wesentlichen ist die Strukturansichtskomponente einfach zu programmieren. Es gibt verschiedene Methoden, um dem Baum neue Knoten hinzuzufügen und deren Hierarchie festzulegen.
So fügen Sie der Strukturansicht 10 Knoten hinzu (mit dem Namen "TreeView1"). Beachten Sie, dass die Eigenschaft Items den Zugriff auf alle Knoten in der Struktur ermöglicht. Das AddChild fügt der Strukturansicht einen neuen Knoten hinzu. Der erste Parameter ist der übergeordnete Knoten (zum Aufbau der Hierarchie) und der zweite Parameter ist der Knotentext.
Das AddChild gibt den neu hinzugefügten TTreeNode zurück. Im obigen Codebeispiel werden alle 10 Knoten als Stammknoten hinzugefügt (haben keinen übergeordneten Knoten)..
In komplexeren Situationen möchten Sie, dass Ihre Knoten mehr Informationen enthalten - vorzugsweise mit einigen speziellen Werten (Eigenschaften), die für das von Ihnen entwickelte Projekt spezifisch sind.
Angenommen, Sie möchten Kundenauftragspositionsdaten aus Ihrer Datenbank anzeigen. Jeder Kunde kann mehr Bestellungen haben und jede Bestellung besteht aus mehr Artikeln. Dies ist eine hierarchische Beziehung, die in einer Baumansicht angezeigt werden kann:
In Ihrer Datenbank gäbe es mehr Informationen für jede Bestellung und für jeden Artikel. Die Baumansicht zeigt den (schreibgeschützten) aktuellen Status an - und Sie möchten Details pro Bestellung (oder sogar pro Artikel) für die ausgewählte Bestellung sehen.
Wenn der Benutzer den Knoten "Bestellung_1_1" auswählt, sollen die Bestelldetails (Gesamtsumme, Datum usw.) dem Benutzer angezeigt werden.
Sie können zu diesem Zeitpunkt die erforderlichen Daten aus der Datenbank abrufen, ABER Sie müssten den eindeutigen Bezeichner (sagen wir einen ganzzahligen Wert) der ausgewählten Reihenfolge kennen, um die richtigen Daten abzurufen.
Wir benötigen eine Möglichkeit, diesen Bestellbezeichner zusammen mit dem Knoten zu speichern, können jedoch die Text-Eigenschaft nicht verwenden. Der benutzerdefinierte Wert, den wir in jedem Knoten speichern müssen, ist eine Ganzzahl (nur ein Beispiel)..
In einer solchen Situation könnten Sie versucht sein, nach der Tag-Eigenschaft zu suchen (viele Delphi-Komponenten haben sie), aber die Tag-Eigenschaft wird von der TTreeNode-Klasse nicht verfügbar gemacht.
Mit der Data-Eigenschaft eines Baumknotens können Sie Ihre benutzerdefinierten Daten einem Baumknoten zuordnen. Daten sind Zeiger und können auf Objekte und Datensätze verweisen. Das Anzeigen von XML-Daten (RSS-Feeds) in einer Strukturansicht zeigt, wie eine Datensatztypvariable in der Data-Eigenschaft eines Strukturknotens gespeichert wird.
Viele Elementtypklassen machen die Data-Eigenschaft verfügbar, mit der Sie jedes Objekt zusammen mit dem Element speichern können. Ein Beispiel ist das TListItem einer TListView-Komponente. So fügen Sie der Data-Eigenschaft Objekte hinzu.
Wenn Sie die Data-Eigenschaft des TTreeNode nicht verwenden möchten, sondern Ihren eigenen TreeNode um einige Eigenschaften erweitern möchten, hat Delphi ebenfalls eine Lösung.
Sagen Sie, Sie wollen es können
So erweitern Sie den Standard-TTreeNode um einige eigene Eigenschaften:
Hier ist der vollständige Quellcode (TButton: "Button1" und TTreeView: "TreeView1" in einem Formular):
Dieses Mal wird die Data-Eigenschaft der TTreeNode-Klasse nicht verwendet. Stattdessen erweitern Sie die TTreeNode-Klasse auf Ihre eigene Version eines Baumknotens: TMyTreeNode.
Mit dem OnCreateNodeClass-Ereignis der Strukturansicht erstellen Sie einen Knoten Ihrer benutzerdefinierten Klasse anstelle der Standard-TTreenode-Klasse.