Table des matières

Actions de BASE

Avant toute utilisation d'un VST on doit faire :

Définition des données à affichée

Les TVirtualTrees contiennent un ensemble de Node (de type PVirtualNode).

Chaque Node contient un membre Data TVirtualNode.Data (Data: record end;)

Ce Data contient la donnée a gérer pour ce nœud.
En general la donnée est un record qui peut contenir n'importe quoi , par exemple…

TTreeData = record
      Text: String;
      URL: string[255];
      ImageIndex: integer;
   end;  
 
PTreeData = ^TTreeData;

On déclare aussi un type pointer vers TTreeData (PTreeData) qui nous sera utile plus tard…

Définir NodeDataSize

Il faut initialiser le TVirtualTree en lui disant la taille des noeuds grace a NodeDataSize

procedure TForm1.FormCreate(Sender: TObject);
begin
   VSTMain.NodeDataSize := SizeOf(TTreeData);
end;
Notez bien que c'est SizeOf(TTreeData) et NON SizeOf(PTreeData)
Sinon ça bug dans tous les sens…

Créer les colonnes à afficher

Avec le menu contextuel sur le VST, choisir Edit Columns…

Ensuite on définit TVirtualTree.Header.Options.hoVisible pour les afficher sur le VST (si vous voulez les afficher)

Ajout d'un Noeud

Pour ajouter un noeud :

procedure TForm1.FormCreate(Sender: TObject);
var
   pNode: PVirtualNode;
   pData: PTreeData;
begin
   VSTMain.BeginUpdate;
 
   pNode := VSTMain.AddChild(nil);
   pData := VSTMain.GetNodeData(pNode);
   pData^.Text := 'root';
 
   VSTMain.EndUpdate;
 
end;

OnGetText : Affichage d'un Noeud

Lors du dessin du composant, le TVirtualTree se sert de l'evenement OnGetText pour recuperer le texte a afficher.

Plus d'infos sur l'affichage → Affichage d'un Node

procedure TForm1.VSTMainGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
   Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
var
   pData: PTreeData;
begin
   pData := VST.GetNodeData(Node);
   case Column of
      0: CellText:= IntToStr(pData^.id);
      1: CellText:= IntToStr(pData^.Flags);
      2: CellText:= IntToStr(pData^.Current);
      3: CellText:= IntToStr(pData^.Worst);
   end;
end;

OnFreeNode

J'ai eu un pb de MemoryLeak avec un VST que j'ai résolu de la façon suivante
procedure TForm1.VSTMainFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
   Data: PTreeData;
begin
   Data := VSTMain.GetNodeData(Node);
   Finalize(Data^);
end;

On en parle ici :https://www.remkoweijnen.nl/blog/2010/06/09/memory-leaks-when-using-virtual-treeview-component/

Plus d'infos sur Finalize() : https://www.freepascal.org/docs-html/rtl/system/finalize.html

On voit aussi…

procedure TForm1.VSTMainFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
   Data: PTreeData;
begin
   Data := VSTMain.GetNodeData(Node);
   Data^.Text:='';
   Data^.URL:='';
end;

Sources et Ressources