====== Parcourir les noeud d'un Virtual Tree View ======
===== Parcourir un méme niveau =====
var
Data: PTreeData;
Node: PVirtualNode;
begin
Node := VST.GetFirst;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
Node := VST.GetNextSibling(Node);
end;
end;
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;