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 :

VC++6.0 Accés méhode classe CmainFrame dans CwinApp::InitInstance()


Sujet :

MFC

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut VC++6.0 Accés méhode classe CmainFrame dans CwinApp::InitInstance()
    Bonjour,

    Dans la méthode InitInstance() de ma classe CWinApp() je souhaiterai accéder à une de mes méthodes de la classe CMainFrame.

    1)Comment faire ?

    2) Dans quel ordre sont crées les différents éléments d'une application MDI à son lancement ?

    3) A quel moment est créée la fenêtre cadre CMainFrame de l'applcication.

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par lio33
    Bonjour,
    Dans la méthode InitInstance() de ma classe CWinApp() je souhaiterai accéder à une de mes méthodes de la classe CMainFrame.
    1)Comment faire ?
    je ne sais pas pourquoi tu veux le faire mais ca sent un probleme de conception et le programme spagetti

    2) Dans quel ordre sont crées les différents éléments d'une application MDI à son lancement ?
    en mettant des points d'arret tu peux voir celui qui est appellé en premier. Je te laisse regarder par toi meme

    3) A quel moment est créée la fenêtre cadre CMainFrame de l'applcication.
    voir 2)
    en mettant un point d'arret dans le oncreate du mainframe (voir le constructeur si tu veux aller jusque la) tu peux voir l'appel
    il y a du linge sur la corde à linge

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    Oui je sais que c'est sûrement un peu tordu !
    Je reprends une application et je m'adapte n'étant pas moi même encore trés grand connaisseur de C++.

    En fait dans ma classe CMainFrame, une méthode InitGenerale() permet notamment de vérifier l'établissement d'une connexion socket TCP/IP avec un autre PC. Une fois cette connexion établie une variable membre BOOL de CMainframe est positionnée.

    Dans InitInstance() de mon application je dois tenir compte de la valeur de cette variable membre. Aussi je cherche à savoir comment y accéder.

    Comment faire référence CMainFrame ? Apparement cela bloque un peu.

    Dans les autres classe ou j'ai besoin d'un accés aux méthodes ou aux données membres de CMainFrame, je procède de la façon suivante :

    Création d'une variable membre de type CMainFrame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMainFrame m_pMainFrame;
    Dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_pMainFrame = (CMainFrame *)GetParent();
    m_pMainFrame->methode();

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    dans ce cas il faut une classe "manager de connexion" (singleton?) independant de la mainframe qui pourra etre appellé depuis la class mainframe et de la class App

    reprendre une appli tordue ne signifie pas qu'il faille continuer dans ce sens...
    il y a du linge sur la corde à linge

  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
    salut,
    l'init general ne peut etre fait dans la classe d'application au lieu de la mainframe ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    En fait au lancement de l'application, avant affichage du cadre de l'application une petite boite de dialogue (contenant une ListeBox) affiche des messages relatifs à l'initialisation réseau et à l'établissement de la connexion socket TCP/IP. Ce traitement est effectué par une méthode de CMainFrame.

    Même si je modifie la répartition de certaines méthodes dans d'autres classes de mon appli, dans l'InitInstance() de mon application, comment je peux récupérer un pointeur sur CMainFrame.

    Si j'utilise la méthode décrite plus haut cela me génère des erreurs.


    reprendre une appli tordue ne signifie pas qu'il faille continuer dans ce sens...
    Pas le temps de tout refaire, je dois m'adapter.

  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
    ce traitement aurait pu etre fait dans initinstance avec l'arret du programme si la connexion echoue..
    mais bon.
    dans ton demarrage MDI dans la fonction initinstance tu dois avoir une séquence qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // create main MDI Frame window
        CMainFrame* pMainFrame = new CMainFrame;
        if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
            return FALSE;
        m_pMainWnd = pMainFrame;
    il suffit de se placer apres et d'appeler la fonction concernée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     m_pMainWnd->MyFonction();

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    J'ai ceci, cela doit être équivalent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	// Creation et affichage fenêtre cadre application
    	GetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);
    m_pMainWnd pointe sur l'objet application ou CmainFrame ?

  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
    ben oui regarde mieux mon code posté ...

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    Est-ce que le code que j'ai indiqué est équivalent à ce que tu m'a donné ?

    Si j'utilise m_pMainWnd à la suite de mon code, je n'ai pas accès aux fonctions membres de ma classe CmainFrame, ce que je comprends, mais plutôt à des méthodes des classes Parent de mon application.

    En posant un point d'arrêt à la suite de

    GetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);

    j'observe bien qu'a ce stade mon cadre d'application à bien été crée et mon appli démarrée.

    Donc je réitère, à ce stade là comment récupérer un pointeur sur CmainFrame ?

  11. #11
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    et si tu castais m_pMainWnd ?
    il y a du linge sur la corde à linge

  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
    si tu es dans InitInstance ça ne sert a rien d'utiliser GetMainWnd() puisque tu as directement le bon pointeur sur la classe dans initinstance .
    tu as bien cette ligne non ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     CMainFrame* pMainFrame = new CMainFrame;
    tu peux aussi caster le pointeur globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static_cast<CMainFrame *>(m_pMainWnd)->MyFonction();
    GetMainWnd() dans tous les cas il faudra aussi le caster le retour.
    et suivant l'endroit ou il est appelé dans la classe d'application il ne sera pas forcement valide...(pas encore prêt ou nettoyé)

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    Bonjour,

    Merci Farscape pour ton aide.
    Au passage j'ai téléchargé et lu ton cours de démarrage sur les MFC, trés instructif et qui présente bien les mécanismes de base.

    Pour en revenir à notre discussion, je n'ai pas dans ma classe "CProjetApp" et dans InitInstance() la ligne que tu cites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMainFrame* pMainFrame = new CMainFrame;
    En fait l'application fonctionne trés bien, je suis juste embêté car j'aimerai bien dans la fonction InitInstance(), qui comme je l'ai compris sert d'initialisation générale de l'application, accéder soit à une méthode de CmainFrame, soit à une variable membre qui est en fait un pointeur sur un objet déclaré et utilisé par CMainFrame.

    m_pMainWnd qui est censé être un pointeur sur CMainFrame dans InitInstance correspond bien à quelque chose, puisque j'ai une liste de méthodes qui est proposé mais qui ne sont pas mes méthodes de ma classe CMainFrame ( commandEntries, connexionEntries, etc.... )

    Par contre je viens de vérifier que si je Cast comme tu me l'indiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast<CMainFrame *>(m_pMainWnd)->MaFonction();
    je retrouve bien à mes fonctions !

    Un peu mystérieux quand même pour moi, cette gestion du pointeur m_pMainWnd.
    Pourquoi ce Cast est nécessaire ?

  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
    Le code que j’ai cité est standard, maintenant c’est possible que ça soit fait autrement dans ton programme par une fonction etc…
    Pour utiliser le pointeur m_pMainWnd il faut le caster sur CMainFrame comme montré dans mon post précédent …

  15. #15
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    je le repète :

    et si tu castais ?
    il y a du linge sur la corde à linge

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    J'ai modifié mon précédent Post pendant que vous répondiez...

    En castant j'accède bien à mes fonctions

    J'ai encore des efforts de compréhension à faire ...

    Merci pour votre aide.

  17. #17
    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
    Ta question relève du C++ :
    m_pMainWnd est déclaré comme suit dans la classe CWinThread :
    CWnd* m_pMainWnd;

    Donc à travers ce pointeur tu auras une lisibilité des fonctions associées à la classe CWnd .
    Pour accéder aux fonctions de la classe CMainFrame il faut caster le pointeur sur la classe CMainFrame , c’est ce que fait l’opérateur de transtypage static : static_cast.

  18. #18
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    t'aurais fait un songleton CConnexionManager, t'aurais fini hier soir et ca aurait été plus propre...
    il y a du linge sur la corde à linge

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

Discussions similaires

  1. [V6] Paramétrer l'accès aux classes/objets dans l'univers
    Par kiralina dans le forum Designer
    Réponses: 4
    Dernier message: 11/12/2012, 17h24
  2. Réponses: 8
    Dernier message: 23/01/2009, 16h19
  3. Réponses: 4
    Dernier message: 22/07/2008, 22h03
  4. Réponses: 5
    Dernier message: 25/07/2007, 15h34
  5. [Introspection] accès aux classes encapsulées dans un JAR
    Par couetbis dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 22/01/2007, 10h18

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