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]lancer plusieurs fois la même CDialog en DoModal


Sujet :

MFC

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut [MFC]lancer plusieurs fois la même CDialog en DoModal
    Bonjour,

    Je voudrai lancer plusieurs fois d'affilée la même CDialog en DoModal

    dois je faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DMyDialog *MyDialog;
     
    MyDialog = new DMyDialog;
     
    MyDialog.DoModal()
     
    delete MyDialog;
     
    MyDialog = new DMyDialog;
     
    MyDialog.DoModal()
     
    delete MyDialog;
    ou comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DMyDialog *MyDialog;
     
    MyDialog = new DMyDialog;
     
    MyDialog.DoModal()
     
    MyDialog = new DMyDialog;
     
    MyDialog.DoModal()
     
    delete MyDialog;
    Apparemment je peux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyDialog.DoModal()
    MyDialog.DoModal()
    ca plante - Que fait le DoModal quand la fenetre est fermé du coup, il libere l'objet créé avec new ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 35
    Par défaut
    avec un pointeur, on doit écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DMyDialog *MyDialog; 
     
    MyDialog = new DMyDialog; 
     
    MyDialog->DoModal() ;
     
    delete MyDialog; 
     
    MyDialog = new DMyDialog; 
     
    MyDialog->DoModal() ;
     
    delete MyDialog;
    et il ne libère pas la mémoire à la fin de la boucle modale.


    edit findwin: c'est mieux avec les point virgule

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    ben alors pourquoi on ne peut pas l'utiliser plusieurs fois d'affilé si la mémoire n'est pas libérée ?

    c'est nul !

  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
    Tu ne peux pas compiler ce que tu post.


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 35
    Par défaut
    la fonction DoModal attend la fermeture de la fenetre par un appel à la fonction EndModalLoop, il faut donc instancier les deux fenêtre et les executer sur des threads différents

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    Tu ne peux pas compiler ce que tu post.
    comment ca ?

    jte suis pas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 35
    Par défaut
    y a des erreurs dans le code que tu as posté,pas de ; après DoModal par exemple...

  8. #8
    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
    pourquoi tu ne le fais pas dans un for tes domodal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for( int i = 0; i<5; i++)
    {
     
    DMyDialog dlg;
    dlg.DoModal();
    }
    ca devrait fonctionner ca, non ?

    NB: le seul interet que je vois à ca c'est de faire un reset de ta dlg. Autant l'implémenter directement dans ta dialog

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    En fait, ça dépend de ce que tu veux faire.
    La solution de "la drogue c'est mal" t'ouvre une dlg en modal, mais tu dois d'abord la fermer avant de continuer la boucle for.

    Si tu veux ouvrir plusieurs dialog (en modal) en même temps, tu va être obligé d'utiliser des threads, car le DoModal est bloquant. (Il y a peut-être moyen de feinter en jouant avec les messages, mais je ne crois pas).

    Hope it helps.

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    ok, sorry, j'avait tapé le code en direct sur le forum, c'etait pas un copier-coller d'ou l'erreur de , -> ;

    en fait, je voulais en faire plusieurs fois d'affilée car le code de l'init de la modale est un peu long, c'etait pour l'initialiser une fois et l'utiliser en modale plusieurs fois, (nb - le blocant m'est necessaire d'ou la modalité )

    c'est pas possible ?

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaDlg dlg = new MaDlg();
    dlg.Init();
    for (int i=0; i<count; i++)
    {
        dlg.DoModal();
    }

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    error C2039: 'Init' : is not a member of 'DlAnimAttente'
    Tu es sur de ton Init ?

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Ho, j'ai mis Init comme ça... C'est à toi de créer cette méthode pour initialiser ton objet.

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    Je n'ai rien à initialiser dedans, c'est juste un popup d'attente

    mais ca marche pas ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	DlRecapitulatif dMenuA = new DlRecapitulatif(NULL);
    	for (int i=0; i<10; i++)
    	{
    		dMenuA.DoModal();
    	}
    le premier passe, et quand on le ferme, le second DoModal donne :

    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Assertion Failed!

    Program: ... documents\Visual Studio Projects\Test\Debug\Test.exe
    File: dlgcore.cpp
    Line: 419

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)
    ---------------------------
    Abandonner Recommencer Ignorer
    ---------------------------

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Pourrais-tu poster le code (déclaration+implémentation) du constructeur de DlRecapitulatif?

  16. #16
    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
    Je ne comprends pas comment tu peux écrire ce code !
    Si tu veux que l'on t'aide pitié post du code correct, car il est impossible que celui-ci ait pu être exécuté !
    Ça nous évitera de perdre du temps en conjonctures inutiles.
    Un raisonnement de debuggage ne peut être fait que si les éléments apportés à notre lecture sont ceux qui sont exécutés.


  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    Désolé,

    je voulais juste épurer mon code histoire de poster quece que je penser poser probleme,

    la classe que je voudrais lancer plusieurs fois d'affilée est arreté uniquement par l'envoi d'un message par un thread,

    cette CDialog affiche en fait une animation (pour "visualiser" une telechargement)

    sa definition :
    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
     
    #pragma once
    #include "afxwin.h"
    #include "constante.h"
    #include "DigiDialog.h"
     
     
    // DlAnimAttente dialog
     
    class DlAnimAttente : public CDigiDialog
    {
    	DECLARE_DYNAMIC(DlAnimAttente)
     
    public:
    	DlAnimAttente(CWnd* pParent = NULL);   // standard constructor
    	virtual ~DlAnimAttente();
     
    // Dialog Data
    	enum { IDD = IDD_DlAnimAttente };
     
    	void ChangeBitmap(int iBitmap = 0);
     
    protected:
    	virtual BOOL OnInitDialog();
    	virtual void OnOK();
    	virtual void OnCancel();
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     
    	DECLARE_MESSAGE_MAP()
    public:
    	CStatic m_Image;
    private:
    	CBitmap Bmp1, Bmp2, Bmp3,  Bmp4,  Bmp5, Bmp6, Bmp7, Bmp8;
    	int p_iBmpIndex;
    	BOOL bQuit;
    	LRESULT OnEndThread(WPARAM, LPARAM lParam);
    public:
    	afx_msg void OnTimer(UINT nIDEvent);
    };
    son 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
    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
    // DlAnimAttente.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "Digitick.h"
    #include "DlAnimAttente.h"
    #include ".\dlanimattente.h"
     
     
    // DlAnimAttente dialog
     
    IMPLEMENT_DYNAMIC(DlAnimAttente, CDigiDialog)
    DlAnimAttente::DlAnimAttente(CWnd* pParent /*=NULL*/)
    : CDigiDialog(DlAnimAttente::IDD, pParent, IDB_BITMAP1)
    {
    }
     
    DlAnimAttente::~DlAnimAttente()
    {
    }
     
    void DlAnimAttente::DoDataExchange(CDataExchange* pDX)
    {
    	CDigiDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_ANIMATION, m_Image);
    }
     
    void DlAnimAttente::OnOK()
    {
    	if (bQuit) 
    	{
    		KillTimer(ID_TIMER_ANIMATION);
    		CDigiDialog::OnOK();
    	}
    }
     
    void DlAnimAttente::OnCancel()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(DlAnimAttente, CDigiDialog)
    	ON_MESSAGE(WM_END_THREAD, OnEndThread)
    	ON_WM_TIMER()
    END_MESSAGE_MAP()
     
     
    LRESULT DlAnimAttente::OnEndThread(WPARAM, LPARAM lParam)
    {
    	bQuit = TRUE;
    	OnOK();
        return 0;
    }
     
    BOOL DlAnimAttente::OnInitDialog()
    {
    	CDigiDialog::OnInitDialog();
     
     
    	p_iBmpIndex = 1;
     
    	bQuit = FALSE;
     
    	Bmp1.LoadBitmap(IDB_BITMAP_ANIMWAIT_1);
    	Bmp2.LoadBitmap(IDB_BITMAP_ANIMWAIT_2);
    	Bmp3.LoadBitmap(IDB_BITMAP_ANIMWAIT_3);
    	Bmp4.LoadBitmap(IDB_BITMAP_ANIMWAIT_4);
    	Bmp5.LoadBitmap(IDB_BITMAP_ANIMWAIT_5);
    	Bmp6.LoadBitmap(IDB_BITMAP_ANIMWAIT_6);
    	Bmp7.LoadBitmap(IDB_BITMAP_ANIMWAIT_7);
    	Bmp8.LoadBitmap(IDB_BITMAP_ANIMWAIT_8);
     
    	SetTimer(ID_TIMER_ANIMATION, 100, NULL); 
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
    void DlAnimAttente::ChangeBitmap(int iBitmap)
    {
    	if (iBitmap == 0)
    		p_iBmpIndex++;
    	else
    		p_iBmpIndex = iBitmap;
     
    	if (p_iBmpIndex < 1) p_iBmpIndex = 1;
    	if (p_iBmpIndex > 8) p_iBmpIndex = 1;
     
    	switch(p_iBmpIndex)
    	{
    	case 1: m_Image.SetBitmap(Bmp1);
    			break;
    	case 2: m_Image.SetBitmap(Bmp2);
    			break;
    	case 3: m_Image.SetBitmap(Bmp3);
    			break;
    	case 4: m_Image.SetBitmap(Bmp4);
    			break;
    	case 5: m_Image.SetBitmap(Bmp5);
    			break;
    	case 6: m_Image.SetBitmap(Bmp6);
    			break;
    	case 7: m_Image.SetBitmap(Bmp7);
    			break;
    	case 8: m_Image.SetBitmap(Bmp8);
    			break;
    	}
    }
     
    void DlAnimAttente::OnTimer(UINT nIDEvent)
    {
    	if (nIDEvent == ID_TIMER_ANIMATION)
    	{
    		ChangeBitmap();
    	}
     
    	CDigiDialog::OnTimer(nIDEvent);
    }
    pour debugguer ma boucle qui la test, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	DlAnimAttente dlgWait;
    	for (int i=0; i<10; i++)
    	{
    		dlgWait.DoModal();
    	}
    	delete dlgWait;
    et je rajoute dans la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void DlAnimAttente::OnCancel()
    {
    	KillTimer(ID_TIMER_ANIMATION);
    	CDigiDialog::OnCancel();
    }

  18. #18
    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
    pourquoi tu n'utilises pas un gif animé ?

  19. #19
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    lol jsais pas faire

    javais ces images ... j'ai pas utilisé autre chose

  20. #20
    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
    création de gif :

    http://www.google.fr/search?hl=fr&q=cr%C3%A9ation+de+gif&meta=

    afficher un gif

    http://www.cplusplus.com/src/wingif.zip

Discussions similaires

  1. [Débutant] Lancer plusieurs fois le même projet
    Par Jazz_ dans le forum C#
    Réponses: 2
    Dernier message: 06/12/2011, 12h37
  2. Ne pas lancer une interface plusieurs fois en même temps
    Par Le Marlou dans le forum Interfaces Graphiques en Java
    Réponses: 11
    Dernier message: 26/01/2010, 11h34
  3. [JFrame] réafficher plusieurs fois un même panel à l'écran
    Par Monkeyget dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 01/04/2005, 14h29
  4. SELECT plusieurs fois les mêmes champs
    Par aergil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/02/2005, 12h10
  5. [VB.NET] Appliquer plusieurs fois la même fonction...
    Par MiJack dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/09/2004, 10h52

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