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