====== Actions de BASE ======
Avant toute utilisation d'un VST on doit faire :
* Définir les données a afficher.
* Initialiser le ''NodeDataSize'' avec la taille des données à afficher.
* Définir les Columns à afficher.
* Définir ''OnGetText'' pour pouvoir afficher le texte du Node.
* Définir ''OnFreeNode'' pour dire quoi faire quand on efface un Node.
===== 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(**T**TreeData) et **NON** SizeOf(**P**TreeData) \\
Sinon ça bug dans tous les sens...
===== Créer les colonnes à afficher =====
Avec le menu contextuel sur le VST, choisir ''Edit Columns...''
{{:prog:lazarus:components:tvirtualtreeview:columns.jpg|}}
Ensuite on définit ''TVirtualTree.Header.Options.hoVisible'' pour les afficher sur le VST (si vous voulez les afficher)
{{:prog:lazarus:components:tvirtualtreeview:col2.jpg|}}
===== 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 -> [[prog:lazarus:components:tvirtualtreeview:node_affichage]]
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 ======
* [[https://jlelong.developpez.com/articles/virtualtreeview/]]
* [[https://documentation.help/VirtualTreeview/$Main.html]]
* [[https://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus/fr]]