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…

Initialisation

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…

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.

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;

Déstruction du VST

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é.