Home » Tutorials » Third-Party-Komponenten » VirtualTreeView

VirtualTreeView

Weitere Befehle

In einem Tutorial kann man natürlich nicht sämtliche Funktionen der VirtualTreeView besprechen. In diesem Kapitel erkläre ich aber kurz die wichtigsten und gebräuchlichsten Funktionen und Methoden. Umsteiger, die vorher das Standard TreeView-Control benutzt haben, werden schnell merken, dass viele Befehle des TTreeNode-Objekts auch in den VirtualTrees zur Verfügung stehen. Die Methoden sind allerdings nicht im Repertoire der einzelnen Nodes vorhanden, sondern finden sich als Methoden im Tree wieder.

Selektierter Node

Dieser Befehl kam schon einige Male in diesem Tutorial vor.

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

Die entscheidende Methode ist FocusedNode des Trees. Da dies im generellen OnClick-Ereignis des Baums steht, kann es natürlich sein, dass der Anwender auf eine Stelle klickt, wo sich kein Knoten befindet. Damit es nicht zum Crash kommt folgt sofort eine IF-Abfrage. Die Procedure wird abgebrochen, wenn kein Node ausgewählt wurde.

Ebene (Level) eines Nodes ermitteln

Die Funktion GetNodeLevel liefert als Result die Ebene eines Nodes zurück. Die oberste Ebene ist dabei 0. Als Parameter muss der Node vom Typ PVirtualNode übergeben werden:

VST.GetNodeLevel(Node);

Node löschen

Bisher haben wir Nodes immer nur hinzugefügt. Irgendwann möchte man bestimmt auch mal Nodes löschen. Dies geschieht mit der Methode DeleteNode, die als Parameter den Node vom Typ PVirtualNode erwartet.

VST.DeleteNode(Node);

Alle Children eines Nodes löschen

Gegeben ist folgender Baum:

Node1
 |
 |__Node2
 |  |
 |  |__Node3
 |  |  |
 |  |  |__Node4
 |  |
 |  |__Node5
 |
 |__Node6
Node7
|
|__Node8
| |
| |__Node9
|
|__Node10

Nun möchte man alle Children von Node2 löschen. Von der Löschaktion betroffen wären Node3, Node4 und Node5. So löscht man die Nodes:

VST.DeleteChildren(Node);

Node ist wiederum vom Typ PVirtualNode und muss auf Node2 zeigen.

Position eines Nodes

Die Methode AbsoluteIndex gibt den Index eine Nodes zurück. Die Nodes sind quasi von oben bis unten durchnummeriert. Besonders gut, sieht man die Funktionsweise von AbsoluteIndex, wenn man folgendes Beispiel ausprobiert:

procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
 Column: Integer; TextType: TVSTTextType; var Text: WideString);
begin
  Text := IntToStr(VST.AbsoluteIndex(Node));
end;

Füge einfach eine Struktur bei AddChild usw. hinzu und schreibe die obigen Zeilen ins OnGetText-Ereignis. Die Methode AbsoluteIndex erwartet als Parameter einen Node vom Typ PVirtualNode.

Alle Knoten ausklappen/einklappen

TVirtualTreeView liefert direkt zwei Methoden mit, um dieses Problem zu lösen. Füge dazu wieder einige Knoten hinzu.

VST.FullExpand;

Die Methode FullExpand klappt sämtliche Knoten aus. Vor dem eigentlichen Expandieren-Vorgang wird für jeden Knoten das Ereignis OnExpanding ausgelöst, in dem man über den Parameter Allowed festlegen kann, ob dieser Knoten expandiert werden darf. Darauf folgt das Ereignis OnExpanded.

VST.FullCollapse;

Die Methode FullCollapse klappt sämtliche Knoten wieder ein. Auch werden hier die Ereignisse OnCollapsing (vorher) und OnCollapsed (nachher) ausgelöst für jeden Knoten ausgelöst.

Bestimmte Nodes ausklappen/einklappen

Mit Hilfe der Eigenschaft Expanded des Trees kann man bestimmte Knoten aus/einklappen.

VST.Expanded[Node]:=True;

In den eckigen Klammern steht eine Variable vom Typ PVirtualNode. Wird diese Eigenschaft auf True gesetzt, werden die Nodes ausgeklappt, steht sie auf False passiert genau das Gegenteil. Auch hier greifen wieder die o.g. Ereignisse bezgl. des Expandieren und Collapsieren.

Besitzt ein Knoten untergeordnete Children?

Mit Hilfe der Eigenschaft HasChildren des Trees, lässt sich ermitteln, ob ein Node Children hat oder nicht.

if VST.HasChildren[Node] then 
 Close;

In den eckigen Klammern steht wieder eine Variable vom Typ PVirtualNode. Steht diese Eigenschaft auf True, besitzt sie Kinder, ansonsten hat sie den Wert False.

Alle Nodes löschen

Dies geht mit der Methode Clear:

VST.Clear;

Um den Löschvorgang zu beschleunigen sollte das Neuzeichnen des Controls mittels VST.BeginUpdate deaktiviert und später mit VST.EndUpdate wieder aktiviert werden.

Übergeordnete Knoten ermitteln

Jeder Node (PVirtualNode) besitzt die Eigenschaft Parent. Diese Eigenschaft zeigt auf den übergeordneten Node. Die Eigenschaft Parent eines Root-Knotens zeigt auf den Baum selber. Um von einem Knoten den Rootknoten ermitteln zu können kann man folgendermaßen vorgehen:

var
 Node: PVirtualNode;
begin
  if not Assigned(vst.FocusedNode) then
    exit;
  Node := vst.FocusedNode;
  while vst.GetNodeLevel(Node) > 0 do
    Node:=Node.Parent;
end;Nodes mit unterschiedlicher Höhe
Über die Array-Eigenschaft 'NodeHeight' stellen Sie die Höhe eines jeden Nodes ein. der betreffende Node muss als Index übergeben werden. In diesem Beispiel wird die Höhe in dem Ereignis OnInitNode gesetzt.
procedure TMainForm.vstInitNode(Sender: TBaseVirtualTree;
 ParentNode, Node: PVirtualNode;
 var InitialStates: TVirtualNodeInitStates);
begin
  vst.NodeHeight[Node]:=Random(10)+15;
end;

Der Record Node enthält zwar eine Variable namens NodeHeight. Setzen Sie die Höhe aber nicht über diese Variable, sondern nutzen Sie die dafür vorgesehenen Funktionen.

Objekt-Hierachie

Die einzelnen Klassen des Baums haben folgendes hierarchischen Aufbau:

  • TCustomControl
    • TBaseVirtualTree
      • TCustomVirtualDrawTree
        • TVirtualDrawTree
      • TCustomVirtualStringTree
        • TVirtualStringTree

In der Regel ist der Sender-Parameter der Event-Handler vom Typ TBaseVirtualTree. Die gleichen Handler können daher für die normale TVirtualStringTree und für die TVirtualDrawTree verwendet werden.