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 :

CDialog::OnOk appele-t-il le destructeur de la classe?


Sujet :

MFC

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut CDialog::OnOk appele-t-il le destructeur de la classe?
    Bonjour,

    J'ai une appli avec boite de dialogue.
    Il y a une boite de dialogue dans laquelle j'alloue de la memoire.
    Cette boite est non modal. Je pensai que le OnOk() appelerait le destructeur mais ce n'est pas le cas. Et je comprend pas trop ceci:
    OnOK member function and call DestroyWindow from within it. Don't call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.
    Alors comment detruire completement une dialog box non modal apres un OnOk() ou OnCancel()?
    Je suis d'accord on pourrait appeler le delete dans la classe qui definit la dialog, mais si on cree la boite plusieurs fois dans une meme instance?

    J'ai penser a ceci, mais est-ce une bonne methode?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CMaDlg::OnOk()
    {
    CDialog::OnOk();
    delete this;
    }
    Merci de m'eclairer ou de me dire si je suis a l'ouest complet...

  2. #2
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    OnOk() lance la fonction EndDialog() qui a son tour fait un DestroyWindow().

    Aucune de ces fonctions n'appelle le destructeur

    Pour une boite modeless tu peux faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CMonDialogue::OnPostNcDestroy()
    {
      delete this;         // auto-destruction
    }
    c'est tout ...

    @+

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Ok merci pour l'info... mais c'est super space non? tout le monde fait comme ca?
    mfc libere pas la memoire tout seul? pourquoi il le fait pas directement?

  4. #4
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    c'est la solution la plus propre, et c'est d'ailleurs comme ça que fait les MFC pour les CView par ex.

    Un DestroyWindow(), envoi un WM_NCDESTROY (entre autres) et le gestionnaire par défaut des MFC renvoi sur OnPostNcDestroy() --> fonction destinée à la libération des ressources

    il ne faut pas confondre une fenetre avec son handle HWND et l'objet CWnd

    Bien qu'il soit associé, un CWnd est destiné à manipuler un HWND, l'objet CWnd peut servir a plusieurs HWND séquentiellement (pas simultanement) grace a Attach() et Detach().

    On peut attacher un HWND a un CWnd, travailler avec, puis liberer le CWnd pour y attacher une autre fenetre et ainsi de suite ...

    Dans la pratique ça ne se fait pas trop, un seul CWnd pour un seul HWND...

    @+

  5. #5
    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
    la boite de dialogue est non modale ,ce qui impliquera un création de l'objet par new .
    un objet MFC ou non ne se libérant jamais seul, qui mieux que la boite de dialogue elle même peut faire ce boulot ?
    sinon il faudrait conserver le pointeur et détecter sa fin de vie (par exemple avec l'envoi d'un message ) pour libérer l'objet.
    OnPostNcDestroy() permet de s'affranchir de ce probléme.

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Ok d'accord, ben merci pour les infos, maintenant je le saurai
    merci a vous

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/01/2013, 16h25
  2. Appel du destructeur d'une classe mère
    Par Beulard dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2010, 20h06
  3. Conseil du compilo sur un destructeur d'une classe
    Par okparanoid dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2005, 20h11
  4. [Interface] Appeller toutes les méthodes héritées d'un class
    Par thibaut.d dans le forum Général Java
    Réponses: 4
    Dernier message: 25/01/2005, 08h42

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