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 :

[MFC]Acceder a l'objet document depuis une boite de dialogue


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut [MFC]Acceder a l'objet document depuis une boite de dialogue
    Bonjour,

    Dans ma classe document, j'ai un objet que je renseigne avec des boites de dialogues modales.
    Depuis une vue, j'y accède par un GetDocument(). Depuis une boite de dialogue, à part parser les templates et les docs de ces templates, je ne vois pas d'autre façon.
    Connaissez vous une solution plus simple ?

    Marie.

    NB : ma question est peut être très bête ...

  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 plusieurs solutions:
    recuperer la frame active:
    http://c.developpez.com/faq/vc/?page...k#GetActiveWnd

    passer comme parent de la diialog le pointeur de la view
    voir post it faq:
    http://www.developpez.net/forums/vie...013336#2013336

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CMyProjectDoc *pDoc;
    CFrameWnd* pFW = reinterpret_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
     
    if(pFW)
    	   pDoc=reinterpret_cast<CMyProjectDoc*>(pFW->GetActiveDocument());
     
     
    if (! (pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) )) )
    {
    	AfxMessageBox("Erreur dans la récupération du document actif");
    	return;
    }

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    merci, je vais essayer tout ca.

    Marie.

  5. #5
    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 stof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CMyProjectDoc *pDoc;
    CFrameWnd* pFW = reinterpret_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
     
    if(pFW)
    	   pDoc=reinterpret_cast<CMyProjectDoc*>(pFW->GetActiveDocument());
     
     
    if (! (pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CMyProjectDoc ) )) )
    {
    	AfxMessageBox("Erreur dans la récupération du document actif");
    	return;
    }
    j'ai pas testé mais j'ai un gros doute. Si c'est une boite modale, la fenetre qui a le focus est donc la boite donc pas une frame fille.

    Que renvoie GetActiveFrame ???
    il y a du linge sur la corde à linge

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    Marche poa ….. en fait, j’ai l’impression que le GetDocument() du GetParentFrame() ne récupère pas le même document que le GetActiveDocument() du GetActiveFrame().

    Brièvement, voici ce que je voudrais faire :
    Je développe une application de type MDI ou j’ai plusieurs vues (CFormView) pour un document. Je veux que au démarrage de mon application, un document vide se crée mais qu’aucune vue ne s’ouvre (pour l’instant, c’est a l’utilisateur de décider celle(s) qu’il veut ouvrir).
    Pour des raisons de simplicité d’utilisation, je veux que ne soit ouvert qu’un seul document a la fois.

    Mon objet document contient des objets que je renseigne grâce a des boites de dialogues ouverte depuis un CTreeView. Je visualise le résultat de mes saisies sur des CFormView que j’ouvre grâce à des boutons de la barre d’outils ou au menu.

    Le premier problème est que si je mets les 3 lignes suivantes en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
    	// Dispatch commands specified on the command line
    	if (!ProcessShellCommand(cmdInfo))
    		return FALSE;
    Au démarrage de l’application, il ne m’ouvre aucune fenêtre (ce que je cherche a faire) mais aucun document ne se crée (ce que je ne veux pas).

    Donc en attendant de trouver une solution, j’ai laisse ces lignes en s’exécuter.
    Mais il me semble que quand j’ouvre un document (CMainFrm ::OnFileOpen) ou quand j’en crée un nouveau (CMainFrm ::OnFileNew) … je me retrouve avec plusieurs document et que c’est ça qui fou le b., ce qui me semble logique mais comment faire pour n’en avoir qu’un seul a la fois et le récupérer de n’importe ou dans l’application (Main, View et DialogBox) ?

    Marie.

  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
    bonsoir ,
    soyons clair ,si il n'y a pas de fenetre il n' y a pas de document possible.
    ce que tu demandes n'existe pas.
    pour avoir plusieurs vues sur le même document voir faq:
    http://c.developpez.com/faq/vc/?page...OnSameDocument

    pour stof :
    c'est bien ,et c'est inspiré du premier lien sur la faq ,une remarque le reinterpret_cast n'est pas approprié il vaudrait mieux un static_cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CSampleSDIDoc *pDoc;
        CFrameWnd* pFrame = static_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
     
        if(pFrame)      pDoc=static_cast<CSampleSDIDoc*>(pFrame->GetActiveDocument());
     
        if (!(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CSampleSDIDoc ) )) )
        {
            AfxMessageBox("Erreur dans la récupération du document actif");
            return;
        }
    ce dernier bout de code te permet de recuperer quelque soit l'endroit le document actif.
    il est evident que suivant l'endroit c'est plus ou moins direct:
    exemple dans la(es) view(s) GetDocument() est en acces directe.
    a partir de la mainframe on pourra faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CSampleSDIDoc *pDoc;
        CFrameWnd* pFrame = GetActiveFrame();
        if(pFrame)      pDoc=static_cast<CSampleSDIDoc*>(pFrame->GetActiveDocument());
     
        if (!(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CSampleSDIDoc ) )) )
        {
            AfxMessageBox("Erreur dans la récupération du document actif");
            return;
        }
    etc ...

  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
    Citation Envoyé par farscape
    une remarque le reinterpret_cast n'est pas approprié il vaudrait mieux un static_cast
    Ca marche.


    Citation Envoyé par farscape
    CFrameWnd* pFrame = GetActiveFrame();
    Tu veux dire que c'est inutile mon :
    CFrameWnd* pFrame = static_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
    :

  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,
    ben oui regarde la signature:
    CFrameWnd::GetActiveFrame
    This method obtains a pointer to the active multiple document interface (MDI) child window of an MDI frame window.

    If there is no active MDI child or the application is a single document interface (SDI), the implicit this pointer is returned.

    virtual CFrameWnd* GetActiveFrame( );

  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
    Ah ouio mais je me souviens pourquoi j'avais fait ça : GetActiveFrame() n'est pas accessible comme ça : CFrameWnd* pFW = GetActiveFrame();
    La fonction n'est pas connue si on ne va pas la chercher par :
    static_cast<CFrameWnd*>(AfxGetMainWnd())->

  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
    oui c'est sûr ,mais on ne parlait pas du meme context;
    la phrase que tu as revelevée etait dans le context d'un appel situé dans la mainframe .

    Citation Envoyé par farscape
    il est evident que suivant l'endroit c'est plus ou moins direct:
    exemple dans la(es) view(s) GetDocument() est en acces directe.
    a partir de la mainframe on pourra faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CSampleSDIDoc *pDoc;
        CFrameWnd* pFrame = GetActiveFrame();
        if(pFrame)      pDoc=static_cast<CSampleSDIDoc*>(pFrame->GetActiveDocument());
     
        if (!(pDoc && pDoc->IsKindOf( RUNTIME_CLASS( CSampleSDIDoc ) )) )
        {
            AfxMessageBox("Erreur dans la récupération du document actif");
            return;
        }
    etc ...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    J'ai mis en place ces quelques lignes de code et il ne me récupère aucun document, que ce soit depuis une boite de dialogue ou depuis une CFormView.

    J'ai bien envie de me passer de ce document et d'ajouter un objet contenant mes données dans la classe application puisque je n'ai besoin que d'une seule instance de mon objet par application. De plus, cela me permettra d'en créer un vide à l'ouverture de l'application sans avoir besoin d'ouvrir une vue.
    Je sais que ça ne correspond pas à l'architecture MFC ... mais vous en pensez quoi ?

    Marie.

  13. #13
    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
    soit plus explicite ,dans quel contexte ?
    tu as une fenetre ouverte quand tu essayes ?


  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    Je vais essayer mais j'avoue être loin de tout maîtriser donc ....

    Je suis dans une appli type plusieurs vues pour un seul document. J'ai déjà plusieurs CFormView et CDialog. J'ai également un objet que je sérialise. Jusque la tout fonctionne correctement.
    Je voudrai maintenant utiliser la classe document ou plutôt mettre en place le système open/save/new de mon objet (sérialisé) avec une instance unique.
    Et c'est la que ça se complique …
    J'ai donc laisse en exécution les 3 lignes de l'initAppli qui crée un document (???) et ouvre une vue au démarrage. Et j'appel mon document actif depuis mes CFormView, mes CDialog et ma CMainFrame avec les lignes de code que vous m'avez envoyés mais je ne récupère aucun document (pDoc est NULL).

    Je ne sais pas comment je pourrai être plus explicite, peut-être si vous aviez une bonne explication sur l'architecture que j'utilise (qu’est ce qui se crée, quand, comment …), je pourrai peut être comprendre par moi-même.

    NB : j’ai trouvé pas mal de chose, sur Internet ou dans les bouquins, sur les appli SDI mais rien qui vaille sur les appli MDI plusieurs vues/un seul document.

  15. #15
    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,
    j'ai fais un exemple simple .
    avec affichage de deux views sur le meme document.
    chaque vue affiche l'adresse de son objet document et sa classe.
    la premiere vue peut lancer une dialogue.
    la dialogue recupere la MDI active et l'adresse du document correspondant.
    http://farscape.developpez.com/Samples/MDIMultiView.zip

  16. #16
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    Waouhhhh, super merci
    Je regarde ca de suite.

    Marie.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    Honte a moi !!!!

    En fait, j'ai n'ai simplement pas passe le document quand je crée une fenêtre. Ca a au moins le mérite d'avoir éclairci un peu les choses. Merci infiniment de votre aide.

    Sauf que je crée mes fenêtres depuis la MainFrame et je n'arrive pas a récupérer le document.

    Voici un morceau de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pMaFrame =TheApp->m_pMaFrame->CreateNewFrame(GetActiveDocument(),GetParentFrame());
    		TheApp->pDocTemplate->InitialUpdateFrame(pMaFrame ,GetActiveDocument());
    Et bien sur le GetActiveDocument() ne fonctionne pas car je ne suis pas dans une Frame.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    J'ai fait du nettoyage dans mes ouvertures de fenêtres et cela fonctionne. Il me récupère bien le document actif de n'importe ou dans l'application.

    Merci beaucoup pour votre aide et a bientôt sans doute pour de nouvelles aventures

    Marie.

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

Discussions similaires

  1. Affichage d'un objet matrice dans une boite de dialogue
    Par FATENMRABET dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 14/12/2013, 21h31
  2. Réponses: 1
    Dernier message: 27/08/2011, 07h28
  3. [MFC-MDI] Accéder au document depuis une ChildFrame
    Par stratocastom dans le forum MFC
    Réponses: 3
    Dernier message: 03/12/2010, 08h29
  4. Réponses: 5
    Dernier message: 12/10/2010, 17h38
  5. Réponses: 2
    Dernier message: 17/11/2007, 13h48

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