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;
Vous pourriez laisser un commentaire si vous étiez connecté.