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 [13/07/2020 16:44] thierry [GetFirstSelected] |
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> | ||
| - | === Séléction dans un TNodeArray === | ||
| - | <code delphi> | ||
| - | var | ||
| - | vI: integer; | ||
| - | vNodes: TNodeArray; | ||
| - | begin | ||
| - | vNodes := TVirtualStringTree(Source).GetSortedSelection(True); | ||
| - | for vI := 0 to length(vNodes) - 1 do | ||
| - | ... | ||
| - | end; | ||
| - | </code> | ||
| - | |||
| Ligne 180: | 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 === | ||