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 :

Accéder à CMyProjectDoc à partir d'une autre classe


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Accéder à CMyProjectDoc à partir d'une autre classe
    Pour ceux que la longueur de l'ancien post ont découragé, je raccourcis :

    QUESTION 1
    Dans InitInstance de CMyProjectApp, je ne peux pas faire :

    CMyProject MyDoc;
    MyDoc.RecupPointeurSurLaBonneClasseHeriteeAUtiliser();


    puisque la classe CMyProjetDoc est protégée :
    protected: // création à partir de la sérialisation uniquement
    CMyProjectDoc();

    ....je suppose qu'on n'a pas intérêt à toucher à ce qu'a fait Visual quand il a créé la base de travail mais c'est pour l'instant le seul moyen de me sortir d'affaire (je le passe en public).


    QUESTION 2 qui est proche

    RecupPointeurSurLaBonneClasseHeriteeAUtiliser()
    fait ce que son nom indique et je vais avoir besoin pendant tout le reste du programme de ce pointeur qui va me permettre d'utilisée la bonne classe héritée.

    Si on a des fonctions situées dans une autre classe que CMyProjectDoc (par exemple CMyProjectView) qui veulent se servir de nos fonctions présentes dans les classes CHéritée1, CHéritée2... :
    comment vont-elles pouvoir aller chercher le pointeur magique protégé dans Doc?

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu peux redire de quoi sont derivées les classes :
    CMyProject et CMyProjectDoc ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ah ben ça ce sont juste les classes créée initialement pour mon projet MDI
    CMyProjectApp et CMyProjectDoc.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    :

  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
    ton projet est MDI ou SDI ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par stof
    Ah ben ça ce sont juste les classes créée initialement pour mon projet MDI
    CMyProjectApp et CMyProjectDoc.
    Heum...

  7. #7
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Dans InitInstance de CMyProjectApp, je ne peux pas faire :
    CMyProject MyDoc;
    Ca ne tient pas debout. Tu as manifestement un problème de compréhension de l'architecture document/view.
    Commence peut-être par te documenter sur le sujet.

    Question 2
    Rien compris.
    Un document est accessible via la vue à laquelle il est associé (cf CView::GetDocument()). Si tu connais la vue, tu connais le document.
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    QUESTION 1

    Citation Envoyé par BertrandA
    Ca ne tient pas debout. Tu as manifestement un problème de compréhension de l'architecture document/view.
    Commence peut-être par te documenter sur le sujet.
    C'est fort possible que ça ne soit pas la bonne méthode; au niveau de la documentation, tu peux me croire que j'en ai lu des trucs.

    Tu es d'accord que dans InitInstance d'un projet (située dans la classe App), on doit pouvoir appeler certaines fonctions dès le lancement du logiciel.
    Et bien il se trouve que les fonctions que je veux appeler se trouvent parfois dans CMyProjectDoc, soit dans CCamera, ou ailleurs non?


    QUESTION 2
    Pour la question 2, voilà la situation :
    j'ai une classe CCamera et des classes héritées CCamera1, CCamera2 où les fonctions sont définies.

    Grâce aux conseils d'un forumeur, j'ai une fonction GetConnectedCamera qui retourne un pointeur sur la bonne caméra et cette fonction est située dans CMyProjectDoc.
    Je vais avoir absolument besoin de ce pointeur partout : la question est comment obtenir ce pointeur créé dans ma classe document (qui est protégée!!) à partir de n'importe quelle classe?

  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
    salut,
    suivant les endroits les appels ne sont pas les mêmes .
    il faut que tu saches et comprennes que dans une application de type MDI il peut y avoir plus d'un document a la fois autrement c'est du SDI .

    Suivant les endroits dans le programme on peut faire ce genre de chose:

    Extrait de la faq:
    De n'importe ou dans le programme je peux récupérer la MDIFrame active et par la son document.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CDocument *pDoc=NULL;
    CMDIFrameWnd* pMDI=static_cast<CMDIFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
    if(pMDI) pDoc=pMDI->GetActiveDocument();
    Attention dans le cas de plusieurs documents :
    utilise aussi la reconnaissance de signature de l'objet avec IsKindOf pour etre sur de travailler avec le bon document.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) )
    {
     // traitement.
    }

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Alors voilà, pour tester ce que tu me dis, je fais un test :


    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
     
    //Dans MyProjectDoc.h :
    int provisoire;
    int GetProvisoire();
     
    //Dans MyProjectDoc.cpp :
    int CMyProjectDoc::GetProvisoire()
    {
    return provisoire = 5;
    }
     
    //Dans le .cpp d'une autre classe, n'importe laquelle je tente de récupérer provisoire en appelant GetProvisoire :
     
    int test;
    CDocument *pDoc=NULL;
    CMDIFrameWnd* pMDI = static_cast <CMDIFrameWnd*> (AfxGetMainWnd()) ->GetActiveFrame();
     
    if(pMDI) pDoc=pMDI->GetActiveDocument();
     
    if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) )
    {
     test = pDoc->GetProvisoire();
    }

    erreur 1 : impossible de convertir de 'CFrameWnd *' en 'CMDIFrameWnd *' alors du coup j'enlève la mention MDI dans CMDIFrameWnd

    ensuite erreur 2 : 'GetProvisoire' : n'est pas membre de 'CDocument'

  11. #11
    mat.M
    Invité(e)
    Par défaut
    QUESTION 1
    Dans InitInstance de CMyProjectApp, je ne peux pas faire :

    CMyProject MyDoc;
    MyDoc.RecupPointeurSurLaBonneClasseHeriteeAUtiliser();
    NOn !! Initinstance sert uniquement à initialiser l'appli ( les fenêtres , contrôles , Status bar )!
    Pour faire ses initialisations les faire dans la classe DOC , VIEW etc...

    Pour obtenir un pointeur sur la classe DOC il faut passer par MainFrame.
    Fais une recherche sur le forum il doit y avoir des morceaux de code là dessus

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    j'ai avancé depuis, c'est le dernier message qui est à prendre en compte maintenant (et si je veux faire des trucs dans InitInstance(), c'est parce que je veux que le programme fasse des trucs dès l'ouverture, tout seul).

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par stof
    j'ai avancé depuis, c'est le dernier message qui est à prendre en compte maintenant (et si je veux faire des trucs dans InitInstance(), c'est parce que je veux que le programme fasse des trucs dès l'ouverture, tout seul).
    Non encore une fois InitInstance c'est pas fait pour ça !
    Fouiller dans le MSDN il ya des tas d'exemples avec architecture DOC/VIEW et MDI comme MDIVIEW

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Soit je te crois; j'ai rien vu pour l'instant à part cette fonction pour lancer des instructions au départ (faut comprendre que je débute mais que je m'enfile depuis 3 mois des tas de bouquins et de FAQ donc ça aurait été plus profitable de me dire comment faire que de "fouiller").

    La dernière question qui n'a pas eu de réponse et que je rappelle ci-dessous est en elle-même sans rapport direct avec ça donc...

    Pour tester comment on va chercher un élément de CMyProjectDoc à partir d'une classe quelconque :


    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
     
    //Dans MyProjectDoc.h :
    int provisoire;
    int GetProvisoire();
     
    //Dans MyProjectDoc.cpp :
    int CMyProjectDoc::GetProvisoire()
    {
    return provisoire = 5;
    }
     
    //Dans le .cpp d'une autre classe, n'importe laquelle je tente de récupérer provisoire en appelant GetProvisoire :
     
    int test;
    CDocument *pDoc=NULL;
    CMDIFrameWnd* pMDI = static_cast <CMDIFrameWnd*> (AfxGetMainWnd()) ->GetActiveFrame();
     
    if(pMDI) pDoc=pMDI->GetActiveDocument();
     
    if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) )
    {
     test = pDoc->GetProvisoire();
    }
    erreur 1 : impossible de convertir de 'CFrameWnd *' en 'CMDIFrameWnd *' alors du coup j'enlève la mention MDI dans CMDIFrameWnd

    ensuite erreur 2 : 'GetProvisoire' : n'est pas membre de 'CDocument'

  15. #15
    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
    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
     
    BOOL CMyProjectApp::InitInstance()
    {
    //...
    	PreProcess();
    	return TRUE;
    }
     
     
    void CMyProjectApp::PreProcess()
    {
    	CDocument *pDoc = NULL; 
    	CMDIFrameWnd* pMDI = static_cast <CMDIFrameWnd*>(m_pMainWnd);
     
    	if(pMDI) 
    		pDoc=pMDI->GetActiveDocument(); 
     
    	if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) ) 
    	{ 
    		CMyProjectDoc* pMyProjectDoc = static_cast<CMyProjectDoc*>(pDoc);
    		// traitement ici avec pMyProjectDoc...
    	}
    }

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Encore une fois merci, ta réponse est très claire.

    Cela dit, dans cette partie-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CDocument *pDoc = NULL;
       CMDIFrameWnd* pMDI = static_cast <CMDIFrameWnd*>(m_pMainWnd); 
     
       if(pMDI)
          pDoc=pMDI->GetActiveDocument(); //pDoc vaut toujours 0x00000000
    pDoc vaut 0x00000000
    donc la suite ne se fait pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) )
       {
          // on ne rentre pas dedans
       }

  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
    tu ne peux pas faire ça dans initinstance ,tu n'est pas sur que le framework est en place (mainframe ) et que la premiere MDIChild est disponible.
    d'ou les retours a zero ...
    pourquoi ne pas faire ça dans le Oninitialupdate de la view créer ?
    la tout est en place le document etc ....

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Si vous voulez, ça me gêne pas moi de faire ça dans autre chose;

    Si je crée l'événement OnInitialUpdate() de CView, Visual C++ comprend bien qu'il doit exécuter ça au départ alors?

    (je ne connaissais pas cette fonction : si c'est le seul bon moyen de lancer des instructions au lancement d'un programme, j'aurais du le lire dans mes bouquins, grrrr...)

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ben non, "il" comprend pas qu'il faut faire cette fonction au départ :


    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
     
    void CMyProjectView::OnInitialUpdate()
    {
    	CView::OnInitialUpdate();
     
    CDocument *pDoc = NULL;
    CFrameWnd* pMDI = static_cast<CFrameWnd*>(AfxGetMainWnd()) ->GetActiveFrame();
    if(pMDI) pDoc=pMDI->GetActiveDocument();
     
       if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) )
       {
          CMyProject* pMyProjectDoc = static_cast<CMyProjectDoc*>(pDoc);
          // traitement ici en utilisant le pointeur pMyProjectDoc...
          pMyProjectDoc->ListCamera();
          pMyProjectDoc->GetConnectedCam();
          delete  pMyProjectDoc;
       } 
     
    }

  20. #20
    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
    Voici une nouvelle version

    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
     
    BOOL CMyProjectApp::InitInstance() 
    { 
    //... 
       PreProcess(); 
       return TRUE; 
    }
     
    void CMyProjectApp::PreProcess()
    {
    	CMyProjectDoc* pDoc = NULL; 
    	CMainFrame* pMainFrame = static_cast <CMainFrame*>(m_pMainWnd);
    	CChildFrame* pChildFrame = NULL;
    	pChildFrame = static_cast<CChildFrame*>( pMainFrame->GetActiveFrame() ); 
    	pDoc = static_cast<CMyProjectDoc*>( pChildFrame->GetActiveDocument() );
     
    	if(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) ) ) 
    	{ 
    		TRACE("au boulot ...\n");
    	}
    }
    take it

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. accéder à variable privée d'une classe à partir d'une autre classe
    Par restapa dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/08/2010, 08h56
  2. Accéder aux éléments XAML à partir d'une autre classe
    Par Keitboor dans le forum Silverlight
    Réponses: 4
    Dernier message: 24/02/2009, 14h02
  3. [JUnit] [junit 4] Tests automatique à partir d'une autre classe
    Par Periph dans le forum Tests et Performance
    Réponses: 9
    Dernier message: 28/03/2007, 09h46
  4. Réponses: 10
    Dernier message: 17/11/2006, 15h20
  5. [JtextArea] Y accéder à partir d'une autre classe
    Par harris_macken dans le forum Composants
    Réponses: 16
    Dernier message: 12/06/2005, 00h27

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