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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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
    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 �clair�
    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
    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
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Par d�faut
    merci, je vais essayer tout ca.

    Marie.

  5. #5
    Membre Expert
    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
    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 ???

  6. #6
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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
    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 �clair�
    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
    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
    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 �clair�
    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
    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
    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
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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
    Par d�faut
    soit plus explicite ,dans quel contexte ?
    tu as une fenetre ouverte quand tu essayes ?


  14. #14
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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
    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
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    Par d�faut
    Waouhhhh, super merci
    Je regarde ca de suite.

    Marie.

  17. #17
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    47
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 47
    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