none
Problème de combobox RRS feed

  • Question

  • Bonjour,

    je suis en train de (tenter) de développer une APi sous VS c++ express edition 2008 et gaillardement je bute sur le remplissage d'une sacrée combobox rebelle. En fait, je dois lire dans un fichier .txt et mettre le tout dans la combobox, en liste déroulante bien sûr... j'arrive à mes fins sur un textbox multiligne mais ce combobox me pourrit la vie... non mais presque

    Voici le début de mon code (fait sous une api d'essai)

    private: System::Void button6_Click(System::Object^  sender, System::EventArgs^  e)
    {
      FileStream^ lect = gcnew FileStream("lire.txt",FileMode::Open);
      StreamReader^ rdr = gcnew StreamReader(lect);
     
      String^ essai = rdr->ReadToEnd();
      
      this->comboBox1->  xxxxxxxxx  (essai);
     
       rdr->Close();
    }

    je met quoi à la place de mes xxxx et y a t il un traitement à faire, le doc .txt a cette allure

    elem1;
    elem2;
    elem3;

    Merci pour votre aide

    Phaleno

    lundi 8 février 2010 15:21

Réponses

  • Bonjour Phaleno,

    Pour que cela soit automatiquement chargé lorsqu'on ouvre le formulaire, tu peux inclure la méthode dans le handler de l'événement Form_Load :
    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.form.load.aspx

    Le Form_Load arrive après le InitializeComponent(), donc tout est déjà en place lorsqu'il se déclenche.
    Comme cela, lorsque ton utilisateur tombera sur le formulaire, la liste sera déjà chargée.
    Et si besoin est, tu peux dans ton Form_Load charger la liste qui t'intéresse en fonction de n'importe quel paramètre que tu souhaites utiliser pour précharger par exemple ta liste agrumes ou ta liste fruits rouges.

    Il te faudrait encadrer par un try/catch ta méthode pour éviter les erreurs au chargement.
    En C# ça donnerait quelque chose dans ce genre :

            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    FileStream lect = new FileStream("lire.txt", FileMode.Open);
                    StreamReader rdr = new StreamReader(lect);
                    String line = String.Empty;
                    while (rdr.Peek() >= 0)
                    {
                        line = rdr.ReadLine();
                        this.comboBox1.Items.Add(line);
                    }
                    rdr.Close();
                }
                catch (FileNotFoundException fnfe)
                {
                    Console.WriteLine("[BUG] Fichier non trouvé : " + fnfe.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("[BUG] Erreur inconnue : " + ex.Message);
                }
            }


    J'espère que cela répond à ta question.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr

    mardi 9 février 2010 13:53
  • Bonjour Thomas,

    je te remercie de ton suivi,

    pour le moment mes comboboxes s'affichent comme je le désire (whaaaaou!!!) c'est à dire à l'ouverture j'ai le choix entre les type "de fruits", si j'en sélectionne un le combobox suivant m'affiche la liste des "fruits" appartenant au type.

    La méthode d'affichage à l'ouverture reste dans mon Form1.h, les autres méthodes dites"d'impressions" sont parties dans une classe qui se chargera de tous les boulots d'impression (chacun son taf : Form1 fait une jolie interface et lance le travail, "Impressions" imprime dans les zones de l'interface et les documents, et "PingCeQueJeTeDesigne" (humour) se chargera de pinguer les adresses communiquer et utilisera "Impressions" pour imprimer dans ce qu'il sait faire, sans oublier (et si j'ai le temps de le faire un module et une classe gérant les documents sources...) ... vala ...

    Mais la mise en route de ma première classe ne s'est pas faite sans mal... Medinoc de developpez m'a grandement aidé, maintenant j'approfondis ce qu'il m'a appris... cf :
    http://www.developpez.net/forums/d873303/c-cpp/outils-c-cpp/visual-cpp/cpp-cli/lentete-methode-retourne-string/ 

    /*
    Désormais je crée une méthode pour utiliser la classe Ping() et sortir le ping du code de Form1.h mais se pose la question du retour.... mais ce pan de la discussion va se porusuivre sur mon fil ping..... */

    J'ai rien dit, ça marche erreur de void/static... etc... bon je trouve une corde et je sors...

    Voila, je te remercie encore de ton aide, ton support passé et à venir...

    Fred

    PS vous n'ouvrez pas une succursale en Vendée ?



    Analyste programmeur débutant issu du CNAM de Nantes (AP23)
    • Marqué comme réponse Phaleno mercredi 24 février 2010 13:58
    vendredi 19 février 2010 09:26

