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 :

[MFC] étrange comportement de DoModal()


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut [MFC] étrange comportement de DoModal()
    Bonjour à tous,

    dans mon appli, j'utilise plusieurs dialogs, et je voudrait qu'elles suivent l'organisation suivante:

    1/démarrage de l'appli
    2/
    -> nRet1 = dialog1.DoModal()
    -> si nRet1 == IDCANCEL -> on quitte l'appli
    ---> sinon:
    3/ nRet2 = dialog2->DoModal()
    -> si nRet2 == IDOK -> retour au 2/

    et voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CDialog1 Dialog1();
    CDialog2 Dialog2();
    INT_PTR nRet1;
    INT_PTR nRet2 = IDOK;
    while (nRet2 !=IDCANCEL)
    {
    	nRet1 = Dialog1.DoModal();
    	if (nRet1==IDOK)
    	{
    		nRet2 = Dialog2.DoModal();
    	}
    }
    Et voici mon problème:
    - la première boucle, tout se passe bien.
    - à la deuxieme boucle, mon Dialog1.DoModal() ferme l'appli!!! oO Il ne retourne rien, il ferme sauvagement mon appli, sans message d'erreur rien! Il effectue le Dialog1::OnInitDialog() sans problème, et après il me ferme mon programme sans autre forme de procès!
    Et bien sûr, il m'est impossible de tracer le code après le OnInitDialog()

    Si vous avez une piste... merci

  2. #2
    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
    Par défaut
    salut,
    pour moi ,les objets dialogues supportent mal la reutilisation ...
    donc fait en sorte d'avoir un nouvel objet a chaque nouvelle boucle.
    essaie ça pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    INT_PTR nRet1;
    INT_PTR nRet2 = IDOK;
    while (nRet2 !=IDCANCEL)
    {
     CDialog1 Dialog1;
     CDialog2 Dialog2;
     
       nRet1 = Dialog1.DoModal();
       if (nRet1==IDOK)
       {
          nRet2 = Dialog2.DoModal();
       }
    }

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    merci farscape

    mais ça ne marche pas (en fait, j'avais déjà essayé). Peut-être faudrait-il forcer la destruction de mes Dialogs à la fin de la boucle? Mais je n'y arrive pas

  4. #4
    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
    Par défaut
    alors mets des pointeurs sur dialog que tu detruis a chaque iteration.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    erf, maintenant, le pDialog1->DoModal() me renvoie -1 et ma pDialog1 ne s'affiche pas
    mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INT_PTR nRet1; 
    INT_PTR nRet2 = IDOK; 
    while (nRet2 !=IDCANCEL) 
    { 
     CDialog1 pDialog1 = new CDialog1(); 
     CDialog2 Dialog2; 
     
       nRet1 = pDialog1->DoModal(); 
       if (nRet1==IDOK) 
       { 
          nRet2 = Dialog2.DoModal(); 
       } 
       delete pDialog1;
    }
    P.S: c'est toujours pareil: ça marche une fois impeccable, c'est à la 2eme boucle que ça ne marche plus.

  6. #6
    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
    Par défaut
    hum c'st bien CDialog1 *pDialog1 dans ton code ?
    c'est un peu bizarre ton pb .
    tu n'aurais pas oublier d'initialiser quelque chose dans cette classe ?

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    hum c'st bien CDialog1 *pDialog1 dans ton code ?
    ouioui, bien sûr, désolé: erreur de copier/coller.
    Citation Envoyé par farscape
    c'est un peu bizarre ton pb .
    tout à fait d'accord, d'autant plus que GetLastError() après le domodal (celui qui me retourne -1, ce qui signifie qu'il y a eu une erreur) me retourne 0 (no error).
    Citation Envoyé par farscape
    tu n'aurais pas oublier d'initialiser quelque chose dans cette classe ?
    Bah, ce qui est étrange, c'est que ça fonctionne bien une fois. M'enfin bon, il faut que je fouille encore. En réalité, ma pDialog1 hérite d'une classe quelque peu mystérieuse (et qui est propriété de ma boite donc je ne peux ps en parler) qui hérite de CDialog... enfin bref, je vais continuer à chercher.

    Il y a juste un truc: c'est que ma dialog s'affiche une milliseconde (enfin, juste le temps de la voir)... J'ai essayé d'aller dans le code machine pour tenter l'Xtrême Debug, mais l'asm c'est pas mon fort

  8. #8
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Est-ce que pDialog1 renvoie ID_OK? Au deuxième passage de la boulce, es-tu sûr que Ret2 est différent de ID_Cancel?

    Décidemment, cette dlg, elle t'en veut.

  9. #9
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    si tu ne sais pas utiliser le debugger utilise les MessageBox pour afficher les état de tes variables

    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
     
    CDialog1 Dialog1(); 
    CDialog2 Dialog2(); 
    INT_PTR nRet1; 
    INT_PTR nRet2 = IDOK; 
    CString strMessage;
     
    strMessage="Debut de la bouble avant le while";
    AfxMessageBox(strMessage);
     
    while (nRet2 !=IDCANCEL) 
    { 
       nRet1 = Dialog1.DoModal(); 
     
    strMessage.Format("nRet1 = %d",nRet1);
    AfxMessageBox(strMessage);
     
       if (nRet1==IDOK) 
       { 
          nRet2 = Dialog2.DoModal(); 
     
    strMessage.Format("nRet2 = %d",nRet1);
    AfxMessageBox(strMessage);
     
       } 
     
    strMessage="Fin de la boucle while";
    AfxMessageBox(strMessage);
     
    }
    IDOK vaut 1
    IDCANCEL vaut 2

    Au fait, tu mets ce bout de code ou dans ton appli :

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    Désolé pour de répondre si tard, on a eu un pb de connection cette apres-midi.

    Merci pour votre aide, mais finalement j'ai du me débrouiller autrement.
    Citation Envoyé par la drogue c'est mal
    si tu ne sais pas utiliser le debugger utilise les MessageBox pour afficher les état de tes variables
    lol. Je ne sais pas si c'est pour rigoler que tu as dis ça... comme je le disais un peu plus tôt dans le post, je suis même allé fouiner dans le code asm (le code machine) pour tenter de trouver d'où pouvait venir l'erreur. Et même si le debugger de visual est le meilleur que je connaisse, il a tout de même ses limites :p

    En tout cas, merci beaucoup, et une fois de plus, j'ai contourné le probleme en trouvant une autre façon de le résoudre. C'est le problème que j'ai en ce moment: des milestones trop proches pour perdre 5mn à comprendre un truc. Quand ça marche pas, il faut faire autrement... je n'aime vraiment pas programmer comme ça mais bon, je n'ai pas vraiment le choix.

    Encore merci.

  11. #11
    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
    Par défaut
    a mon avis ça cache quelque chose ,j'ai deja fais ce genre de chose sans problemes .

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    a mon avis ça cache quelque chose ,j'ai deja fais ce genre de chose sans problemes .
    Je suis d'accord avec toi... mais je... coment dire... (la suite par mp si tu veux bien)

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

Discussions similaires

  1. TFlowPanel étrange comportement
    Par Peck777 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 11/02/2009, 15h42
  2. Raccourci sur touche F10 - étrange comportement
    Par hulahup dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/04/2007, 12h12
  3. RequestDispatcher, étrange comportement
    Par hel22 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 22/02/2007, 15h33
  4. [MFC] Plantage au deuxieme DoModal() avec TIMER
    Par ricky78 dans le forum MFC
    Réponses: 3
    Dernier message: 25/09/2006, 16h17
  5. [MFC][CStdioFile] étrange comportement
    Par r0d dans le forum MFC
    Réponses: 11
    Dernier message: 08/02/2005, 13h32

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