Bonjour !
Je voudrais savoir comment il est possible de lister tous les noeuds d'un treeview.
Cela doit revenir à parcourir tous les noeuds d'un arbre n-aire ...
Auriez vous un exemple ?
Merci :)
Version imprimable
Bonjour !
Je voudrais savoir comment il est possible de lister tous les noeuds d'un treeview.
Cela doit revenir à parcourir tous les noeuds d'un arbre n-aire ...
Auriez vous un exemple ?
Merci :)
Voici:Code:
1
2 for i:=0 to TreeView1.Items.Count-1 do { ce que tu veux faire avec TreeView1.Items[i].xxxxx (Text,Level, etc... };
oui, mais non ... :s
Ce que je cherche à faire, c'est une fonction recursive qui fait un parcours en profondeur de l'arbre, quel que soit son nombre de niveaux et d'items...
Voici le code que j'ai ecrit (non fonctionnel):
Une idée pour que ca marche ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 procedure TfrmMain.FillNodeList(nodeList : TList ; firstBranchID : Integer); var i : Integer; branchID : Integer; myCurrentNode : TTreeNode; Begin myCurrentNode := TTReeNode.Create(tvwBiblio.Items); myCurrentNode.Assign(tvwBiblio.Selected) ; branchID := integer(myCurrentNode.Data); with myCurrentNode do while (myCurrentNode.SelectedIndex < myCurrentNode.Count) do Begin showmessage(inttostr(myCurrentNode.SelectedIndex)); nodeList.Add(pointer(branchID)); FillNodeList(nodeList,i); end; myCurrentNode.Free; end;
Salut
J'ai du mal à saisir ce à quoi doit aboutir ton code. Et pourquoi absolument une fonction récursive ?
Un simple parcours de l'arborescence avec l'itération proposée par qi130 ne peut pas convenir ?
@+ Claudius
Le but est de parcourir tous les 'Nodes' d'un TreeView afin de recupérer dans chaque Node la valeur du champs DATA.
La préocupation principale est donc de parcourir tout un arbre quel que soit sa profondeur.
Il faut donc une fonction récursive car on ne connait pas le nombre de branche par noeud.
Voici la solution...
(Ici la fonction remplis une TList en plus)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 procedure TfrmMain.FillNodeList(nodeList : TList ; node : TTreeNode); var i : Integer; branchID : Integer; Begin with Node do Begin i:= 0; while (i < Count) do Begin branchID := integer(Item[i].Data); nodeList.Add(pointer(branchID)); FillNodeList(nodeList,Item[i]); inc(i); end; end; end;
Re,
Ceci ne fait-il pas exactement la même chose ?
Non, si ?Code:
1
2
3
4
5
6
7 procedure TForm1.FillListNode(tv: TTreeView); var i: integer; begin for i := 0 to tv.Items.Count - 1 do NodeList.Add(tv.Items[i].Data); end;
@+
sa serai bien de continuer ...étendre le problème .
si on suppose que j'ai un TTreeview et j'aimerai construire une expréssion arithmétique à partir de ceci sachant que le nœuds sont les opérateurs arithmétique et les dernière feuilles sont les nombres.
exemple
(((a+b)*(c+d))*(f/z))
sa serai bien a réfléchir.:cry:
Attention, la Propriétés Items du TTreeView (ou Item d'un TTreeNodes) est une vue à plat de l'arbre, la récursivité, ne pas confondre avec la propriété Item d'un TTreeNode (sans S)
Donc pour parcourir un arbre, la récursivité n'est pas obligatoire, d'ailleurs, si l'on souhaite l'utiliser, il faut dans ce cas ne gérer que les items de Level 0 depuis TreeView.Items ... j'avais évoqué cela dans ce sujet "Recherche sur un TTreeView"
ce code suivant permet de s'en persuader, c'est très mal documenté, j'ai toujours fait de la récursivité, un jour, j'ai oublié de mettre à nil un data après un dispose, et c'est comme ça que j'ai découvert cette arnaque ...
et la variante que je conseilleCode:
1
2
3
4
5
6
7
8
9
10 procedure TFrmTestDivers.BtnFlatTreeViewClick(Sender: TObject); var I: Integer; begin // Rappel : // - Les Items du TreeView (TTreeNodes) représente une vision "à plat" de l'arborescence, c'est pour cela qu'il faut prendre en compte le level si l'on ne veut gérer que les noeuds racines ! // - Les Items du TTreeNode (sans s) représente juste les enfants d'un noeud !!! for I := 0 to TreeView.Items.Count - 1 do MemoTreeEvent.Lines.Add(Format('%d [%d] "%s"', [I, TreeView.Items[I].Level, TreeView.Items[I].Text])); end
Code:
1
2
3
4
5
6
7
8
9
10
11
12 procedure TFrmTestDivers.BtnFlatTreeViewQucikClick(Sender: TObject); var Node: TTreeNode; begin Node := TreeView.Items.GetFirstNode(); while Assigned(Node) do begin MemoTreeEvent.Lines.Add(Format('%d [%d] "%s"', [Node.Index, Node.Level, Node.Text])); Node := Node.GetNext(); end; end;
Hey ! Pas mal, 6 semaines plus tard, de rien si mon code te plait, moi aussi, j'ai pigé que tardivement le fait que le Nodes d'un TreeView.TreeNodes est une vision plate d'arbre, alors que les Items d'un TreeNode, sont juste les siens à son niveau ...
Ensuite, tu peux aussi consulter le sujet "Gestion complète d'une TreeView: ajout de noeuds, records et sauvegarde du tout ", surtout si tu dois travailler avec la propriété Data, cela peut t'inspirer pour sa sauvegarde ...