Toutes les réponses

  • Bonjour,

    Je n'ai jamais fait de C++ (bouh :p).
    Néanmoins, de ce que je peux lire dans ton code, ce que je ferais serait la chose suivante :

    private: System::Void button6_Click(System::Object^  sender, System::EventArgs^  e)
    {
      FileStream^ lect = gcnew FileStream("lire.txt",FileMode::Open);
      StreamReader^ rdr = gcnew StreamReader(lect);
      
      // Lire les lignes une par une et les mettre dans la ComboBox:
      while ( line = rdr->ReadLine() )
      {
                this->comboBox1->Items->Add( line );
      }
     
      rdr->Close();
    }


    A savoir en l'occurence qu'il te faudra surement supprimer le ";" avant de les mettre dans la ComboBox, mais un substring fera le boulot sans problème:
    http://www.cplusplus.com/reference/string/string/substr/

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    lundi 8 février 2010 16:52
  • Bien vu....

    remarque je batis ce programme C++ depuis ce que j'ai pu faire en C#, bon par contre si quelqu'un a la soluce pour redre cela automatique sans que le futur utilisateur ait à cliquer.... et comme il faut intervenir au niveau du "initialize component" avec le risque de planter.... comment transformer cela en méthode appelée dès le lancement...

    en fait un premier choix ou les choix limités à celui-ci..... comme si tu pouvais d'entrée choisir "agrume" ce qui te laissera "citron, orange..." et non plus "pomme...."

    encore merci Thomas... je suis aussi preneur en C# car cela ressemble assez (mais pas trop) à C++

    Merci

    Phaleno
    mardi 9 février 2010 13:40
  • Bonjour Phaleno,

    Pour que cela soit automatiquement chargé lorsqu'on ouvre le formulaire, tu peux inclure la méthode dans le handler de l'événement Form_Load :
    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.form.load.aspx

    Le Form_Load arrive après le InitializeComponent(), donc tout est déjà en place lorsqu'il se déclenche.
    Comme cela, lorsque ton utilisateur tombera sur le formulaire, la liste sera déjà chargée.
    Et si besoin est, tu peux dans ton Form_Load charger la liste qui t'intéresse en fonction de n'importe quel paramètre que tu souhaites utiliser pour précharger par exemple ta liste agrumes ou ta liste fruits rouges.

    Il te faudrait encadrer par un try/catch ta méthode pour éviter les erreurs au chargement.
    En C# ça donnerait quelque chose dans ce genre :

            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    FileStream lect = new FileStream("lire.txt", FileMode.Open);
                    StreamReader rdr = new StreamReader(lect);
                    String line = String.Empty;
                    while (rdr.Peek() >= 0)
                    {
                        line = rdr.ReadLine();
                        this.comboBox1.Items.Add(line);
                    }
                    rdr.Close();
                }
                catch (FileNotFoundException fnfe)
                {
                    Console.WriteLine("[BUG] Fichier non trouvé : " + fnfe.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("[BUG] Erreur inconnue : " + ex.Message);
                }
            }


    J'espère que cela répond à ta question.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr

    mardi 9 février 2010 13:53
  • Oh que oui.... tu es mon sauveur....

    faudra que je fasse un pèlerinage à Lyon histoire de changer de type de bouchon.....

    Merci !!!
    mardi 9 février 2010 14:13
  • Héhé ^_^
    Ouaip passe à Lyon, on ira péleriner de bouchon lyonnais en bouchon lyonnais ;)

    A bientôt, alors !

    Thomas
    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 10 février 2010 08:48
  • Aïe Aïe Aïe ... marche pô !

    bon je déplace mon tieu Form1::Load... et rein mais rein du tout.... le code mache sur un bouton, mais pas en auto...

    je continue donc à fouiner, modifier... etc

    Fred
    lundi 15 février 2010 09:37
  • Bon je progresse :

    dans private: System::void combobox1_SelectedIndexChange (......){        // c'est dans form1.h
                  je colle mon code qui va lire dans le texte la liste des types des fruits
    }

    dans form1.h(design) je "caractérise" l'évènement load la form par combobox1_..... et hop le tour est joué sauf que..... quand je sélectionne un type fruit (ex agrume) ma créature ne me l'affiche pas dans le champs.... retour et recherches.... chez developpez.... par exemple

    corectif : j'affiche donc je tiens le bon bout

    Bon promis je ferai une synthèse quand tout sera comme je veux....

    Phaleno
    Analyste programmeur débutant issu du CNAM de Nantes (AP23)
    • Modifié Phaleno mardi 16 février 2010 14:41 évolution
    mardi 16 février 2010 14:08
  • Bonjour Fred,

    J'ai été absent cette dernière semaine.
    Ca en est où ?
    As-tu résolu tes problèmes ?
    Si non, explique-moi où tu en es.

    Cordialement,

    Thomas
    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    vendredi 19 février 2010 09:10
  • Bonjour Thomas,

    je te remercie de ton suivi,

    pour le moment mes comboboxes s'affichent comme je le désire (whaaaaou!!!) c'est à dire à l'ouverture j'ai le choix entre les type "de fruits", si j'en sélectionne un le combobox suivant m'affiche la liste des "fruits" appartenant au type.

    La méthode d'affichage à l'ouverture reste dans mon Form1.h, les autres méthodes dites"d'impressions" sont parties dans une classe qui se chargera de tous les boulots d'impression (chacun son taf : Form1 fait une jolie interface et lance le travail, "Impressions" imprime dans les zones de l'interface et les documents, et "PingCeQueJeTeDesigne" (humour) se chargera de pinguer les adresses communiquer et utilisera "Impressions" pour imprimer dans ce qu'il sait faire, sans oublier (et si j'ai le temps de le faire un module et une classe gérant les documents sources...) ... vala ...

    Mais la mise en route de ma première classe ne s'est pas faite sans mal... Medinoc de developpez m'a grandement aidé, maintenant j'approfondis ce qu'il m'a appris... cf :
    http://www.developpez.net/forums/d873303/c-cpp/outils-c-cpp/visual-cpp/cpp-cli/lentete-methode-retourne-string/ 

    /*
    Désormais je crée une méthode pour utiliser la classe Ping() et sortir le ping du code de Form1.h mais se pose la question du retour.... mais ce pan de la discussion va se porusuivre sur mon fil ping..... */

    J'ai rien dit, ça marche erreur de void/static... etc... bon je trouve une corde et je sors...

    Voila, je te remercie encore de ton aide, ton support passé et à venir...

    Fred

    PS vous n'ouvrez pas une succursale en Vendée ?



    Analyste programmeur débutant issu du CNAM de Nantes (AP23)
    • Marqué comme réponse Phaleno mercredi 24 février 2010 13:58
    vendredi 19 février 2010 09:26
  • Bonjour Fred,

    Haha !
    On aimerait bien ouvrir plein de succursales partout, mais pour l'instant on reste sur Lyon :)

    Je passe sur ton thread Ping ;)

    Cordialement,

    Thomas
    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 24 février 2010 17:15