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 Variable globale


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 29
    Par défaut Problème de Variable globale
    Bonjour,

    Je travaille sur un projet utilisant les MFC.
    J'ai besoin de variables globales, mais j'ai lu un peu partout qu'il était déconseillé des les utiliser.

    J'ai donc suivi des indications trouvées sur ce site et j'ai procédé de la manière suivante:

    MyApp.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class MyApp : public CWinApp
    {
      public: 
            CString VarGlobale1;
            CString VarGlobale2;
    };
    MyApp.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MyApp.h"
     
    BOOL MyApp::InitInstance()
    {
      VarGlobale1 = "blabla";
      VarGlobale2 = "blabla";
    }
    MyAppView.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "MyApp.h"
    extern MyApp theApp;
     
    void MyAppView::OnInitialUpdate()
    {
      m_Affichage_VarGlobale1 = theApp.VarGlobale1;
      m_Affichage_VarGlobale2 = theApp.VarGlobale2;
    }
    Sachant que m_Affichage_VarGlobale1 et 2 sont les variables de type CString associées à des contrôles de type Static.

    Le problème, c'est que les contrôles n'affichent rien!

    Auriez-vous des remarques à me faire?
    Merci par avance.

    [edit] J'ai oublié de préciser que si je mets m_Affichage_VarGlobale1 = "test"; ça fonctionne!

  2. #2
    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
    salut,
    le code OnInitialUpdate est épuré ?
    il manque l'appel a la fonction de la classe de base.
    il manque un UpdateData(FALSE) voir faq.

  3. #3
    Membre chevronné 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
    Par défaut
    salut,

    tu as oublier l'appel suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CFormView::OnInitialUpdate();
    à rajouter à la fin de ton MyAppView::OnInitialUpdate()

    La méthode de la classe de base fait appel à UpdateData() qui te manque actuellement.

    Sous réserve d'avoir rempli correctement la fonction DoDataExchange()

    @+

  4. #4
    Membre averti
    Inscrit en
    Février 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 29
    Par défaut
    Tout est épuré oui!

    UpdateData(FALSE);
    CFormView::OnInitialUpdate();

    Tout ça est en place.
    C'était la raison de ma dernière remarque, vu que ça fonctionne avec une chaine, le problème ne vient à priori que de mes variables.

  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
    Par défaut
    Citation Envoyé par Yanns Voir le message
    Tout est épuré oui!

    UpdateData(FALSE);
    CFormView::OnInitialUpdate();

    Tout ça est en place.
    C'était la raison de ma dernière remarque, vu que ça fonctionne avec une chaine, le problème ne vient à priori que de mes variables.
    le mode debug trace est ton ami pour inspecter les variables...

  6. #6
    Membre averti
    Inscrit en
    Février 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 29
    Par défaut
    Nenni, les déclarations dans DoDataExchange sont correctes (générées automatiquement d'ailleurs).

    Par contre, est-il possible que MyAppView::OnInitialUpdate() soit appelée avant MyApp::InitInstance() ?


    [edit] le problème était le suivant:
    je mettais une valeur dans mes variables avant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pDocTemplate = new CSingleDocTemplate(
             IDR_MAINFRAME,
             RUNTIME_CLASS(MyAppView),
    (...)

  7. #7
    Membre chevronné 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
    Par défaut
    Par contre, est-il possible que MyAppView::OnInitialUpdate() soit appelée avant MyApp::InitInstance() ?
    Non.

    OnInitialUpdate() est appelé au moment de la création de ton CDocument. (donc au moment du ProcessShellCommand() dans le CWinApp)
    vérifies quand meme que tu fais tes affectations avant ça.

    met aussi une chaine constante au lieu de lire ta chaine globale, histoire de vérifier que tu n'as pas un probleme d'ID de ressource ou autre ...

    @+

  8. #8
    Membre chevronné 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
    Par défaut
    pas la peine d'appeler explicitement UpdateData(), c'est déjà fait dans le OnInitialUpdate() de la classe de base ...

    Ce qu'il doit te manquer maintenant c'est les déclarations dans DoDataExchange() du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void MyAppView::DoDataExchange(CDataExchange *pDX)
    {
      CFormView::DoDataExchange(pDX);
      DDX_Text(pDX,IDC_MONCONTROLE,m_MaVariableString);
      ...
    }
    @+

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

Discussions similaires

  1. Problème sur Variable globale
    Par diamonds dans le forum Langage
    Réponses: 1
    Dernier message: 16/03/2007, 10h52
  2. Réponses: 4
    Dernier message: 04/02/2007, 19h39
  3. Réponses: 2
    Dernier message: 25/12/2006, 19h08
  4. Problème de variable globale
    Par Oberown dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/08/2006, 11h57
  5. Problème de variable globale
    Par Tournevyks dans le forum Général Python
    Réponses: 6
    Dernier message: 29/06/2006, 11h16

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