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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for i:=0 to TreeView1.Items.Count-1 do { ce que tu veux faire avec TreeView1.Items[i].xxxxx (Text,Level, etc... };
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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 conseille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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 ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager