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

C++Builder Discussion :

Treeview et récursivité


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Treeview et récursivité
    Bonjour, voici mon problème.

    D’un côté j’ai une ListBox représentant une hiérarchie de paragraphe tirée d’un fichier WORD. (Voir fichier en Attachement)
    Je voudrais représenter cette arborescence dans un Treeview.
    N’étant pas très copain avec la manipulation de la récursivité (je pense qu’il n’y pas d’autre solution) je demande de l’aide. Peut-être pas une réalisation complète mais le chemin à suivre.
    Cordialement
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Bonjour,
    Voici un petit bout de code bricolé il y a quelques années pour un problème similaire. Il n'est pas du tout optimisé et livré "tel quel", mais ça peut être un début de piste:
    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
    19
    20
    21
      TreeView1->Items->Clear() ;
      for( int i=0; i < ListBox1->Items->Count; i++ )
      {
        AnsiString s = ListBox1->Items->Strings[i] ; //récupération d'un élement
        AnsiString start = ListBox1->Items->Strings[i][1] ; //récupération du préfixe
        bool test = false ;
        for( int j=0; j< TreeView1->Items->Count; j++) //parcourt du treeview
        {
            AnsiString s2 = TreeView1->Items->Item[j]->Text ; //récupération du texte du noeud
            if( start == s2 ) // si le noeud correspond au prefixe, on ajoute un sous-element
                TreeView1->Items->AddChild( TreeView1->Items->Item[j], s ) ;
     
            if( s2 == s ) //si le noeud est déja existant, on sort
            {
                test = true ;
                break ;
            }
        }
        if( !test ) // si le noeud n'existe pas, on l'ajoute à la racine
            TreeView1->Items->Add( TreeView1->Items->GetFirstNode(), s ) ;
      }
    ATTENTION: se code était destiné à des listes de chaines triées sous la forme:
    1
    1-a
    1-b
    1-c
    2
    2-a
    2-b
    3
    3-a
    3-b
    Le format '-' + lettre ne change rien du tout, pas contre le bout de code ne descend que d'un niveau, pas de deux (ou plus), et ne fonctionnait que pour les préfixe 0 à 9.
    De plus, le code fonctionne dans des cas bien précis, et n'effectue aucun test de cohérence ou autre.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour sat83,

    Grand merci pour ta réponse rapide.
    Effectivement pour deux niveaux pas de problème, mais je dois pouvoir aller jusqu’à 9 niveaux. Imbriquer des « for next » n’est pas une solution idéale. Je continue mes recherches à la solution.
    Je vais essayer de trouver l’algorithme en me basant sur ton exemple mais ce n’est pas gagné.
    Cordialement.

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Une légère adaptation du code te permet de descendre de autant de niveau que souhaité:
    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
    19
    20
    21
    22
    23
      TreeView1->Items->Clear() ;
      for( int i=0; i < ListBox1->Items->Count; i++ )
      {
        AnsiString s = ListBox1->Items->Strings[i] ;
     
        int tmpIndex = ListBox1->Items->Strings[i].LastDelimiter( "." ); //récupération de la position du dernier '.' 
        AnsiString prefix = ListBox1->Items->Strings[i].SubString(1,tmpIndex-1) ; //recupération du préfixe jusqu'au dernier '.'
        bool test = false ;
        for( int j=0; j< TreeView1->Items->Count; j++)
        {
            AnsiString s2 = TreeView1->Items->Item[j]->Text ;
            if( prefix == s2 )
                TreeView1->Items->AddChild( TreeView1->Items->Item[j], s ) ;
     
            if( s2 == s )
            {
                test = true ;
                break ;
            }
        }
        if( !test )
            TreeView1->Items->Add( TreeView1->Items->GetFirstNode(), s ) ;
      }
    Ce code n'est pas pour autant optimisé, et aucun test n'est fait sur la cohérence des données
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    IMPECCABLE,

    Exactement ce qu'il me fallait.

    Grand Merci sat83.

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

Discussions similaires

  1. Arborescence par récursivité - treeview
    Par Renaud976 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/11/2011, 05h41
  2. TreeView et Récursivité
    Par Maniz dans le forum VB.NET
    Réponses: 3
    Dernier message: 03/10/2011, 17h03
  3. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  4. où y a t il un tutorial pour le Treeview ??
    Par silvermoon dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h30
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    Réponses: 7
    Dernier message: 31/08/2002, 01h44

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