Ceci est une ancienne révision du document !


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 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(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…

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

Vous pourriez laisser un commentaire si vous étiez connecté.