Home » Tutorials » Third-Party-Komponenten » VirtualTreeView

VirtualTreeView

Der erste Knoten

Die einzelnen Knoten werden auch Nodes genannt. Die erste Ebene eines Baumes ist die Root-Ebene (engl. Wurzel). Einzelne Unterpunkte werden auch Child genannt.

Einen neuen Knoten kann man Beispielsweise ganz einfach so erzeugen:

procedure TForm1.Button1Click(Sender: TObject);
begin
  VST.AddChild(nil);
end;

Der Methode wird in diesem Falle der Parameter nil übergeben, d.h. dass dieser Knoten ein Ursprungsknoten ist. Hier muss sonst nämlich der übergeordnete Knoten übergeben werden. Dort wird der neue Knoten dann drangehangen.

Jetzt erzeugen wir einen neuen Knoten, an dem selbst wieder ein neuer Knoten dranhängt.

procedure TForm1.Button1Click(Sender: TObject);
var
  Node: PVirtualNode;
begin
  Node:=VST.AddChild(nil);
  VST.AddChild(Node);
end;

Das Ganze sollte nach einmaligen Aufrufen in etwa so aussehen:

Erläuterungen:

Node := VST.AddChild(nil);

Node ist zeigt nun auf den Ursprungsknoten. Diese Speicheradresse wird benötigt, damit man dem Knoten nachher noch ‚Kinder‘ hinzufügen kann. Dies geschieht, indem wir die Variable Node, der Funktion beim zweiten Aufruf als Parameter übergeben.

PVirtualNode ist dabei ein Zeiger auf den Record TVirtualNode, der einige Informationen zu dem aktuellen Node enthält.

Eine andere Möglichkeit, z.B. direkt 100 Ursprungsknoten zu erzeugen, ist die Eigenschaft RootNodeCount des Trees auf 100 zu setzen. Bisher haben alle Nodes die Caption ‚Node‘. Dies ist jetzt noch normal. Wie man dies ändert, werde ich später erklären.

Bei Klicks auf Nodes reagieren

Nun soll bei einem Klick auf einen Node eine entsprechende Aktion ausgeführt werden. Zuerst werden wir mal einige Nodes hinzufügen:

procedure TForm1.Button1Click(Sender: TObject);
var
  Node: PVirtualNode;
  I: Integer;
begin
  Node:=VST.AddChild(nil);
  for I:=1 to 100 do
    Node:=VST.AddChild(Node);
end;

In diesem Beispiel werden insgesamt 101 Nodes dem Baum hinzugefügt und zwar auf insgesamt 100 Ebenen. Wenn jetzt ein Node angeklickt wird soll das Programm ausgeben in welcher Ebene sich der Node befindet. Dazu schreiben wir ins OnClick-Ereignis des Baums Folgendes:

procedure TForm1.VSTClick(Sender: TObject);
var
  Node: PVirtualNode;
begin
  Node := VST.FocusedNode;
  if not Assigned(Node) then
    Exit;

Showmessage(IntToStr(VST.GetNodeLevel(Node)));
end;

Die Eigenschaft FocusedNode enthält einen Zeiger auf den momentan selektierten Node. Ist kein Knoten selektiert, steht die Eigenschaft auf nil. Die Methode GetNodeLevel des Trees gibt die Ebene des Nodes zurück. Als Parameter muss wieder ein Zeiger auf den Knoten übergeben werden, von dem die Ebenentiefe bestimmt werden soll.

Vorhin hast du ja gelernt, dass man ganz schnell durch das Setzen der Eigenschaft RootNodeCount die Anzahl der Ursprungsknoten hoch setzen kannst. Mit Hilfe der Eigenschaft ChildCount des Trees kann man auch die Anzahl der ‚Kinder‘ hoch setzen:

procedure TForm1.Button1Click(Sender: TObject);
var
  Node: PVirtualNode;
  I: Integer;
begin
  for I:=1 to 100 do
  begin
    Node := VST.AddChild(nil);
    VST.ChildCount[Node]:=10;
  end;
end;

In diesem Fall werden jedem der 100 Ursprungsknoten 10 ‚Kinder‘ zugewiesen. Bei dieser Art des Hinzufügens muss man allerdings bedenken, dass man nicht ohne weiteres die Möglichkeit hat, dem Kind ein Objekt zuzuweisen, ebenso wie beim Setzen der Eigenschaft RootNodeCount. Mehr dazu später…

Nodes an einer bestimmten Stelle hinzufügen

Mithilfe der Methode InsertNode ist es möglich einen Node genau im Baum zu positionieren. Die Methode erwartet zwei Parameter. Einmal die Adresse des Bezugnodes in Form von PVirtualNode und einem den Modus des Hinzufügen:

Node := vst.InsertNode(vst.FocusedNode, amInsertAfter);

In diesem Beispiel wird hinter dem fokussierten Node ein weitere Knoten angefügt. Würde der Parameter amInsertBefore lauten, würde der neue Knoten vor dem Bezugsnode gesetzt werden.