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 d'appels d'une variable entre fonctions


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut Problème d'appels d'une variable entre fonctions
    Bonjour,

    Voilà mon problème :
    J'ai une classe CRequetes, j'ai déclaré
    public : CString nom; dans Requetes.h
    J'ai une fonction void CRequetes::affiche() dans laquelle je modifie nom :
    nom="julien";
    Je l'affiche AfxMessageBox(nom); L'affichage se passe bien

    Mais dans une autre fonction void CRequetes::affiche2() je veux l'afficher en faisant AfxMessageBox(nom); et il m'affiche une chaine vide.

    Mais pourquoi ça ne marche pas ??

  2. #2
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    salut
    declare ton CString nom dans le fichier global.h

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Je n'ai pas de fichier global.h (c'est un projet MFC/MDI)

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu es sur de ne pas avoir instancié un autre objet de ta classe ?

  5. #5
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Ma classe CRequetes sert à manipuler une dialogbox
    elle est dérivée de CDialog
    class CRequetes : public CDialog
    est-ce que le problème viendrait de là ?

  6. #6
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    je suis dsl mais je crois qu'il nous manque des éléments pour te répondre est ce que tu pourrais montrer ou ces methodes sont appelées par exemple ?
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Voilà les fichiers requetes.cpp et requetes.h
    CString nom est déclaré en public dans requetes.h
    je défini nom="julien" dans requetes.cpp
    dans la fonction ComboGraphes, julien s'affiche
    dans la fonction oninitdialog, c'est une chaine vide qui s'affiche

    fichier requetes.cpp
    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
     
    // Requetes.cpp : implementation file
    //
    #include "stdafx.h"
    #include "prog.h"
    #include "Requetes.h"
    #include "base.h"
    #include "ADOLib.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    /////////////////////////////////////////////////////////////////////////////
    // CRequetes dialog
     
    CRequetes::CRequetes(CWnd* pParent /*=NULL*/)
     : CDialog(CRequetes::IDD, pParent)
    {
     //{{AFX_DATA_INIT(CRequetes)
     m_Date_Recherche_Value = 0;
     m_RechercheType = _T("");
     m_RechercheCle = _T("");
     m_FiltrerType = _T("");
     m_FiltrerGraphe = _T("");
     m_FiltrerCle = _T("");
     //}}AFX_DATA_INIT
    }
     
    void CRequetes::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CRequetes)
     DDX_Control(pDX, IDC_COMBO2, m_RechercheGrapheControl);
     DDX_Control(pDX, IDC_DATETIMEPICKER1, m_Date_Recherche_Control);
     DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_Date_Recherche_Value);
     DDX_CBString(pDX, IDC_COMBO1, m_RechercheType);
     DDX_CBString(pDX, IDC_COMBO3, m_RechercheCle);
     DDX_CBString(pDX, IDC_COMBO4, m_FiltrerType);
     DDX_CBString(pDX, IDC_COMBO5, m_FiltrerGraphe);
     DDX_CBString(pDX, IDC_COMBO6, m_FiltrerCle);
     //}}AFX_DATA_MAP
    }
     
    BEGIN_MESSAGE_MAP(CRequetes, CDialog)
     //{{AFX_MSG_MAP(CRequetes)
     ON_BN_CLICKED(IDOK2, OnOk2)
     ON_BN_CLICKED(IDOK3, OnOk3)
     ON_BN_CLICKED(IDCANCEL2, OnCancel2)
     ON_BN_CLICKED(IDCANCEL3, OnCancel3)
     ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER1, OnDatetimechangeDatetimepicker1)
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CRequetes message handlers
    void CRequetes::OnOK() 
    {
      int nRetCode=IDOK;
      UpdateData();
      EndDialog( nRetCode );
    }
    void CRequetes::OnOk2() 
    {
     int nRetCode=IDOK2;
     UpdateData();
     EndDialog( nRetCode );
    }
    void CRequetes::OnOk3() 
    {
     int nRetCode=IDOK3;
     UpdateData();
     EndDialog( nRetCode );
    }
    void CRequetes::OnCancel() 
    {
     CDialog::OnCancel();
    }
    void CRequetes::OnCancel2() 
    {
     CDialog::OnCancel(); 
    }
    void CRequetes::OnCancel3() 
    {
     CDialog::OnCancel(); 
    }
    void CRequetes::ComboGraphes(ADOConnect* myConn)
    {
     nom="julien";
     AfxMessageBox(nom);
    }
    void CRequetes::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
     NMDATETIMECHANGE *pDTChange= reinterpret_cast<NMDATETIMECHANGE *>(pNMHDR);
        if (pDTChange->dwFlags==GDT_NONE)
      //AfxMessageBox(" case décochée ! ");
      etat_case=false;
      else if (pDTChange->dwFlags==GDT_VALID)
      //AfxMessageBox(" case cochée ! ");
      etat_case=true;
        *pResult = 0;
    }
    BOOL CRequetes::OnInitDialog() 
    {
     CDialog::OnInitDialog();
     AfxMessageBox(nom);
     return TRUE;  // return TRUE unless you set the focus to a control
                   // EXCEPTION: OCX Property Pages should return FALSE
    }
    fichier requetes.h
    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
     
    #if !defined(AFX_REQUETES_H__EBC09B53_AF2A_46AA_82B6_FC1B6C47233C__INCLUDED_)
    #define AFX_REQUETES_H__EBC09B53_AF2A_46AA_82B6_FC1B6C47233C__INCLUDED_
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // Requetes.h : header file
    //
    #include "ADOLib.h"
    /////////////////////////////////////////////////////////////////////////////
    // CRequetes dialog
    class CRequetes : public CDialog
    {
    // Construction
    public:
     CRequetes(CWnd* pParent = NULL);   // standard constructor
     void ComboGraphes(ADOConnect* myConn);
     bool etat_case;
     CStringArray remplir_combo;
    // Dialog Data
     //{{AFX_DATA(CRequetes)
     enum { IDD = IDD_DIALOG1 };
     CComboBox m_RechercheGrapheControl;
     CDateTimeCtrl m_Date_Recherche_Control;
     CTime m_Date_Recherche_Value;
     CString m_RechercheType;
     CString m_RechercheCle;
     CString m_FiltrerType;
     CString m_FiltrerGraphe;
     CString m_FiltrerCle;
     //}}AFX_DATA
    public:
     CString nom;
    // Overrides
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CRequetes)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     //}}AFX_VIRTUAL
    // Implementation
    protected:
     // Generated message map functions
     //{{AFX_MSG(CRequetes)
     virtual void OnOK();
     afx_msg void OnOk2();
     afx_msg void OnOk3();
     virtual void OnCancel();
     afx_msg void OnCancel2();
     afx_msg void OnCancel3();
     afx_msg void OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult);
     virtual BOOL OnInitDialog();
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
    };
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    #endif // !defined(AFX_REQUETES_H__EBC09B53_AF2A_46AA_82B6_FC1B6C47233C__INCLUDED_)

  8. #8
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    OnInitDialog est appelée avant ComboGraphes, non ?

    Donc il faut mettre nom="julien"; dans OnInitDialog.
    L'itération est humaine; la récursion, divine.

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    non justement, OnInitDialog est appelée APRES ComboGraphes

  10. #10
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    J'arrive pas à voir d'où vient le problème

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    Par quel biais ComboGraphes est appelée avant OnInitDialog?
    si dans le code tel que tu la posté ,AfxMessageBox n'affiche rien c'est que la variable n'a pas ete initialisée a sa valeur ou elle a été réinitialisée entre temps.

    il n'y a pas d'autres solutions.
    Pour s'assurer de l'ordonnancement des appels tu peux placer un point d'arrêt dans chaque fonction concernée et vérifier l'ordre d'appel.

  12. #12
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    En fait, c'est un petit peu compliqué, mais pour faire simple :

    j'ouvre un fichier, pour cela, j'ai OnFileOpen dans CMainFrame qui fait appel à une fonction du document (fonction de traitement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CMainFrame::OnFileOpen() 
    {
     CmonprogDoc* mondoc;
     mondoc = new CmonprogDoc;
     mondoc->affiche();
     
    }
    Ensuite, la fonction de traitement dans monprogDoc appelle automatiquement combographes de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CRequetes req;
    req.ComboGraphes(myConn);
    Tout ça a été fait en allant dans le menu fichier->ouvrir.
    maintenant, en allant dans le menu fichier->requetes, j'ouvre une boite de dialogue de la classe CRequetes.

    cela déclenche la fonction OnRequetes se trouvant dans CMainFrame qui elle-même appelle la classe CRequetes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CMainFrame::OnReq() 
    {
     CRequetes req;
     int res = req.DoModal();
    ...
    C'est ici que le OnInitDialog est appelé

    PS : j'ai vérifié l'ordonnancement des fonctions en mettant
    1) AfxMessageBox("combographes") dans ComboGraphes
    2) AfxMessageBox("OnInitDialog") dans OnInitDialog
    et combographes s'affiche bien avant OnInitDialog

    Je veux bien que la variable "nom" se réinitialise entre combographes et OnInitDialog mais je ne vois pas comment et pourquoi ?

  13. #13
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Bon ben ça y est, je crois que j'ai enfin trouvé lol, mais bon c'était pas si évident.

    J'ai fais plusieurs erreurs.

    Je fais des appels à ComboGraphes et OnInitDialog à partir des classes CMainFrame et CmonprogDoc en déclarant les objets CRequetes req; Or apparemment, il vaut mieux déclarer des pointeurs sur ces objets : CRequetes* req.

    Mais si je fais ça, il survient un nouveau problème : en effet, en déclarant les pointeurs, il faut les initialiser avec req = new CRequetes() et dans ce cas ma fameuse variable nom est aussi réinitialisée si je ne m'abuse.

    Il faut donc que je place ma fonction OnRequetes non pas dans CMainFrame mais dans CmonprogDoc et que je déclare en public (dans monprogDoc.h) CRequetes* req; et que j'initialise tout au début une seule fois dans CmonprogDoc req = new CRequetes();

    et là, apparemment ça marche, je remets en ordre tout ça et ça devrait être bon.

    ouf !

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

Discussions similaires

  1. [XL 2000] problème d'appel d'une variable
    Par Kelaydos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/09/2012, 13h44
  2. Réponses: 2
    Dernier message: 24/03/2009, 09h09
  3. problème d'appel d'une fonction d'une autre classe
    Par kifouillou dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2007, 17h42
  4. [Système] Problème d'appel d'une fonction
    Par Ministar dans le forum Langage
    Réponses: 8
    Dernier message: 19/09/2006, 22h23
  5. Réponses: 7
    Dernier message: 12/03/2006, 21h18

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