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 :

acceder a un objet dans un CPropertySheet


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut acceder a un objet dans un CPropertySheet
    Voila rebonjours a tous,
    J'ai developpé une application en VC++ avec des objet de type CListBox et CProprtySheet (une dialog based app avec des onglets)..
    Mais je suis confronté a un petit souci : je souhaiterai que un bouton de mon onglet 1 (CMyPropertyPage1 m_page1) remplisse une CListBoxd de mon onglet 2 (CMyPropertyPage2 m_page2).. Evidement les controles sont des variables membre de ces deux classes.
    J'ai essayé a partir de l'onglet 1 d'accedder comme cela a mon control en vain...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Page2.m_ctrlLoadComb.AddString("test");
    Sauriez vous me dire alors comment reccuperer le pointeur ou l'objet CListBox en page2?
    Merci beaucoup
    PS : je suis debutant.. je commence a bidouiller grace a vous tous et je vous en remercie

    EDIT : j'ai reussi a partir du CPropertySheet a acceder aux pages et aux controles sans probleme.. Faut ils donc que je passe par la pour transmettre une information de l'onglet 1 a l'onglet 2??

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut



  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut

    J'ai pas repondu plus tot en me disant que ma solution ne devait sans doute pas etre bonne. Pour communiquer des "donnees" entre plusieurs fenetre dialogue (qu'elles soient en onglets ou non), le mieux est de passe les donnees a la vue...

    Puisque tu est en dialog based, il faudrait les "stocker" au niveau de ta dialog contenant la boite a onglets.

    Ca me semble pas parfaitement propre, mais ca marche

    Voila

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    merci c'est evident que ce n'est pas tres "propre" mais bon.. si quelqu'un a une idée plus avancée sur la question je suis preneur. Au pire je stock mes donnees dans un CObArray dans la DLG..
    j'imaginais que je pouvais reccuperer un pointeur sur l'onglet 2 ce qui m'aurai grandement simplifié la tache ^^
    Merci quand meme

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 106
    Points : 113
    Points
    113
    Par défaut
    Salut,
    une autre solution peut-être de passer la CPropertySheet en arguments dans le constructeur de ta CPropertyPage.

    Ensuite dans ta CPropertySheet, quand tu crées ta page tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_pPropertyPage= new CPropertyPage(this);
    Comme ça dans chacune de tes CPropertyPage tu as un pointeur vers le CPropertySheet et tu peux passer par là.

    Je ne sais pas ce que vaut cette solution par rapport à l'autre, à toi de voir.

  6. #6
    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
    Bonjour

    Voici une autre solution, en effet elles n'en finissent pas.

    Dans ta CPropertySheep ajoute une donnée membre de type CStringArray qui est un tableau d'objet CString.

    Dans l'onglet 1 ie dans le code associé au bouton du CPropertyPage (page1) tu appèles le parent CPropertySheep à l'aide de GetParent() ensuite stocke tout tes string dans CStringArray et après dans la méthode DoDataExchange de l'onglet 2 tu remplis ton ListBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CMyPage1::OnButton()
    {
                    UpdateData(TRUE);
                    CMySheep* pParent = ( CMySheep* ) GetParent();
                    pParent->m_StringArray[0] = "test1";
                    pParent->m_StringArray[1] = "test2";
                    pParent->m_StringArray[2] = "test3";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void CMyPage2::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CHeightPage)
    	// ...
    	//}}AFX_DATA_MAP
     
                    if( !pDX->m_bSaveAndValidate)
                    {
                       m_ctrlLoadComb.AddString(m_StringArray[0]);
                       m_ctrlLoadComb.AddString(m_StringArray[1]);
                       m_ctrlLoadComb.AddString(m_StringArray[2]);
                    }
    }
    Essaie ce code... Je ne l'est pas testé mais la logique me semble correcte
    En effet, je crois savoir pourquoi ça ne marche pas. Tant que l'onglet 1 est en premier plan, les autre controles des autres onglets ne sont pas encore activés au niveau de l'interface graphique (écran) ainsi on ne peut accéder à aucun contrôles quand il n'est pas visible à l'écran (ie actif)

    Gabrielly

  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,
    pour acceder a une page d'une CPropertySheet tu peux proceder comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // je suis dans une propertypage j'accede à la CPropertySheet
    CPropertySheet *pParent=static_cast<CPropertySheet *>(GetParent());
     
    // je demande la page numero 2 que je cast sur la classe PropertyPage correspondante
    CLastPage *pLastPage =static_cast<CLastPage *>(pParent->GetPage(2));
     
    // maintenant je fais ce que je veux ....
    if(pLastPage && IsWindow(pLastPage->GetSafeHwnd()))
    {
          CWnd *pWnd=pLastPage->GetDlgItem(IDC_STATIC2);
          if(pWnd) pWnd->SetWindowText("coucou");	
    }
    initialisation de la CPropertySheet pour comprendre l'exemple ci-dessus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CPropertySheet sheet;
    CFirstPage firstPage;
    CLastPage lastPage;
     
    CComboPage	comboPage( IDD_COMBOPAGE );
     
    sheet.AddPage( &firstPage ); // page 0
    sheet.AddPage( &comboPage );// page 1
    sheet.AddPage( &lastPage ); // page 2
    attention avant d'accéder a une autre page et a ses composants graphiques ,il faut qu'elle soit initialisée sinon pb ,d'ou mon test IsWindow.

Discussions similaires

  1. [2.x] Acceder aux propriété de l'objet dans un FormType
    Par jejeman dans le forum Symfony
    Réponses: 2
    Dernier message: 04/06/2014, 09h54
  2. Acceder aux attributs d'un objet dans un template
    Par cereal dans le forum Play!
    Réponses: 2
    Dernier message: 28/06/2012, 14h28
  3. [POO] Comment acceder a un objet javascript instancie dans une page mere
    Par herbert dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/07/2006, 19h34
  4. [CR9] redimensionner un objet dans la section détail !
    Par LIM dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 27/04/2004, 18h19
  5. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55

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