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 de récupération des valeurs des controles d'une boite de dialogue


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut problème de récupération des valeurs des controles d'une boite de dialogue
    bonjour,
    je suis récemment passé sous Visual C++ 2005 (j'étais auparavant sous VC++ 6.0) et je rencontre des problèmes pour des opérations de bases.

    j'ai créé une boite dialogue toute simple associée à la classe CDialTranslation et ayant un champ de type edit box auquel j'ai associé la variable m_distance (type int). J'apelle cette boite de dialogue avec un évènement sur un item du menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CAnimationDoc::OnSimpleTranslation()
    {
    DialTranslation dial; 
    dial.DoModal();
    if( dial.m_distance > 512)
    AfxMessageBox("vous devez rentrer une distance inférieur à 512 pixels");
    }
    Sous VC++ 6 après avoir lancé la fonction DoModal je récupérais le nombre rentré par l'utilisateur dans la variable dial.m_distance, or sous VC++2005 cette variable renvoi 0 dans tous les cas.
    On m'a conseillé de rajouter un UpdateData(TRUE) dans le OnOK() associé, mais je ne trouve pas l'équivalent du MFC ClassWizard pour rajouter une foction liée à la boite de dialogue?! j'ai donc tapé ce code "à la main" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CDialTranslation::OnOK()
    {
    	UpdateData(TRUE);
    	CDialog::OnOK();
    }
    et résultat ça ne change strictement rien.
    je rappelle que le précédent code marchait parfaitement sous VC++ 6.0 et donc que je ne débute pas en MFC, mais cette nouvelle version de Visual me fait perdre tous mes repères puisque plus rien ne marche!

    besoin d'aide svp
    merci!

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par atomicJo Voir le message
    On m'a conseillé de rajouter un UpdateData(TRUE) dans le OnOK() associé, mais je ne trouve pas l'équivalent du MFC ClassWizard pour rajouter une foction liée à la boite de dialogue?! j'ai donc tapé ce code "à la main"
    J'ose espérer que pour toi, "à la main" ne signifie pas juste rajouter la fonction dans le .cpp et la déclarer dans l'entête de la classe...
    De toute façon, le fonctionnement sous 2005 est légèrement différent.
    Il n'y a pas de ClassWizard comme dans VC6.0. Pour ajouter les fonctions type OnXX(), il faut que tu te positionnes dans le fichier d'implémentation de la classe de ta boîte de dialogue. Tu verras alors dans la fenêtre des propriétés les icônes suivants : un éclair et plus loin une espèce de cube gris. C'est dans celui-ci que se trouve les méthodes disponibles pour ta classe, dont le OnOK().

    Mais de toute façon, pour ton problème, je te conseille juste de faire le UpdateData(true) quand tu as besoin de récupérer la valeur (pas forcément dans le OnOk)et elle sera importée dans ta variable.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    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
    salut,
    tu places ton curseur sur la ligne ou juste en dessous :
    et tu fais ALT+entrée pour faire apparaitre l'onglet propriétés.
    tu clic sur le bouton gris et tu ajoutes le message OnOk .

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    J'ose espérer que pour toi, "à la main" ne signifie pas juste rajouter la fonction dans le .cpp et la déclarer dans l'entête de la classe...
    J'avais effectivement fais cela, et je viens de rajouter l'évènement OnOK grâce à la manip que vous m'avez donné (fastidieuse, il faut se placer pile entre le BEGIN_MESSAGE_MAP et le END_MESSAGE_MAP pour voir apparaitre le carré gris dans les propriétés) et cela rajoute bien uniquement le corps de la méthode dans le .cpp et sa déclaration dans le .h
    Toujours est-il que j'en suis toujours au même point, la variable n'est pas mise à jour

    Citation Envoyé par spoutspout Voir le message
    Mais de toute façon, pour ton problème, je te conseille juste de faire le UpdateData(true) quand tu as besoin de récupérer la valeur (pas forcément dans le OnOk)et elle sera importée dans ta variable.
    j'ai essayé de faire mon UpdateData(TRUE) juste après le DoModal() de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CAnimationDoc::OnSimpleTranslation()
    {
    DialTranslation dial; 
    dial.DoModal();
    dial.UpdateData(TRUE);
    if( dial.m_distance > 512)
    AfxMessageBox("vous devez rentrer une distance inférieur à 512 pixels");
    }
    mais j'ai cette fois-ci j'ai une erreur lorsque je valide la boite de dialogue.
    Une autre idée pour placer mon UpdateData(TRUE) ?
    ps:ce VC++ 2005 va me rendre dingue

  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
    montre nous le code de ta boite de dialogue (sans le constructeur / destructeur).

  6. #6
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par atomicJo Voir le message
    j'ai essayé de faire mon UpdateData(TRUE) juste après le DoModal() de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CAnimationDoc::OnSimpleTranslation()
    {
    DialTranslation dial; 
    dial.DoModal();
    dial.UpdateData(TRUE);
    if( dial.m_distance > 512)
    AfxMessageBox("vous devez rentrer une distance inférieur à 512 pixels");
    }
    Par définition, ta fenêtre est terminée à la fin du DoModal(). Faire un UpdateData() derrière ne servira à rien car ta fenêtre sera détruite et les champs n'existeront plus. Il faut que tu le places dans la classe de ta boîte de dialogue, en interceptant le message WM_DESTROY par exemple (pour mettre à jour tes variables au moment de la fermeture de la fenêtre). Un petit accesseur sur ces variables que tu utilises une fois ta fenêtre fermée et zou, emballé c'est pesé
    Citation Envoyé par atomicJo
    mais j'ai cette fois-ci j'ai une erreur lorsque je valide la boite de dialogue.
    Quelle erreur?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  7. #7
    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
    pourquoi avoir changer ? ,le updateData était très bien dans OnOK,
    il te manque un peu de lecture sur le sujet ...
    je t'ai conseillé mon tuto sur les MFC même si c'est avec VC6.0 le code reste le même qu'avec VC2005.
    il y a aussi la faq :
    http://cpp.developpez.com/faq/vc/?pa...nge#UpdateData
    http://cpp.developpez.com/faq/vc/?pa...ToWorkWithCtrl

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    salut je viens de voir en fouillant dans le code et en lisant la faq que je n'ai pas de lignes de codes concernant mes controles dans la fonction DoDataExchange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CDialTranslation::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    or dans la faq il y a bien une ligne pour chaque controles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CBnqView::DoDataExchange(CDataExchange* pDX)
    {
        CMyFormView::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CBnqView)
        DDX_Control(pDX, IDC_CEDITCDEBNQ, m_EditCdeBnq);
        DDX_Control(pDX, IDC_CEDITCDEGUICHET, m_EditCdeGuichet);
        DDX_Control(pDX, IDC_CEDITDOM, m_EditDom);
       //………………………………………………….
       //}}AFX_DATA_MAP
    }

    ces lignes ne sont-elles pas censées être automatiquement créées par VC++
    ?
    le problème vient de là à votre avis?

  9. #9
    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
    oui ton probléme vient de la ,
    ces lignes sont générées automatiquement si tu utilises l'assistant pour associer une variable au contrôle:
    dans l'éditeur de ressources: sur le contrôle : clic droit ajouter une variable.

  10. #10
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Ces lignes sont ajoutées automatiquement quand tu associes une variable à un contrôle via l'éditeur de ressources.
    +1
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    a bah je suis content d'apprendre ça!!
    juste un petit détail : je suis toujours passé par l'assistant pour ajouter ma variable et pourtant il ne me rajoute pas ces lignes
    je vais essayer de les rajouter "à la main"

    edit :
    pour les paramètres de la méthode DDX_Control je ne suis pas sûr de savoir quoi mettre pour le dernier paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void DDX_Control(CDataExchange *pDX, int nIDC, CWnd & rControl)
    pour le premier paramètre je met simplement pDX
    pour le second j'ai mis le IDC associé à mon controle -> accessible dans les propriétés du controle (pas sûr de moi)
    pour le troisième je ne sais pas trop quoi mettre

  12. #12
    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
    Citation Envoyé par atomicJo Voir le message
    a bah je suis content d'apprendre ça!!
    juste un petit détail : je suis toujours passé par l'assistant pour ajouter ma variable et pourtant il ne me rajoute pas ces lignes
    je vais essayer de les rajouter "à la main"
    ce n'est pas normal , a mon avis il y a embrouille quelque part...
    ça ne m'est jamais arrivé...

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    je vous assure que si, dans l'éditeur de ressource je clique droit sur la zone de mon controle et "ajouter variable", voici un screen :
    http://img251.imageshack.us/my.php?image=variq1.png

    pourriez-vous me renseigner pour taper le code à la main (j'avais fait un edit dans le précédent message)

    merci

  14. #14
    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
    normal...
    il faut que tu laisses cocher: "variable du contrôle" et que tu sélectionnes a droite dans le catégorie : value.
    après tu choisis un int etc...

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    arggg j'avais lu "variable de controle" voila pourquoi je la décochai ce qui me donnai en plus accès aux variables de type int etc ce qui m'a induit en erreur

    merci pour votre patience en tout cas!

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

Discussions similaires

  1. [Toutes versions] Comment comparer la valeur d'un control d'une boite de dialogue avec celui d'un formulaire?
    Par samgione dans le forum Macros Access
    Réponses: 4
    Dernier message: 17/05/2013, 22h19
  2. Réponses: 6
    Dernier message: 07/06/2011, 14h26
  3. Réponses: 2
    Dernier message: 30/03/2011, 03h07
  4. Réponses: 5
    Dernier message: 15/06/2007, 11h58
  5. [MySQL] problème avec la récupération des valeurs des variables POST
    Par Jasmine80 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 11/05/2007, 16h08

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