Avant toute utilisation d'un VST on doit faire :
NodeDataSize
avec la taille des données à afficher.OnGetText
pour pouvoir afficher le texte du Node.OnFreeNode
pour dire quoi faire quand on efface un Node.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…
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;
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)
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;
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;
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;