Ceci est une ancienne révision du document !


Affichage d'un Node

Affichage d'un Noeud

Affichage du texte du 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;

Affichage des images/icones

On peut mettre deux images avant le texte du noeud.

  1. L'image “Normale”, dont le TImageList sera stocké dans la property images et la largeur définie dans la propety imagesWidth.
  2. L'image “State”, dont le TImageList sera stocké dans la property StateImages et la largeur définie dans la propety StateImagesWidth.

Lorsque le VST veux récupérer l'index de l'image à afficher, le paramètre Kind contient l'information du type d'image qu'il souhaite:

  • ikNormal : L'image “Normale”
  • ikSelected : L'image “Normale” quand la ligne est séléctionnée
  • ikState : L'image “State”
  • ikOverlay : …..

Le paramètre Column contient l'index de la colonne pour laquelle il veut l'ImageIndex.

procedure TFrameVSTDisks.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: boolean; var ImageIndex: integer);
var
   pData: PTreeData;
begin
   pData      := VST.GetNodeData(Node);
   ImageIndex := -1;
   case Column of
      C_COL_DEVICE: case Kind of
            ikState: ImageIndex  := -1;
            ikNormal,ikSelected: ImageIndex := pData^.Img;
         end;
      C_COL_SMART: case Kind of
            ikState: ImageIndex  := -1;
            ikNormal,ikSelected: ImageIndex := pData^.SmartImg;
         end;
   end;
end;

Modifications

BeginUpdate / EndUpdate

Lorsque l'on met a jour un VST, il est bon pour l'affichage et la rapidité d'entourer ces mises a jour par un BeginUpdate et un EndUpdate.

   VST.BeginUpdate;
   try
     ...
   finally
     VST.EndUpdate;
   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é.