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 :

Problème en MessageBox + Problème de conversion


Sujet :

MFC

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème en MessageBox + Problème de conversion
    Je travaille actuellement sur une application, j'ai rencontré deux problèmes:
    Le premier : J'ai travaillé avec un MessageBox pour indiquer les erreurs commis par l’utilisateur lors de la saisie des informations, le boite dialogue du formulaire déclenche ce message d'erreur.

    Nom : 1.png
Affichages : 146
Taille : 38,9 Ko

    Mais lorsque je clique sur "OK" du MessageBox, le programme revient à l(interface principale !! Comment je peux le faire revenir au formulaire, j'ai fais des recherches, les méthodes GetParent() et SetFocus() ne marchent plus !
    Sachant que j'ai les utiliser comme ceci :
    this->SetFocus();
    GeParent()->SetFocus();

    Nom : 2.png
Affichages : 116
Taille : 20,0 Ko

    Morceau du code concerné:
    Nom : 4.png
Affichages : 113
Taille : 9,7 Ko

    Le deuxième: C'est un problème de conversion:
    Lorsque j'ai saisi ce code:
    Nom : 5.png
Affichages : 121
Taille : 6,3 Ko

    Les deux variables m_doubleMontIMP_RE et m_doubleMontIMP_DEC représentent respectivement la partie naturelle et décimale du montant à régler et même chose pour m_doubleMontREG_RE et m_doubleMontIMP_REG pour le montant réglé. Ces variables sont liées aux contrôles et permettent la récupération des données.
    Pour obtenir les montants, j'ai pensé à concaténer le tous dans des CString strIMP et strREG et ensuite faire une conversion pour aboutir aux montants et calculer le bilan en faisant une différence.

    J'ai aboutit à ce résultat:
    Nom : 3.png
Affichages : 126
Taille : 2,1 Ko

    MERCI D'AVANCE DE TOUTE INTERVENTION.

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Bonjour.

    Je suppose que ton code de validation des zones de saisie est placé après la fonction CMyDialog.DoModal() qui te permet de vérifier si les données associées à tes contrôles sont bien renseigné. La fonction DoModal() affiche ta boîte de dialogue et lorsque tu cliques sur ton bouton Valider tu la fermes donc tu reviens à ton interface principale.

    Pour résoudre ton problème, tu dois créer une fonction de validation des données dans ta boîte de dialogue en interceptant le message EN_CHANGE pour chaque contrôle CEdit comme indiqué dans le cours de Farscape sur les MFC.

    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
    class CMyDialog : public CDialogEx
    {
            ....
    protected:
    	DECLARE_MESSAGE_MAP()
     
    	afx_msg void OnValidation();
    };
     
    BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    	ON_EN_CHANGE(IDC_EDIT1, &CMyDialog::OnValidation)
            ON_EN_CHANGE(IDC_EDIT2, &CMyDialog::OnValidation)
    END_MESSAGE_MAP()
     
    void CMyDialog::OnValidation()
    {
    	UINT arnId[]={IDC_EDIT1,IDC_EDIT2};
            int nFull=0;
            CString strTemp;
     
            for(int i=0; i<sizeof(arnId)/sizeof(UINT); i++)
            {
                GetDlgItem(arnId[i])->GetWindowText(strTemp);
                nFull += (!strTemp.IsEmpty());
            }
     
            m_btnValider.EnableWindow((nFull==sizeof(arnId)/sizeof(UINT)));
    }

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ton appel à CWnd::MessageBox(), il est bien dans le code du formulaire? (c'est-à-dire, this désigne bien le formulaire?)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ton appel à CWnd::MessageBox(), il est bien dans le code du formulaire? (c'est-à-dire, this désigne bien le formulaire?)
    Oui, il est en formulaire, plus précisément dans la méthode associée à l'évènement du clic sur le bouton OK (Valider dans mon cas).

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ddaime Voir le message
    Bonjour.

    Je suppose que ton code de validation des zones de saisie est placé après la fonction CMyDialog.DoModal() qui te permet de vérifier si les données associées à tes contrôles sont bien renseigné. La fonction DoModal() affiche ta boîte de dialogue et lorsque tu cliques sur ton bouton Valider tu la fermes donc tu reviens à ton interface principale.

    Pour résoudre ton problème, tu dois créer une fonction de validation des données dans ta boîte de dialogue en interceptant le message EN_CHANGE pour chaque contrôle CEdit comme indiqué dans le cours de Farscape sur les MFC.

    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
    class CMyDialog : public CDialogEx
    {
            ....
    protected:
    	DECLARE_MESSAGE_MAP()
     
    	afx_msg void OnValidation();
    };
     
    BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    	ON_EN_CHANGE(IDC_EDIT1, &CMyDialog::OnValidation)
            ON_EN_CHANGE(IDC_EDIT2, &CMyDialog::OnValidation)
    END_MESSAGE_MAP()
     
    void CMyDialog::OnValidation()
    {
    	UINT arnId[]={IDC_EDIT1,IDC_EDIT2};
            int nFull=0;
            CString strTemp;
     
            for(int i=0; i<sizeof(arnId)/sizeof(UINT); i++)
            {
                GetDlgItem(arnId[i])->GetWindowText(strTemp);
                nFull += (!strTemp.IsEmpty());
            }
     
            m_btnValider.EnableWindow((nFull==sizeof(arnId)/sizeof(UINT)));
    }
    Merci de ton intervention, mais je ne travaille pas avec la classe CDialogEx, tout simplement c'est un MessageBox !

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Citation Envoyé par ibrahimelhadeg
    Merci de ton intervention, mais je ne travaille pas avec la classe CDialogEx, tout simplement c'est un MessageBox !
    Merci mais j'avais bien compris et ce n'est pas MessageBox qui pose problème !

    Citation Envoyé par ibrahimelhadeg
    Oui, il est en formulaire, plus précisément dans la méthode associée à l'évènement du clic sur le bouton OK (Valider dans mon cas).
    C'est bien ce que je disais, le fait de cliquer sur le bouton Ok (ou Valider dans ton cas) ferme ton formulaire. Il est donc normal qu'après l'appel à MessageBox tu te retrouves dans ton interface principale. Vérifie ton identifiant du bouton Valider.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ddaime Voir le message
    Merci mais j'avais bien compris et ce n'est pas MessageBox qui pose problème !



    C'est bien ce que je disais, le fait de cliquer sur le bouton Ok (ou Valider dans ton cas) ferme ton formulaire. Il est donc normal qu'après l'appel à MessageBox tu te retrouves dans ton interface principale. Vérifie ton identifiant du bouton Valider.
    Merci de vos précieuses remarques
    Des idées en ce qui concerne le problème de conversion ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'ai trouvé la solution du problème de conversion aussi (pour ceux qui vont consulter ce sujet dans l'avenir)
    Il faut procéder comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // var = La variable contenant votre valeur numérique
    strIMP.Format(_T("%d"),var); // Pour les int
    strIMP.Format(_T("%f"),var); // Pour les float
    strIMP.Format(_T("%.*f"),2,var); // Pour spécifier le nombre de la décimale (2 dans ce cas)
    Après, vous concaténer les chaines de caractères

Discussions similaires

  1. problème fermeture MessageBox
    Par duguek dans le forum C++
    Réponses: 1
    Dernier message: 12/07/2007, 12h30
  2. Problème de MessageBox
    Par touys dans le forum MFC
    Réponses: 3
    Dernier message: 25/05/2007, 00h03
  3. Réponses: 2
    Dernier message: 02/04/2007, 18h49
  4. Problème avec MessageBox.Show
    Par A&Nexus dans le forum Windows Mobile
    Réponses: 4
    Dernier message: 02/01/2007, 13h57
  5. Réponses: 3
    Dernier message: 28/12/2006, 15h06

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