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 :

[Débutant][MFC] Ajout dans ComboBox ne fonctionne pas


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut [Débutant][MFC] Ajout dans ComboBox ne fonctionne pas
    Bonjour,

    J'explique mon problème.

    J'ai une fenêtre principale dans laquelle il y a une Combobox CComboMain
    Dans une boite de dialogue modale CNewModalInfo, il y a un bouton "Ajouter".
    Je veux que quand j'appuie sur le bouton "Ajouter" de cette boite modale,
    une chaîne "Essai" soit insérée dans ma Combobox CComboMain.

    J'ai pour cela suivi les conseil de Farscape dans la FAQ: Comment charger les contrôles d’une CDialog avant DoModal() ?
    http://c.developpez.com/faq/vc/?page...ControlForward

    J'ai essayé et la fonction DoModal me met une erreur.

    Classe CComboMain:
    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
    31
    32
    33
    34
    35
    36
    37
     
    class CComboMain : public CComboBox
    {
    // Construction
    public:
    	CComboMain();
    	enum { IDC = IDC_COMBO1 };
    // Attributes
     
    public:
    int  AddString( LPCTSTR lpszItem );
     
    // Operations
     
    public:
    CStringArray m_strArray;
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CComboMain)
    public:
    protected:
    virtual void PreSubclassWindow();
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	virtual ~CComboMain();
     
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CComboMain)
    		// NOTE - the ClassWizard will add and remove member functions here.
    	//}}AFX_MSG
     
    	DECLARE_MESSAGE_MAP()
    };
    ComboMain.cpp:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    // ComboMain.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "BW1.h"
    #include "ComboMain.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CComboMain
     
    CComboMain::CComboMain()
    {
    }
     
    CComboMain::~CComboMain()
    {
    }
     
    int CComboMain::AddString(LPCTSTR lpszItem)
    {
        // si la listbox est valide appel de la fonction d'origine. 
        if(m_hWnd!=NULL) return CComboBox::AddString(lpszItem);
        m_strArray.Add(lpszItem);
        return LB_ERR;
    }
     
    void CComboMain::PreSubclassWindow() 
    {
    // TODO: Add your specialized code here and/or call the base class
    CComboBox::PreSubclassWindow();    
        for(int i=0;i<m_strArray.GetSize();i++) AddString(m_strArray[i]);
    }
     
    BEGIN_MESSAGE_MAP(CComboMain, CComboBox)
    	//{{AFX_MSG_MAP(CComboMain)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CComboMain message handlers

    Fonction "OnAjouter" de ma boite modale:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    void CNewModalInfo::OnAjouter() 
    {
    	// TODO: Add your control notification handler code here
    	// Récupération des différents champs CEdit
     
    	CFiche newfiche;
    	CEdit * pm_edit_ref1,* pclient,* plieu,* ptype,* pdate,* pm_edit_mod1;
     
    	pm_edit_ref1 = (CEdit*) GetDlgItem(IDC_EDIT_REF1);
    	pm_edit_ref1->GetWindowText(newfiche.m_edit_ref1);
     
    	pclient = (CEdit*) GetDlgItem(IDC_EDIT_CLI);
    	pclient->GetWindowText(newfiche.client);
     
    	plieu = (CEdit*) GetDlgItem(IDC_EDIT_LIEU);
    	plieu->GetWindowText(newfiche.lieu);
     
    	ptype = (CEdit*) GetDlgItem(IDC_EDIT_TYPE);
    	ptype->GetWindowText(newfiche.type);
     
    	pm_edit_mod1 = (CEdit*) GetDlgItem(IDC_EDIT_MOD1);
    	pm_edit_mod1->GetWindowText(newfiche.m_edit_mod1);
     
     
    	pdate = (CEdit*) GetDlgItem(IDC_EDIT_DATE);
    	pdate->GetWindowText(newfiche.date);
     
            // LE PROBLEME EST ICI
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
    	CComboMain choix;
     
    	choix.AddString("Essai1");
    	choix.AddString("Essai2");
    	//choix.DoModal();
     
     
    	//choix.InsertString(-1,"test");
     
     
     
    	//Ecriture des caractéristiques dans un nouveau fichier
     
    	CString pFileName = newfiche.m_edit_ref1; //Affectation de la référence au nom du fichier
     
    	CStdioFile testx (pFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText | CFile::modeNoTruncate  );
     
    	testx.WriteString("REFERENCE: ");
    	testx.WriteString(newfiche.m_edit_ref1);
     
    	testx.WriteString("\nClient: ");
    	testx.WriteString(newfiche.client);
     
    	testx.WriteString("\nLieu: ");
    	testx.WriteString(newfiche.lieu);
     
    	testx.WriteString("\nType: ");
    	testx.WriteString(newfiche.type);
     
    	testx.WriteString("\nModèle: ");
    	testx.WriteString(newfiche.m_edit_mod1);
     
    	testx.WriteString("\nDate de mise en service: ");
    	testx.WriteString(newfiche.date);
     
    	testx.WriteString("\nAdresse IP: ");
    	//testx.WriteString(newfiche.);
     
    	testx.Close();
     
    	//DestroyWindow();
     
    }

    J'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    choix.InsertString(-1,"test");
    qui ne marche pas non plus.

    J'ai aussi un plantage à l'exécution avec le DestroyWindow();


    Merci pour vos réponses.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Me revoilà.

    J'avais oublié d'inclure <afxwin.h>.
    Maintenant je n'ai plus d'erreurs de compilation mais ma chaîne "Essai" ne s'ajoute toujours pas dans ma ComboBox ComboMain.

    En fait, je ne peut pas utiliser la fonction DoModal car la fenêtre dans laquelle est la ComboBox est ma fenêtre principale, y aurait-il un équivalent pour faire la même chose?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    CComboMain choix;
     
    	choix.AddString("Essai");	
    	choix.AddString("Essai2");
     
    	//choix.DoModal();?????
    Je dois certainement mettre un UpdateData mais je sais pas où pour ma fenêtre principale.

    J'aimerais aussi savoir comment fermer une boite modale simplement (mon DestroyWindow plante.

    Merci.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Salut,

    Essaie de mettre un Invalidate() après tes AddString(). Mais c'est étrange, normalement il n'y en a pas besoin.

    Sinon, pour détruire une dialog que tu a ouvert à l'aide de DoModal(), le plus simple est de gérer cela dans le code de cette dialog. Pour cela, utilise OnCancel() ou OnOK();

    hope it helps.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    OK merci pour les OnOK() et OnCancel().

    Parc contre le Invalidate() n'a pas l'air de marcher.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Excuses-moi, je ne comprends pas bien ton problème en fait. Tu veux afficher une fenêtre de type 'dialog box' qui contient des combobox, c'est cela?

    Sinon, au cas où (cela n'a peut-être rien à voir): quand tu créé un combobox dans l'éditeur de ressources, quand tu clique dessus, tu peux gérer la taille du combo, et quand tu cliue une seconde fois, tu peux gérer la taille de la liste déroulante qui s'ouvre quand tu va cliquer, lors de l'exécution du programme, sur la petite flèche. Il faut aggrandir cette liste déroulante, sinon le combo ne peux pas afficher les items.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    J'ai crée une application SDI, dans laquelle j'ai, entre autres une ComboBox dans la seule et unique fenêtre principale.

    J'ai ensuite une boite de dialoque modale "CNewModalInfo" avec un bouton "Ajouter".

    Je veux que, quand je clique sur le bouton "Ajouter"(équivalent bouton OK) de cette boite de dialoque modale, il ajoute une chaîne "Essai" dans la CComboBox de ma fenêtre principale.

    J'instite sur le fait que ma ComboBox n'est pas dans la boite de dialogue modale mais dans ma fenêtre principale.

    Je pense qu'il s'agit d'un pb de rafraichissement de l'afichage de la fenêtre principale.

    Voici le code de la fonction "Ajouter":
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    void CNewModalInfo::OnAjouter() 
    {
     
    	// Récupération des différents champs CEdit
     
    	CFiche newfiche;
    	CEdit * pm_edit_ref1,* pclient,* plieu,* ptype,* pdate,* pm_edit_mod1;
     
    	pm_edit_ref1 = (CEdit*) GetDlgItem(IDC_EDIT_REF1);
    	pm_edit_ref1->GetWindowText(newfiche.m_edit_ref1);
     
    	pclient = (CEdit*) GetDlgItem(IDC_EDIT_CLI);
    	pclient->GetWindowText(newfiche.client);
     
    	plieu = (CEdit*) GetDlgItem(IDC_EDIT_LIEU);
    	plieu->GetWindowText(newfiche.lieu);
     
    	ptype = (CEdit*) GetDlgItem(IDC_EDIT_TYPE);
    	ptype->GetWindowText(newfiche.type);
     
    	pm_edit_mod1 = (CEdit*) GetDlgItem(IDC_EDIT_MOD1);
    	pm_edit_mod1->GetWindowText(newfiche.m_edit_mod1);
     
     
    	pdate = (CEdit*) GetDlgItem(IDC_EDIT_DATE);
    	pdate->GetWindowText(newfiche.date);
     
     
     
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
    	CComboMain choix;
     
    	choix.AddString("Essai");	
    	choix.AddString("Essai2");
    	Invalidate();
     
    	//choix.DoModal();         Ne marche pas
    	//choix.InsertString(-1,"test");       Ne marche pas
     
    	OnOK();
    }
    Merci.

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CComboMain choix;
     
    choix.AddString("Essai");   
    choix.AddString("Essai2");
    Ok, je vois.
    En fait cela ne peut pas fonctionner, car ici, ta combobox choix est créée "à la volée" est n'est affichée nulle part.
    Ce que tu dois faire:
    Quand tu crée ta dialog (celle sur laquelle tu va faire le DoModal), tu passe (en paramètre du constructeur par exemple) un pointeur sur le combo qui est dans ta fenêtre principale. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaDialog dlg = new MaDialog(&m_monCombo);
    dlg->DoModal()
    Tu te débrouille pour conserver ce pointeur en variable membre de ta dialog, (par ex: CComboBox* m_comboRef). Et c'est sur cette référence que tu va faire le AddString(): m_comboRef->AddString("essai");

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    J'ai fait tout comme tu m'as dit et même si je n'ai pas d'erreurs à la compilation, ça ne fonctionne pas.

    Code création de ma boite de dialogue NewModalInfo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMainFrame::OnInstallationNew() 
    {
    	// TODO: Add your command handler code here
     
    	CComboMain m_combomain;
     
    	CNewModalInfo *dlg= new CNewModalInfo(&m_combomain);
    	dlg->DoModal();
     
    }

    Code de la fonction du bouton ajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void CNewModalInfo::OnAjouter() 
    {
     
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
    	CComboMain* m_combomain = new CComboMain();
     
    	m_combomain->AddString("Essai");	
    	m_combomain->AddString("Essai2");
     
     
    	OnOK();
    }


    Dans le ClassWizard, j'ai fait comme ça:

    IDC_COMBO1 int m_combomain


    Et là, la chaîne "Essai" ne s'affiche pas ????????

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skual
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMainFrame::OnInstallationNew() 
    {
    	// TODO: Add your command handler code here
     
    	CComboMain m_combomain;
     
    	CNewModalInfo *dlg= new CNewModalInfo(&m_combomain);
    	dlg->DoModal();
     
    }
    Je m'excuse, je ne comprend spas trop: CComboMain c'est une classe? Quoi qu'il en soit, ce n'est pas là que ta combo doit être créée. En fait, tu dois utiliser le classwizzard et "ajouter une variable" à partir de ton combo. Cela devrait te donner une variable membre de ta classe CMainFrame. Et c'est un pointeur sur cette variable que tu va passer au constructeur de ta dialog.

    Remarque: je n'ai plus utilisé visual6 depuis longtemps, donc en ce qui concerne le classwizzard, je ne peux pas te conseiller précisément.

    Citation Envoyé par skual
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void CNewModalInfo::OnAjouter() 
    {
     
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
    	CComboMain* m_combomain = new CComboMain();
     
    	m_combomain->AddString("Essai");	
    	m_combomain->AddString("Essai2");
     
     
    	OnOK();
    }
    C'est pareil. Ici, tu n'a pas à construire un nouveau combo. Je ne comprends pas trop ce que tu essaie de faire...

    Pourrais-tu me donner le .h et le constructeur de CNewModalInfo? J'y verrais plus clair.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    CComboMain (que j'ai crée pour ma Combobox) est une classe dérivée de CComboBox.

    Voilà le NewModalInfo.h:
    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
    31
    32
    33
    34
    35
     
    class CNewModalInfo : public CDialog
    {
    // Construction
    public:
    	CNewModalInfo(CWnd* pParent = NULL);   // standard constructor
     
    // Dialog Data
    	//{{AFX_DATA(CNewModalInfo)
    	enum { IDD = IDD_NEWINSTALL };
    	CString	m_edit_cli;
    	CString	m_edit_mod1;
    	CString	m_edit_lieu;
    	CString	m_edit_type;
    	CString	m_edit_ref1;
    	CString	m_edit_date;
    	//}}AFX_DATA
     
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CNewModalInfo)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	//}}AFX_VIRTUAL
     
    // Implementation
    protected:
     
    	// Generated message map functions
    	//{{AFX_MSG(CNewModalInfo)
    	afx_msg void OnAjouter();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };

    et le NewModalInfo.cpp:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    // NewModalInfo.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "BW1.h"
    #include "NewModalInfo.h"
    #include <fstream>
     
    #include "fiche.h"
     
    #include "ComboMain.h"
     
    #include <afxwin.h>
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CNewModalInfo dialog
     
     
    CNewModalInfo::CNewModalInfo(CWnd* pParent /*=NULL*/)
    	: CDialog(CNewModalInfo::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CNewModalInfo)
    	m_edit_cli = _T("");
    	m_edit_mod1 = _T("");
    	m_edit_lieu = _T("");
    	m_edit_type = _T("");
    	m_edit_ref1 = _T("");
    	m_edit_date = _T("");
    	//}}AFX_DATA_INIT
    }
     
     
    void CNewModalInfo::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CNewModalInfo)
    	DDX_Text(pDX, IDC_EDIT_CLI, m_edit_cli);
    	DDV_MaxChars(pDX, m_edit_cli, 20);
    	DDX_Text(pDX, IDC_EDIT_MOD1, m_edit_mod1);
    	DDV_MaxChars(pDX, m_edit_mod1, 10);
    	DDX_Text(pDX, IDC_EDIT_LIEU, m_edit_lieu);
    	DDV_MaxChars(pDX, m_edit_lieu, 20);
    	DDX_Text(pDX, IDC_EDIT_TYPE, m_edit_type);
    	DDV_MaxChars(pDX, m_edit_type, 30);
    	DDX_Text(pDX, IDC_EDIT_REF1, m_edit_ref1);
    	DDV_MaxChars(pDX, m_edit_ref1, 8);
    	DDX_Text(pDX, IDC_EDIT_DATE, m_edit_date);
    	DDV_MaxChars(pDX, m_edit_date, 10);
    	//}}AFX_DATA_MAP
    }
     
     
    BEGIN_MESSAGE_MAP(CNewModalInfo, CDialog)
    	//{{AFX_MSG_MAP(CNewModalInfo)
    	ON_BN_CLICKED(IDOK, OnAjouter)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CNewModalInfo message handlers
     
    void CNewModalInfo::OnAjouter() 
    {
    	// TODO: Add your control notification handler code here
    	// Récupération des différents champs CEdit
     
    	CFiche newfiche;
    	CEdit * pm_edit_ref1,* pclient,* plieu,* ptype,* pdate,* pm_edit_mod1;
     
    	pm_edit_ref1 = (CEdit*) GetDlgItem(IDC_EDIT_REF1);
    	pm_edit_ref1->GetWindowText(newfiche.m_edit_ref1);
     
    	pclient = (CEdit*) GetDlgItem(IDC_EDIT_CLI);
    	pclient->GetWindowText(newfiche.client);
     
    	plieu = (CEdit*) GetDlgItem(IDC_EDIT_LIEU);
    	plieu->GetWindowText(newfiche.lieu);
     
    	ptype = (CEdit*) GetDlgItem(IDC_EDIT_TYPE);
    	ptype->GetWindowText(newfiche.type);
     
    	pm_edit_mod1 = (CEdit*) GetDlgItem(IDC_EDIT_MOD1);
    	pm_edit_mod1->GetWindowText(newfiche.m_edit_mod1);
     
     
    	pdate = (CEdit*) GetDlgItem(IDC_EDIT_DATE);
    	pdate->GetWindowText(newfiche.date);
     
     
     
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
    	CComboMain* m_combomain = new CComboMain();
     
    	m_combomain->AddString(m_edit_ref1);	
    	m_combomain->AddString("Essai2");
     
     
     
    	//Ecriture des caractéristiques dans un nouveau fichier
     
    	CString pFileName = newfiche.m_edit_ref1; //Affectation de la référence au nom du fichier
     
    	CStdioFile testx (pFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText | CFile::modeNoTruncate  );
     
    	testx.WriteString("REFERENCE: ");
    	testx.WriteString(newfiche.m_edit_ref1);
     
    	testx.WriteString("\nClient: ");
    	testx.WriteString(newfiche.client);
     
    	testx.WriteString("\nLieu: ");
    	testx.WriteString(newfiche.lieu);
     
    	testx.WriteString("\nType: ");
    	testx.WriteString(newfiche.type);
     
    	testx.WriteString("\nModèle: ");
    	testx.WriteString(newfiche.m_edit_mod1);
     
    	testx.WriteString("\nDate de mise en service: ");
    	testx.WriteString(newfiche.date);
     
    	testx.WriteString("\nAdresse IP: ");
    	//testx.WriteString(newfiche.);
     
    	testx.Close();
     
    	OnOK();
    }
    J'ai bien ajouté une variable pour mon combo, elle s'appelle m_combomain.

    En fait, j'ai crée un pointeur avec ma classe CComboMain mais je dois plutôt le créer avec la classe CMainFrame?

    Voilà aussi le ComboMain.h:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    class CComboMain : public CComboBox
    {
    // Construction
    public:
     
    	int m_combomain;
     
    public:
    	CComboMain();
    // Attributes
     
    public:
    int  AddString( LPCTSTR lpszItem );
     
    // Operations
     
    public:
    CStringArray m_strArray;
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CComboMain)
    public:
    protected:
    virtual void PreSubclassWindow();
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	virtual ~CComboMain();
     
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CComboMain)
    		// NOTE - the ClassWizard will add and remove member functions here.
    	//}}AFX_MSG
     
    	DECLARE_MESSAGE_MAP()
    };
    et le combomain.cpp:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include "stdafx.h"
    #include "BW1.h"
    #include "ComboMain.h"
    #include <afxwin.h>
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CComboMain
     
    CComboMain::CComboMain()
    {
    }
     
    CComboMain::~CComboMain()
    {
    }
     
    int CComboMain::AddString(LPCTSTR lpszItem)
    {
        // si la listbox est valide appel de la fonction d'origine. 
        if(m_hWnd!=NULL) return CComboBox::AddString(lpszItem);
        m_strArray.Add(lpszItem);
        return LB_ERR;
    }
     
    void CComboMain::PreSubclassWindow() 
    {
    // TODO: Add your specialized code here and/or call the base class
    CComboBox::PreSubclassWindow();    
        for(int i=0;i<m_strArray.GetSize();i++) AddString(m_strArray[i]);
    }
     
    BEGIN_MESSAGE_MAP(CComboMain, CComboBox)
    	//{{AFX_MSG_MAP(CComboMain)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CComboMain message handlers
    Merci.

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skual
    CComboMain (que j'ai crée pour ma Combobox) est une classe dérivée de CComboBox.
    ok. C'est parfait.

    Pour le reste, oublie ce que j'ai écris précédemment, et procède ainsi:
    1/ Dans la fonction qui va appeler le DoModal de ta CNewModalInfo,
    tu va remplacer
    [dode]CNewModalInfo *dlg= new CNewModalInfo(&m_combomain); [/code]par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CNewModalInfo *dlg= new CNewModalInfo(this);
    Ici, le this que tu va passer en paramètre est un pointeur sur ta fenêtre principale. Ce pointeur permettra à la dialog ainsi créée d'accéder à ton combo.

    2/ remet de constructeur de CNewModalInfo tel qu'il était au début, c'est à dire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CNewModalInfo ::CNewModalInfo (CWnd* pParent /*=NULL*/)
    	: CDialog(pipodlg::IDD, pParent)
    3/ dans ta méthode OnAjouter, procède comme suit:
    * tu récupère un pointeur sur ton combo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMainCombo* pComboRef = m_pParentWnd->m_combomain; //attention, il faut que le m_combomain soit déclaré en public pour pouvoir faire cela
    Maintenant, tu peux faire ce que tu veux avec ton combo, notamment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pComboRef->AddString("blabla"); //pComboRef est, je le rappelle, un pointeur sur ton fameux combo
    Citation Envoyé par skual
    En fait, j'ai crée un pointeur avec ma classe CComboMain mais je dois plutôt le créer avec la classe CMainFrame?
    Désolé, je ne comprends pas trop la question.
    Mais en ce qui concerne la création d'une nouvelle variable pour ton combo dans le classwizzard, je ne sais pas trop comment il faut faire. La seule chose dont je suis sûr, c'est qu'au final, tu doit obtenir (sans l'avoir tapé toi-même) quelque chose come ça dans le CMainFrame.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public:
           CMainCombo m_maincombo;

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    J'ai tapé le code mais j'ai un problème pour déclarer dans CMainFrame.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public:
           CMainCombo m_maincombo;
    Le seul endroit où le ClassWizard m'autorise à déclarer la combobox IDC_COMBO1, c'est dans la classe CBW1View.h (BW1 est le nom de mon application) et je ne peux lui associer que le type entier.

    Si je le rajoute à la main dans le CMainFrame.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "ComboMain.h"
     
    class CMainFrame : public CFrameWnd
    {
     
    public:
     
    	CComboMain m_combomain;
     
    protected: // create from serialization only
    	CMainFrame();
    	DECLARE_DYNCREATE(CMainFrame)
            .........
    il y a erreur de compilation:

    error C2039: 'm_combomain' : is not a member of 'CWnd'
    Merci pour ton assiduité à me sortir de là.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne sais pas comment faire pour ajouter un combo (ou même un contrôle plus généralement) dans sur une frame (SDI). Mais tu dois pouvoir trouver aisément des instuctions sur le net. Désolé.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    OK merci quand même rOd d'avoir essayé de m'aider.

    Je vais chercher.

    A+

  15. #15
    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 323
    Points
    17 323
    Par défaut
    salut,
    1) Ta classe CComboMain est bizarre elle devrait hériter de CWnd (à travers ccombobox) . Il serait intéressant de voir sa définition.
    2) si tu es en SDI il n'y a qu'une seule vue alors pourquoi ne pas mettre directement la combobox dans la vue ?


  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Salut,

    1) Je te montre la classe CComboMain:

    définition:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    class CComboMain : public CComboBox
    {
    // Construction
    public:
     
    	int m_combomain;
     
    public:
    	CComboMain();
    // Attributes
     
    public:
    int  AddString( LPCTSTR lpszItem );
     
    // Operations
     
    public:
    CStringArray m_strArray;
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CComboMain)
    public:
    protected:
    virtual void PreSubclassWindow();
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	virtual ~CComboMain();
     
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CComboMain)
    		// NOTE - the ClassWizard will add and remove member functions here.
    	//}}AFX_MSG
     
    	DECLARE_MESSAGE_MAP()
    };
    Implémentation:
    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
     
    CComboMain::CComboMain()
    {
    }
     
    CComboMain::~CComboMain()
    {
    }
     
    int CComboMain::AddString(LPCTSTR lpszItem)
    {
        // si la listbox est valide appel de la fonction d'origine. 
        if(m_hWnd!=NULL) return CComboBox::AddString(lpszItem);
        m_strArray.Add(lpszItem);
        return LB_ERR;
    }
     
    void CComboMain::PreSubclassWindow() 
    {
    // TODO: Add your specialized code here and/or call the base class
    CComboBox::PreSubclassWindow();    
        for(int i=0;i<m_strArray.GetSize();i++) AddString(m_strArray[i]);
    }
     
    BEGIN_MESSAGE_MAP(CComboMain, CComboBox)
    	//{{AFX_MSG_MAP(CComboMain)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    D'après ce que tu dis je crois que je me suis trompé en créant la classe pour mon combo: j'ai mis comme classe de base CComboBox alors qu'elle devrait hériter de CWnd??



    2) Que veux tu dire par:
    mettre directement la combobox dans la vue

    Merci.

  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 323
    Points
    17 323
    Par défaut
    Non ,disons que je ne comprends pas ton erreur, la classe ccombobox hérite de la classe CWnd.
    tu pourrais indiquer sur quelle ligne de code précisement tu as l'erreur ?
    error C2039: 'm_combomain' : is not a member of 'CWnd'
    pour la deuxième question ,et bien je ne vois pas trop l'intérêt de déclarer une ccombox dans la classe Mainframe ,alors que ça devrait être fait dans la classe vue surtout dans le cas d'un projet SDI.


  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Alors j'ai cette erreur ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	CComboMain* pComboRef = m_pParentWnd->m_combomain;
    ligne de code qui vient de cette fonction:

    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
     
     
    #include "ComboMain.h"
     
    void CNewModalInfo::OnAjouter() 
    {
    	// TODO: Add your control notification handler code here
    	....
            ....
     
    	//Ajout de la référence dans la ComboBox de la fenêtre principale
     
     
    	CComboMain* pComboRef = m_pParentWnd->m_combomain;
    	 pComboRef->AddString("blabla");
     
            ....
    	....
     
    	OnOK();
    }

    Cette fonction Ajouter est dans le fichier Newmodalinfo.cpp dont le code entier est qq messages au dessus.


    Le message d'erreur en entier est:

    error C2039: 'm_combomain' : is not a member of 'CWnd'
    c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(1899) : see declaration of 'CWnd'
    Si je clique sur "see declaration of CWnd", cela me renvoie "afxwin.h" à cette ligne:
    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
    31
    32
    33
     
    class CWnd : public CCmdTarget
    {
    	DECLARE_DYNCREATE(CWnd)
    protected:
    	static const MSG* PASCAL GetCurrentMessage();
     
    // Attributes
    public:
    	HWND m_hWnd;            // must be first data member
    	operator HWND() const;
    	BOOL operator==(const CWnd& wnd) const;
    	BOOL operator!=(const CWnd& wnd) const;
     
    	HWND GetSafeHwnd() const;
    	DWORD GetStyle() const;
    	DWORD GetExStyle() const;
    	BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);
    	BOOL ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);
     
    	CWnd* GetOwner() const;
    	void SetOwner(CWnd* pOwnerWnd);
     
    // Constructors and other creation
    	CWnd();
     
    	static CWnd* PASCAL FromHandle(HWND hWnd);
    	static CWnd* PASCAL FromHandlePermanent(HWND hWnd);
    	static void PASCAL DeleteTempMap();
    	BOOL Attach(HWND hWndNew);
    	HWND Detach();
    ....
    ....
    J'espère que cela pourra t'éclairer un peu(ou beaucoup).

  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 323
    Points
    17 323
    Par défaut
    salut,
    tu affectes un pointeur ,c'est l'adresse qui fallait renvoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CComboMain* pComboRef = &m_pParentWnd->m_combomain;

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    je viens d'essayer et et j'ai toujours exactement la même erreur.

Discussions similaires

  1. [Débutant] ajout dans liste ne fonctionne pas
    Par Devlin111 dans le forum C#
    Réponses: 14
    Dernier message: 04/04/2012, 14h50
  2. [MySQL] ajout et modif ne fonctionne pas dans page admin
    Par kate59 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/06/2009, 00h42
  3. Réponses: 3
    Dernier message: 19/09/2007, 13h09
  4. Ajouter une référence .olb fonctionne pas ?
    Par IndyJones dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/06/2007, 14h52
  5. [VBA-E] SetFocus sur TextBox dans UserForm_Initialize ne fonctionne pas ?
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/11/2006, 11h39

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