Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
prog:lazarus:components:tvirtualtreeview:tvirtualtreeview [12/07/2020 17:28] thierry [Parcourir tous les nœuds par Itération] |
prog:lazarus:components:tvirtualtreeview:tvirtualtreeview [07/05/2023 15:12] (Version actuelle) thierry |
||
---|---|---|---|
Ligne 103: | Ligne 103: | ||
<code delphi> | <code delphi> | ||
+ | { Expand un Node } | ||
VSTMain.Expanded[FRootNode]:=true; | VSTMain.Expanded[FRootNode]:=true; | ||
+ | { Savoir si un Node est expanded } | ||
+ | ExpBool:=VSTMain.Expanded[FRootNode]; | ||
</code> | </code> | ||
=== Tout === | === Tout === | ||
Ligne 134: | Ligne 137: | ||
* [[https://documentation.help/VirtualTreeview/TBaseVirtualTree_Sort@PVirtualNode@TColumnIndex@TSortDirection@Boolean.html|Procédure SORT @Doc Officielle]] | * [[https://documentation.help/VirtualTreeview/TBaseVirtualTree_Sort@PVirtualNode@TColumnIndex@TSortDirection@Boolean.html|Procédure SORT @Doc Officielle]] | ||
* [[https://documentation.help/VirtualTreeview/TBaseVirtualTree_OnCompareNodes.html|OnCompareNode @DocOfficielle]] | * [[https://documentation.help/VirtualTreeview/TBaseVirtualTree_OnCompareNodes.html|OnCompareNode @DocOfficielle]] | ||
- | |||
- | ==== Selection ==== | ||
- | === GetFirstSelected === | ||
- | <code delphi> | ||
- | function TForm1.GetSelectedMarker: TMarker; | ||
- | var | ||
- | pNode: PVirtualNode; | ||
- | pData: PVSTMarkData; | ||
- | begin | ||
- | pNode := VSTMark.GetFirstSelected; | ||
- | if assigned(pNode) then | ||
- | begin | ||
- | pData := VSTMark.GetNodeData(pNode); | ||
- | Result := pData^.Marker; | ||
- | end else | ||
- | Result := nil; | ||
- | end; | ||
- | |||
- | |||
- | </code> | ||
Ligne 170: | Ligne 153: | ||
end; | end; | ||
</code> | </code> | ||
- | ==== Parcourir un VST ==== | ||
- | === Parcourir un méme niveau === | ||
- | |||
- | <code delphi 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; | ||
- | |||
- | </code> | ||
- | |||
- | <code delphi 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; | ||
- | |||
- | </code> | ||
- | === 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. | ||
- | <code delphi> | ||
- | 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; | ||
- | |||
- | </code> | ||
- | |||
- | |||
- | |||
- | |||
==== Déstruction du VST ==== | ==== Déstruction du VST ==== | ||
=== OnFreeNode === | === OnFreeNode === |