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 :

Accéder à une combobox dans une fonction ?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut Accéder à une combobox dans une fonction ?
    Bonjour,

    J'ai sur un form une tâche répétitive qui consiste à affecter aux items de plusieurs combobox des noms de champs de fichiers ayant été sélectionnés dans d'autre comboboxes.

    J'ai donc naturellement eu envie de faire une fonction pour traiter ça, et de passer en paramètre le nom du fichier sélectionné et la boite de liste qui doit recevoir la liste des champs.

    Ca donne ça:

    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
    24
    25
    26
    27
    28
    29
    30
    void AffecteListeChampsA(AnsiString NomFichier, AnsiString BoiteListe)
    {
    TComboBox* Boite = new TComboBox(ReqLib);
    int NbCont=ReqLib->ControlCount;
    for (int i = 0;i < NbCont;i++)
       if (ReqLib->Controls[i]->Name.AnsiCompare(BoiteListe) == 0)
          Boite = (TComboBox*)ReqLib->Controls[i];
    Boite->Parent=ReqLib;
     
    AnsiString RequeteChps="SHOW COLUMNS FROM "+NomFichier;
    ReqLib->MysqlClientDataSetFic->Close();
    ReqLib->MysqlClientDataSetFic->CommandText=RequeteChps;
    ReqLib->MysqlClientDataSetFic->Open();
     
    int nbChps=ReqLib->MysqlClientDataSetFic->RecordCount;
    if (nbChps==0)
       {
       MessageBox(NULL,"Aucun champ trouvé !","Alerte pour l'Utilisateur", MB_OK);
       ReqLib->MysqlClientDataSetFic->Close();
       }
    else
       {
       while(!ReqLib->MysqlClientDataSetFic->Eof)
         {
         Boite->Items->Add(VarToStr(ReqLib->MysqlClientDataSetFic->FieldValues["FIELD"]));
         ReqLib->MysqlClientDataSetFic->Next();
         }
       }
    ReqLib->MysqlClientDataSetFic->Close();
    }
    La compilation se passe bien, mais la boite de liste dont le nom est passé en paramètre ne se remplit pas. Du coup, je me dis que les Items vont bien dans "boite" mais disparaissent peut-être sitôt la fonction exécutée. Est-ce l'explication ? Comment peut-on y remédier d'une façon ou d'une autre pourvu que ma boîte se remplisse sur le form ?

    J'ai pas mal cherché sur le net y compris le forum mais je n'ai pas trouvé de vraie méthode pour accéder directement à une combobox (et la remplir) avec une fonction.

    Merci pour vos suggestions!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut
    Bon... Ben je me réponds à moi-même, des fois que ça serait utile à des plus nuls que moi (si jamais ça existe, bien sûr)

    Après une bonne nuit passée à chercher et à pomper du code ici et là (merci les gars), j'ai réussi à faire ce que je voulais... voici le nouveau code, qui fonctionne:

    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
    24
    25
    void AffecteListeChampsA(AnsiString NomFichier, AnsiString BoiteListe)
    {
    TComboBox *Boite = dynamic_cast <TComboBox*> (ReqLib->FindComponent(BoiteListe));
     
    AnsiString RequeteChps="SHOW COLUMNS FROM "+NomFichier;
    ReqLib->MysqlClientDataSetFic->Close();
    ReqLib->MysqlClientDataSetFic->CommandText=RequeteChps;
    ReqLib->MysqlClientDataSetFic->Open();
     
    nbChps=ReqLib->MysqlClientDataSetFic->RecordCount;
    if (nbChps==0)
       {
       MessageBox(NULL,"Aucun champ trouvé !","Alerte pour l'Utilisateur", MB_OK);
       ReqLib->MysqlClientDataSetFic->Close();
       }
    else
       {
       while(!ReqLib->MysqlClientDataSetFic->Eof)
         {
         Boite->Items->Add(VarToStr(ReqLib->MysqlClientDataSetFic->FieldValues["FIELD"]));
         ReqLib->MysqlClientDataSetFic->Next();
         }
       }
    ReqLib->MysqlClientDataSetFic->Close();
    }

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Petite précision !

    Controls et ControlCount ne cherche que les TControl qui ont la ReqLib comme Parent, dès qu'il y a une imbrication de Panel, GroupBox, ... cela ne fonctionne plus sauf en faisant une récursivité !

    FindComponent (Components et ComponentCount), cherche les TComponent posséder par ReqLib et une fenêtre possède tous les TControl qui sont définis en published et instancier via le système de Flux (DFM) peu importe l'imbrication !

    Si l'on corrige la boucle d'origine ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TComponent* Cpt = NULL; // surtout pas de new ! cela instancie un nouveau composant ! risque de fuite mémoire
    int NbCont=ReqLib->ComponentCount;
    for (int i = 0;i < NbCont;i++)
       if (ReqLib->Components[i]->Name.AnsiCompare(BoiteListe) == 0)
          Cpt = ReqLib->Components[i];
     
    if (Cpt && Cpt->InheritsFrom(__classid(TComboBox)))
    {
      TComboBox* Boite = (TComboBox*)Cpt;
      AnsiString RequeteChps="SHOW ...
      ... 
    }

    ReqLib ça sort d'où ? la Globale identifiant une Form ?
    Tu devrais passer le Owner en paramètre de AffecteListeChampsA, cela ouvrirait la fonction à d'autres Form, idem pour la Query !

    Pourquoi ne pas avoir passer la TComboBox en paramètre ?
    comment est fait l'appel de AffecteListeChampsA ?

    à mon avis, tu dois pouvoir simplifier en ceci, sauf si l'objet ComboBox n'est pas connu à la compilation et qu'il est obligé de le résoudre à l'exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void AffecteListeChampsA(AnsiString NomFichier, TComboBox* Boite)
    {
      AnsiString RequeteChps="SHOW COLUMNS ...
      ...
    }
    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

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut
    Hello,

    Merci pour tes explications, remarques et suggestions !

    "ReqLib" est bien le nom du form; et si je n'ai pas passé la boîte elle-même en paramètres c'est que j'ai essayé mais me suis vite heurté à des problèmes divers que je n'ai pas pu résoudre: je suis visiblement très loin d'être un expert !

    Merci encore !

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

Discussions similaires

  1. Comment faire une recherche dans une combobox et une sélection automatique
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2009, 16h17
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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