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] Pourquoi ça plante ? (Problème avec les variables de contrôle)


Sujet :

MFC

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut [MFC] Pourquoi ça plante ? (Problème avec les variables de contrôle)
    Salut,

    J'essaye d'utiliser le formalisme des variables de contrôle ( 'DoDataExchange', DDXControl...) et j'ai un problème lorsque j'utilise un contrôle appartenant à un dialog créé à partir d'un autre (assertion sur m_hWnd).

    Est ce qu'une bonne âme pourrait jeter un oeil à mon code VC++ 2005 ci-joint et me dire comment faire pour utiliser correctement la variable de contrôle m_cListCtrl ?

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Je crois que tu utilises les contrôles d'une boite de dialogue qui n'est plus affiché à l'écran dans une autre boite qui elle est affiché à l'écran. D'où des assertions sur le m_hWnd

    Un contrôle de ta boite ne peut être utiliser que tant qu'il est affiché ie m_hWnd != NULL. Si tu fermes ta boite mais sans détruire l'objet dialogue, le m_hWnd n'est plus valide.

    Si je ne m'abuse car je n'ai pas encore examiner ton zip.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Gabrielly
    Je crois que tu utilises les contrôles d'une boite de dialogue qui n'est plus affiché à l'écran dans une autre boite qui elle est affiché à l'écran. D'où des assertions sur le m_hWnd

    Un contrôle de ta boite ne peut être utiliser que tant qu'il est affiché ie m_hWnd != NULL. Si tu fermes ta boite mais sans détruire l'objet dialogue, le m_hWnd n'est plus valide.

    Si je ne m'abuse car je n'ai pas encore examiner ton zip.
    Les deux dialogs restent affichés, j'appelle le DoModal() du deuxième depuis un bouton du premier.

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Montre nous alors directement le code qui pose un blème

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Gabrielly
    Montre nous alors directement le code qui pose un blème

    En l'occurence c'est la ligne suivante :
    m_cListCtrl.GetClientRect(&rect);

    car GetClientRect fait une assertion sur m_hWnd :
    (_AFXWIN_INLINE void CWnd::GetClientRect(LPRECT lpRect) const
    { ASSERT(::IsWindow(m_hWnd)); ::GetClientRect(m_hWnd, lpRect); }

    Mais en fait à peu près n'importe quelle commande ferait ça...

    Le problème c'est qu'à partir du moment où mon dialog n'est pas créé par l'appli principale j'ai m_hWnd = NULL. Claiement je ne fais pas comme il faut mais je me demande dans ce cas comment faire...

  6. #6
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    En l'occurence c'est la ligne suivante :
    m_cListCtrl.GetClientRect(&rect);
    Est-ce que m_cListCtrl est de la première boite de dialogue que tu utilises dans l'autre boite de dialogue?

  7. #7
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Pourquoi tu ne t'arranges pas à récupérer le rect dans Dlg1 ensuite l'utiliser dans Dlg2.

    Il est bien si pas mieux pour les variables de catégorie contrôles de les mettre soit protected ou private afin de ne pas les utiliser en dehors de leur classe mère. Et si on a besoin d'une variable de type simple comme CRect on l'a transmet simplement sans faire passer tout le controle en dehors de sa classe mère (sa boite de dlg).
    Je crois que tu comprends ce que je veux dire.

  8. #8
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Gabrielly
    Pourquoi tu ne t'arranges pas à récupérer le rect dans Dlg1 ensuite l'utiliser dans Dlg2.

    Il est bien si pas mieux pour les variables de catégorie contrôles de les mettre soit protected ou private afin de ne pas les utiliser en dehors de leur classe mère. Et si on a besoin d'une variable de type simple comme CRect on l'a transmet simplement sans faire passer tout le controle en dehors de sa classe mère (sa boite de dlg).
    Je crois que tu comprends ce que je veux dire.
    Oui je comprends tout à fait ça, mais comme je l'ai dit le souci dépasse le cadre de l'appel à GetClientRect. Le vrai problème c'est que mon dialog "père" a un m_hWnd pour lequel IsWindow() renvoie "true" contrairement à mon dialog "fils" ... et ça m'empêche de faire plein d'appels de fonctions (dont GetClientRect). En gros je voudrais que le dialog "fils" se comporte comme le "père" et pour une raison que j'aimerais connaître ce n'est pas le cas.

  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
    Bonjour,

    rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDialog::OnInitDialog();
    En première ligne de ton AutreDialog::OnInitDialog();
    Si tu ne fais pas ça, le DoDataExchange n'est pas appelé.

Discussions similaires

  1. problème avec les variables de la méthode GET
    Par will97 dans le forum Langage
    Réponses: 11
    Dernier message: 11/12/2007, 14h43
  2. Problème avec les variables en PHP
    Par King_T dans le forum Langage
    Réponses: 3
    Dernier message: 06/05/2006, 23h46
  3. Problèmes avec les variables et les unités
    Par christoufe dans le forum EDI
    Réponses: 2
    Dernier message: 22/01/2006, 16h22
  4. Problèmes avec les variables final
    Par casolaro dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2004, 14h29
  5. Réponses: 6
    Dernier message: 28/05/2004, 09h39

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