Table des matières

Parcourir les noeud d'un Virtual Tree View

Parcourir un méme niveau

Version courte
var
   Data: PTreeData;
   Node: PVirtualNode;
begin
      Node := VST.GetFirst;
      while Assigned(Node) do
      begin
         Data := VST.GetNodeData(Node);
        Node := VST.GetNextSibling(Node);
      end;
end;
version détaillée
var
   Data: PTreeData;
   Node: PVirtualNode;
begin
   VST.ClearSelection;
   if assigned(ATpl) then
   begin
      Node := VST.GetFirst;
      while Assigned(Node) do
      begin
         Data := VST.GetNodeData(Node);
         if Data^.Style=AValue then
         begin
            VST.Selected[Node]:=true;
            break;
	end else
	    Node := VST.GetNextSibling(Node);
      end;
   end;
end;

Parcourir tous les nœuds par Itération

Dans cet exemple on déclare un fonction VSTFindParentNode(AUID: TUniqId) qui doit retourner le Node ayant pour ID AUID.
Cette function utilise IterateSubtree du VST pour chercher le noeud.
La function appelé lors de cette itération est VSTIterationForFindParentNode.
Les données utiles pour la recherche et le résultat sont stockées dans un Record PIterationDataForFindParentNode transmis via le paramétre data: pointer de l'itération.

type
   TVSTMarkType = (vmtMarker, vmtGroup);
 
   TVSTMarkData = packed record
      Obj: TObject;
      Typ: TVSTMarkType;
      UID: TUniqID;
   end;
   PVSTMarkData = ^TVSTMarkData;
 
   TIterationDataForFindParentNode = packed record
      UIDToFind: TUniqID;
      Result:    PVirtualNode;
   end;
   PIterationDataForFindParentNode = ^TIterationDataForFindParentNode;
 
........................
 
procedure TFrameMarkersManager.VSTIterationForFindParentNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: boolean);
var
   pData: PVSTMarkData;
   pIterationData: PIterationDataForFindParentNode;
begin
   { On récupére les données a chercher, transmise via le pointer Data }
   pIterationData:=PIterationDataForFindParentNode(Data);
 
   pData:=Sender.GetNodeData(Node);
   { Si le Node est un Group et que l'UID est le bon... }
   if (pData^.Typ=vmtGroup) and (pData^.UID=pIterationData^.UIDToFind)
   then begin
      { On stock le résultat dans le Record transmis par le pointer Data }
      pIterationData^.Result:=Node;
      { On arrete la recherche }
      Abort:=true;
  end;
end;
 
function TFrameMarkersManager.VSTFindParentNode(AUID: TUniqId): PVirtualNode;
var
   pIterationData: PIterationDataForFindParentNode;
begin
   new(pIterationData);
   pIterationData^.Result:=nil; // Ici sera stocké le résultat par la procedure d'itération
   pIterationData^.UIDToFind:=AUID; // Le UID a chercher
   VSTMark.IterateSubtree(nil, @VSTIterationForFindParentNode,pIterationData);
   Result:=pIterationData^.Result;
   dispose(pIterationData);
end;