====== 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]]