IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[TreeView] Parcourir


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut [TreeView] Parcourir
    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

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    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...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Voici le code que j'ai ecrit (non fonctionnel):

    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;
    Une idée pour que ca marche ?

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    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

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    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;

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Ceci ne fait-il pas exactement la même chose ?
    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;
    Non, si ?

    @+

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Points : 12
    Points
    12
    Par défaut ajout
    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.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ...

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

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut grand merci
    Citation Envoyé par ShaiLeTroll Voir le message
    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 ...

    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
    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
    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;
    code super merci beaucoup je pige mieux maintenant

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Treeview Parcourir les noeuds enfants
    Par damsmut dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/08/2010, 10h35
  2. Réponses: 15
    Dernier message: 16/04/2008, 11h16
  3. [VB2005 ]Parcourir tous les noeuds d'un treeview
    Par exclusif dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/07/2007, 22h38
  4. Parcourir enfants d'un noeud de TreeView
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 7
    Dernier message: 01/03/2007, 11h45
  5. Parcourir les noeuds d'un TreeView
    Par Andry dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/11/2005, 07h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo