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