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 :

MDI interaction entre plusieurs vues


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut MDI interaction entre plusieurs vues
    bonjour,
    je travaille avec les MFC sur le logiciel VC++ en MDI
    je n'arrive pas à avoir une interaction entre 2 vue
    j'ai bien fait attention à avoir le même document pour les 2 vues

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Initinstance:
    pDocTemplate = new CMultiDocTemplate(
    IDR_ROBOTTYPE,
    RUNTIME_CLASS(CROBOTDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CInterfaceCAN));
    AddDocTemplate(pDocTemplate);
     
    pDocTemplate2 = new CMultiDocTemplate(
    IDR_ROBOTTYPE,
    RUNTIME_CLASS(CROBOTDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CReseauxCAN));
    ensuite je ne sais pas comment m'y prendre
    je veut seulement envoyer la valeur de la variable d'une vue à une autre vue

    merci d'avance

  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,
    voir la faq, il suffit de récupérer le pointeur sur la vue obtenu a partir du document.
    http://cpp.developpez.com/faq/vc/?pa...OnSameDocument

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Est-ce que CDocument::UpdateAllViewscorrespond à ton besoin?

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    bonjour,
    j'ai essayer ce code:
    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
     
     
    void CInterfaceCAN::OnInitialUpdate() 
    {
    	CFormView::OnInitialUpdate();
     
    	CROBOTDoc *pDoc = (CROBOTDoc *)GetDocument();
    	pDoc->hello = 5;
    	UpdateData(TRUE);
    	pDoc->UpdateAllViews(this);
    }
     
    void CReseauxCAN::OnButtondemarrer() 
    {
    	CROBOTDoc* pDoc = (CROBOTDoc*)GetDocument();
    	ASSERT_VALID(pDoc);
    	CString bleu=pDoc->hello;
     
     
    }
    je met bien la variable hello dans la classe CDOC
    Ca nemarche pas car pDOC n'est as le même entre la premier vue et la 2emes

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    j'ai essayé ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CTestMdiView::OnInitialUpdate() 
    {
        CView::OnInitialUpdate();
        // TODO: Add your specialized code here and/or call the base class
        CTestMdiApp *TheApp=(CTestMdiApp*)AfxGetApp();
        CFrameWnd * pFrame =TheApp->m_pTwoDocTemplate->CreateNewFrame(GetDocument(),GetParentFrame());
       TheApp->m_pFirstTemplate->InitialUpdateFrame(pFrame,GetDocument()); 
    }
    Ca me copie bien une autre fenetre. mais comment faire passer une variable

    merci d'avance

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Avez-vous un programme d'exemple s'il vous plaît?

    Merci d'avance

  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
    salut,
    le lien cité dans la faq répond à ta question....
    a partir du document tu peux itérer les vues associées il suffit ensuite de tester le runtime pour savoir quelle classe est associée au pointeur.
    exemple recherche de la vue CReseauxCAN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       POSITION pos=GetDocument()->GetFirstViewPosition();
       CView *pView;
       do
       {
          pView=GetDocument()->GetNextView(pos);
          if(pView->IsKindOf(RUNTIME_CLASS(CReseauxCAN))) break;
       }
       while(pView);
    CReseauxCAN *pVCan=NULL;
    if(pView) pVCan=static_cast<CReseauxCAN*>(pView);

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    j suis désolé mais étant débutant je ne comprend pas comment ca marche, il me faudrait un exemple plus concret.

    j'ai une variable(ou attribut) qui se trouve dans ma 1ere fenetre heriter de la classe CFORMVIEW et j'aimerais que la valeur de cette variable puisse etre recuperer dans mon autre fenetre elle aussi hériter de la classe CFORMVIEW,
    comment dois je faire


    je vous remercie d'avance

  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par parain3874 Voir le message
    bonjour,
    j'ai essayer ce code:
    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
     
     
    void CInterfaceCAN::OnInitialUpdate() 
    {
    	CFormView::OnInitialUpdate();
     
    	CROBOTDoc *pDoc = (CROBOTDoc *)GetDocument();
    	pDoc->hello = 5;
    	UpdateData(TRUE);
    	pDoc->UpdateAllViews(this);
    }
     
    void CReseauxCAN::OnButtondemarrer() 
    {
    	CROBOTDoc* pDoc = (CROBOTDoc*)GetDocument();
    	ASSERT_VALID(pDoc);
    	CString bleu=pDoc->hello;
     
     
    }
    je met bien la variable hello dans la classe CDOC
    Ca nemarche pas car pDOC n'est as le même entre la premier vue et la 2emes
    Salut,

    Si t'a bien suivi
    http://cpp.developpez.com/faq/vc/?pa...OnSameDocument

    t'a le même doc entre les 2 views
    A mon avis il te manque de recuperer le message envoyé par appel de fct
    UpdateAllViews
    Il te faut créer la fct OnUpdate dans les views pour recuperer les modifs
    http://msdn.microsoft.com/en-us/libr...fw(VS.80).aspx

    A+
    Payman

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour à touos et encore merci d'avoir pris le temps de me répondre
    j'ai réussi a dialoguer avec les 2 vue grâce a vos message.

    par contre un autre probleme apparait qui est assez bizarre.
    En fait quand je compile j'a 3 erreurs quiapparaissent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :\documents and settings\propriétaire\bureau\archive\robot vc++ 6.0\interfacecan.h(50) : error C2143: syntax error : missing ';' before '*'
    c:\documents and settings\propriétaire\bureau\archive\robot vc++ 6.0\interfacecan.h(50) : error C2501: 'CReseauxCAN' : missing storage-class or type specifiers
    c:\documents and settings\propriétaire\bureau\archive\robot vc++ 6.0\interfacecan.h(50) : error C2501: 'm_Reseaux' : missing storage-class or type specifiers
    La ligne de code qui pose probleme est celle là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CReseauxCAN *m_Reseaux;
    alors ce que je fait, je la met en commentaire puis je compile, ensuite j'enleve les commentaires et les erreurs diparaisse.

    Ensuite à chaque fois que je rajoute du code, ces erreurs réapparaissent alors je fais la manip ci-dessus et voila.

    Pourquoi etcomment puis-je y remedier?

    je vous remercie d'avance

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ajouter include "ReseauxCAN.h" avant l'utilisation de CReseauxCAN. Bref, définir le type avant qu'il soit rencontré par le compilo.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    bonjour,
    merci d'avoir répondu
    ça ne marche pas de mettre ReseauxCAN.h en premier

    avez vous une autre idée

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    L'erreur ressemble beaucoup à une absence de définition du type CReseauxCAN avant son utilisation dans interfacecan.h. Peux-tu poster ces codes?

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    encore merci de vous interresser à mon probléme
    Je pense avoir résolu mon probléme en fait j'ai mal supprimé une Edit box, car depuis que je l'ai remis en place, cette erreur n'apparait plus (pour le moment ).

    Y'a t il une façon (propre) de supprimer une edit box?

    une autre question qui n'a rien a voir avec mon probléme mais tjrs liés à mon post de départ:
    comme vous me l'avez conseillé j'utilise les fonctions suivantes pour avoir un lien entre 2 fenêtre via un document:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CROBOTApp *TheApp=(CROBOTApp*)AfxGetApp();
        CFrameWnd * pFrame =TheApp->pDocTemplate2->CreateNewFrame(GetDocument(),GetParentFrame());
        TheApp->pDocTemplate->InitialUpdateFrame(pFrame,GetDocument()); 
     
    	POSITION pos=GetDocument()->GetFirstViewPosition();
     
    	CView *pView;
    	do
    	{
              pView=GetDocument()->GetNextView(pos);
    		   if(pView && pView->IsKindOf(RUNTIME_CLASS(CReseauxCAN))) m_Reseaux=static_cast<CReseauxCAN *>(pView);
     
    	}
    	while(pView);
    le probléme de cette méthode est que j'ouvre ma fenetre CReseauxCAN(formview) par la fenêtre CInterfaceCAN. Or pour mon code ces 2 fenetres doive etre ouverte séparemment, car je peux avoir plusieurs CInterfaceCAN
    mais q'un seul CreseauxCAN.
    Y 'a t il une methode pour ne pas ouvrir ma fenetre via une autre fenetre et d'avoir quand même le document lié et de pouvoir échanger des données

    Je vous remercie encore pour toute l'aide que vous m'apporter, j'avance à grand pas.

    Encore merci

  15. #15
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    Citation Envoyé par parain3874 Voir le message
    Y 'a t il une methode pour ne pas ouvrir ma fenetre via une autre fenetre et d'avoir quand même le document lié et de pouvoir échanger des données
    je n'arrive pas a comprendre ta question ; la methode standard tu l'as il faut passer par GetNextView qui retourne un pointeur sur une CView.
    De la il suffit d'appeler la methode voulue de la CView en question..as-tu compris les exemples de la FAQ de Farscape ?

    je reprends l'exemple de Farscape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CReseauxCAN *pVCan=NULL;
    if(pView){ pVCan=static_cast<CReseauxCAN*>(pView);
    pView->FaireQuelqueChose();
    pView->PasserUneVariable(type Variable)}

  16. #16
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    bonjour et merci d'avoir répondu si vite,
    le probléme est que je suis obligé d' ouvrir la fenetre CreseauxCAN par la fenetre CinterfaceCAN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CROBOTApp *TheApp=(CROBOTApp*)AfxGetApp();
    CFrameWnd * pFrame =TheApp->pDocTemplate2->CreateNewFrame(GetDocument(),GetParentFrame());
    TheApp->pDocTemplate->InitialUpdateFrame(pFrame,GetDocument());
    si je ne met pas ces lignes de codes ca ne marche pas or ces lignes de codes m'ouvre une fenetre alors comment faire pour échanger des messsage sans être obliger de l'ouvrir comme ca.

    merci encore

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    j'ai une mauvaise nouvelle mon probleme n'est pas résolu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1>c:\users\parain\electronique\robot vc++ 6.0\robot vc++ 6.0\interfacecan.h(51) : error C2143: syntax error : missing ';' before '*'
    1>c:\users\parain\electronique\robot vc++ 6.0\robot vc++ 6.0\interfacecan.h(51) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\users\parain\electronique\robot vc++ 6.0\robot vc++ 6.0\interfacecan.h(51) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    Dite moi si vous avez besoin de voir mon code, je le mettrai avec plaisir.

    merci d'avance

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ben, faudrait le .c qui inclue le .h et le .h.

  19. #19
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Voici les fichiers que vous m'avez demandé.

    merci c'avance
    Fichiers attachés Fichiers attachés

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bel exemple d'inclusions croisées.
    Dans InterfaceCAN.h:
    supprimer #include "ReseauxCAN.h"
    Rajouter: class CReseauxCAN;

    Dans ReseauxCAN.h:
    supprimer #include "InterfaceCAN.h"

    Dans ReseauCAN.cpp:
    supprimer #include "InterfaceCAN.h"

    Ensuite, je dirais vérifier qu'on a pas le même problème avec #include "ConfigurationCAN.h"

    Enfin, pourquoi maintenir un CReseauxCAN *m_Reseaux; dans CInterfaceCAN? Lorsque il faut accéder à cette instance, le faire dynamiquement (comme fait dans CInterfaceCAN::OnInitialUpdate):
    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
     
    CReseauxCAN* CInterfaceCAN::GetReseauView()
    {
       POSITION pos=GetDocument()->GetFirstViewPosition();
       CReseauxCAN *pRetour=NULL;
       CView *pView;
       while((pos)&&(!pRetour)){
          pView = GetDocument()->GetNextView(pos);
    	   if(
                (pView)
             && (pView->IsKindOf(RUNTIME_CLASS(CReseauxCAN)))
             ){
                pRetour=static_cast<CReseauxCAN *>(pView);
          }
       }
     
       return pRetour;
    }

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

Discussions similaires

  1. [RCP] Evénements de selection entre plusieurs vues
    Par stadou dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 29/01/2009, 16h30
  2. jointure entre plusieurs vues
    Par oxilab dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/12/2007, 19h04
  3. [RCP] interaction entre les vues
    Par stachus dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 14/09/2007, 15h01
  4. interaction entre plusieur script python par le biai d'internet
    Par yggdrazil dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 01/11/2006, 14h36
  5. [RCP] Interaction entre les vues
    Par MarneusCalgarXP dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 10/10/2006, 22h52

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