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

MFC Discussion :

Mettre des valeurs dans un ComboBox avec visual c++


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut Mettre des valeurs dans un ComboBox avec visual c++
    Bonjour,

    J'ai un problème, je développe un logiciel en c++ avec visual c++. J'ai créé un combo box d'identifiant IDC_COMBO1 et je veux y mettre des valeurs.
    J'ai ce code :

    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ASSERT(pCbo);
    if (pCbo){
    pCbo->AddString("toto");
    pCbo->AddString("titi");
    pCbo->SetCurSel(0);
    }

    Et ca plante au niveau du GetDlgItem, il aime pas le ASSERT(::IsWindow(m_hWnd)) :

    CWnd* CWnd::GetDlgItem(int nID) const
    {
    ASSERT(::IsWindow(m_hWnd));
    if (m_pCtrlCont == NULL)
    return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    else
    return m_pCtrlCont->GetDlgItem(nID);
    }
    Pourtant, en appelant la fonction GetDlgItem avec la combobox en paramètre, ca devrait marcher non?

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    est ce que tu es dans une méthode de la classe représentant la boite de dialogue contenant le combobox ?
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    oui, la classe représentant la boite de dialogue contenant le combobox s'appelle COptionsBDD.
    Ce bout de code se trouve dans COptionsBDD.cpp, dans le constructeur.

    /////////////////////////////////////////////////////////////////////////////
    // COptionsBDD dialog

    COptionsBDD::COptionsBDD(CIfe2central* pIfe2C, CWnd* pParent /*= NULL*/)
    : CDialog(COptionsBDD::IDD, pParent), postgreActif(0)
    {

    m_pIfe2C = pIfe2C;
    //{{AFX_DATA_INIT(COptionsBDD)
    m_driver = _T("");
    m_nomBDD = _T("");
    m_serveur = _T("");
    m_port = _T("");
    m_id = _T("");
    m_mdp = _T("");
    //}}AFX_DATA_INIT
    SetParam();
    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ASSERT(pCbo);
    if (pCbo){
    pCbo->AddString("toto");
    pCbo->AddString("titi");
    pCbo->SetCurSel(0);
    }
    }

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    ben justement, moi je le mettrais apres l'appel du constructeur

  5. #5
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    place ce genre d'informations dans OnIniutDialog car les composants ne sont pas initialiser dans le constructeur !
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    vi vi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    humm je l'ai bien mis dans le OnInitDialog comme ceci :
    BOOL COptionsBDD::OnInitDialog()
    {
    CDialog::OnInitDialog();
    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ASSERT(pCbo);
    if (pCbo){
    pCbo->AddString("toto");
    pCbo->AddString("titi");
    pCbo->SetCurSel(0);
    }
    return TRUE;
    }
    Mais ca plante au niveau de l'ASSERT(pCbo)...
    Je suis desesperée

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2004
    Messages : 391
    Points : 346
    Points
    346
    Par défaut
    Bonjour

    je mz trompe peut etre mais je suis pas sur que tu peux utiliser le ASSERT sans comparaison

    essaye plutot

    Cordialement

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse mais hélas, ca ne change rien, cela me donne cette erreur :
    Exception non gérée à 0x0040bdb8 dans ife2.exeoint d'arrêt utilisateur.

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2003
    Messages : 9 055
    Points : 17 330
    Points
    17 330
    Par défaut
    salut,
    si ça plante dans OnInitDialog c'est que ton identifiant IDC_COMBO1 n'est pas valide (n'existe pas dans la fenetre).
    ou alors tu as mis des proprietés incorrectes dans ta combobox genre owner draw.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Ben tout est ok pourtant, voici les propriétés de l'objet comboBox :

    Apparence :
    ...

    Comportement:
    Accept files : False
    Auto : False
    Data :
    Disabled : False
    Help ID : False
    Owner draw : No
    Sort : True
    Visible : True

    Divers :
    Group : False
    ID :IDC_COMBO1
    Tabstop : True
    Je ne comprends pas comment l'identifiant ne serait pas valide
    Désolée, je ne vois vraiment pas ce qui ne va pas.

  12. #12
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 722
    Points : 1 123
    Points
    1 123
    Par défaut
    COptionsBDD::COptionsBDD(CIfe2central* pIfe2C, CWnd* pParent /*= NULL*/)
    : CDialog(COptionsBDD::IDD, pParent), postgreActif(0)
    {

    m_pIfe2C = pIfe2C;
    //{{AFX_DATA_INIT(COptionsBDD)
    m_driver = _T("");
    m_nomBDD = _T("");
    m_serveur = _T("");
    m_port = _T("");
    m_id = _T("");
    m_mdp = _T("");
    //}}AFX_DATA_INIT
    SetParam();
    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ASSERT(pCbo);
    if (pCbo){
    pCbo->AddString("toto");
    pCbo->AddString("titi");
    pCbo->SetCurSel(0);
    }
    }
    Salut ton erreur d'assertion s'explique!!!
    L'appel de ton combobox ne doit pas se faire dans le constructeur mais dans la méthode candidate "OnInitDialog() préparée pour cela.

    Le constructeur de la boite de dialogue construit simplement l'objet C++, mais la méthode CDialog::OnInitDialog() prépare le même objet C++ sur le plan graphique (GUI).

    Et donc tant que le m_hWnd est null dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ASSERT(::IsWindow(m_hWnd));
    cela veut dire que sur le plan GUI tes objets ne sont pas encore près. Il faut donc les initialiser.

    En d'autres termes il y a deux étapes avant qu'un objet soit opérationnel

    d'abord on prépare l'objet C++ en appelant son constructeur
    ensuite on prépare l'entité concrète représentée par cet objet C++ en appelant ses méthodes du genre Create(), OnInitDialog(), OnInitialUpdate(), Initialize(), etc.

    Si tu remarques bien la plupart des objets MFC et surtout des objets fenêtres, disposent d'une méthode Create(). Cela veut dire que sur le plan GUI tu ne peux utiliser aucun objet tant que Create() n'est pas appelé mais les constructeurs sur ces derniers sont déjà appelés.


  13. #13
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 722
    Points : 1 123
    Points
    1 123
    Par défaut
    bon je vois que tu l'as placé dans OnInitDialog().
    Essaie de supprimer ton combo et de le replacer sur ta dialogue.
    Et assigne lui un autre IDC

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    ca change rien

  15. #15
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 722
    Points : 1 123
    Points
    1 123
    Par défaut
    Montre nous ton fichier resource.h

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by ife2.rc
    //
    #define IDD_ABOUTBOX 100
    #define IDR_NOUVEAU_FILTRE_TMPL 103
    #define IDR_MAINFRAME 128
    #define IDR_IFE2TYPE 129
    #define IDD_NouveauFiltre 130
    #define IDD_BDD 131
    #define IDC_EDIT1 1000
    #define IDC_EDIT2 1001
    #define IDC_EDIT3 1002
    #define IDC_EDIT4 1003
    #define IDC_EDIT5 1004
    #define IDC_EDIT6 1005
    #define IDC_EDIT7 1006
    #define IDC_EDIT8 1007
    #define IDC_EDIT9 1008
    #define IDC_RADIO1 1009
    #define IDC_RADIO2 1010
    #define IDC_RADIO3 1011
    #define IDC_COMBO1 1013
    //#define combo1 1013
    #define ID_FILTRE_SAUV 1014
    #define ID_IMPORTER 32772
    #define ID_LATEX 32773
    #define ID_BDD 32774
    #define ID_ERASE 32775
    #define ID_OPTIONS_BDD 32775
    #define ID_WORD 32776
    #define ID_ML 32777
    #define ID_ERASED 32778
    #define ID_COM 32779
    #define ID_GXML 32780
    #define ID_CSV 32781
    #define ID_NET 32782
    #define ID_VIDER 32784
    #define ID_FILTRE_NOUVEAUFILTRE 32790
    #define ID_FILTRE_OUVRIRFILTRE 32791
    #define ID_FILTRE_ANNULERFILTRE 32795

    // Next default values for new objects
    //
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_3D_CONTROLS 1
    #define _APS_NEXT_RESOURCE_VALUE 133
    #define _APS_NEXT_COMMAND_VALUE 32777
    #define _APS_NEXT_CONTROL_VALUE 1016
    #define _APS_NEXT_SYMED_VALUE 101
    #endif
    #endif
    J'ai renommé le combo IDC_COMBO1, ce qui explique la ligne en commentaires.

  17. #17
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2003
    Messages : 9 055
    Points : 17 330
    Points
    17 330
    Par défaut
    salut ,
    de toute facon il n'y a pas 36 solutions:
    si GetDlgItem echoue sur un identifiant c'est que le controle correspondant n'existe pas sur la fenetre.
    si tu ne mets pas ces lignes , la fenetre s'affiche avec la combo à l'ecran ?
    verifie sur la ressource l'identifiant utilisé .

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Salut,

    Alors oui, la fenetre s'affiche avec le combo à l'écran si je mets les lignes en commentaires.
    Sinon je suis allée voir le fichier ressource :
    IDD_BDD DIALOGEX 0, 0, 194, 281
    STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Options de la base de données"
    FONT 8, "MS Sans Serif", 0, 0, 0x0
    BEGIN
    COMBOBOX IDC_COMBO1,86,10,96,30,CBS_DROPDOWN | CBS_SORT |
    WS_VSCROLL | WS_TABSTOP
    LTEXT "Driver :",IDC_STATIC,13,8,57,14,SS_CENTERIMAGE
    LTEXT "Nom de la base :",IDC_STATIC,13,37,63,14,SS_CENTERIMAGE
    EDITTEXT IDC_EDIT2,86,36,96,14,ES_AUTOHSCROLL
    LTEXT "Serveur : ",IDC_STATIC,13,66,57,14,SS_CENTERIMAGE
    EDITTEXT IDC_EDIT3,86,64,96,14,ES_AUTOHSCROLL
    LTEXT "Port : ",IDC_STATIC,13,95,25,14,SS_CENTERIMAGE
    EDITTEXT IDC_EDIT4,86,95,96,14,ES_AUTOHSCROLL
    LTEXT "Identifiant : ",IDC_STATIC,13,124,57,14,SS_CENTERIMAGE
    EDITTEXT IDC_EDIT5,86,124,96,14,ES_AUTOHSCROLL
    LTEXT "Mot de passe : ",IDC_STATIC,13,153,54,14,SS_CENTERIMAGE
    EDITTEXT IDC_EDIT6,86,153,96,14,ES_PASSWORD | ES_AUTOHSCROLL
    LTEXT "Système de gestion de base de données :",IDC_STATIC,19,
    184,133,8
    CONTROL "PostgreSql",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON |
    WS_GROUP,35,207,50,10
    CONTROL "MySql3",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,113,206,
    39,10
    CONTROL "MySql5",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,69,230,
    39,10
    DEFPUSHBUTTON "OK",IDOK,12,253,50,14
    PUSHBUTTON "Cancel",IDCANCEL,132,253,50,14
    END
    Ma comboBox se situe bien dans la boite de dialogue IDD_BDD.

    Pour info :
    Avec ce code :
    BOOL COptionsBDD::OnInitDialog()
    {
    CDialog::OnInitDialog();
    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ASSERT(pCbo);
    if (pCbo){
    pCbo->AddString("toto");
    pCbo->AddString("titi");
    pCbo->SetCurSel(0);
    }
    return TRUE;
    l'erreur se situe ici, au niveau de l'assert(FALSE) :
    HWND CDataExchange:repareCtrl(int nIDC)
    {
    ASSERT(nIDC != 0);
    ASSERT(nIDC != -1); // not allowed
    HWND hWndCtrl;
    COleControlSite* pSite = NULL;
    m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    if (hWndCtrl == NULL)
    {
    // Could be a windowless OCX
    pSite = m_pDlgWnd->GetOleControlSite(nIDC);
    if (pSite == NULL)
    {
    TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
    ASSERT(FALSE); ////////////////////////////////////////////////////////////////////////////////////////////////////////// ICI
    AfxThrowNotSupportedException();
    }
    }
    m_idLastControl = nIDC;
    m_bEditLastControl = FALSE; // not an edit item by default

    return hWndCtrl;
    }

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2003
    Messages : 9 055
    Points : 17 330
    Points
    17 330
    Par défaut
    reprenons :
    GetDlgItem(IDC_COMBO1) renvoie NULL c'est sur ?
    GetDlgItem(1013) renvoie quoi ?
    tu peux le verifier en debug ?

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Alors non, GetDlgItem(IDC_COMBO1) ne renvoie pas NULL mais je ne sais pas comment faire pour voir ce qu'il renvoie. J'ai juste fait :

    CComboBox* pCbo = (CComboBox*)GetDlgItem(IDC_COMBO1);
    if (pCbo != NULL) afficher un message

    Et ca fait le meme type d'erreur en mettant 1013 en paramètre de GetDlgItem.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Ajouter des valeurs dans un combobox
    Par jerdel dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/05/2010, 15h52
  2. "Looper" pour mettre des valeurs dans un combobox
    Par Shoppingsyl dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/02/2010, 05h02
  3. mettre une valeur dans une combobox
    Par lila23 dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 06/07/2009, 18h51
  4. Excel - Mettre des valeurs dans les cellules
    Par shuya dans le forum Débuter
    Réponses: 1
    Dernier message: 10/02/2009, 10h45
  5. ajouter des valeurs dans une ComboBox (zone de liste modifiable)
    Par ghosty04 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/12/2008, 19h11

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