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] Communication entre une CDialog et une CFormview


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut [MFC] Communication entre une CDialog et une CFormview
    Bonjour,

    Je développe une application qui contient une FormView : celle-ci est composée de plusieurs listbox dans lesquelles j'affiche du texte.

    J'aimerais implanter une fonction qui ouvre une boite de dialogue et qui permette de faire une recherche dans le texte d'une listbox (comme la fonction rechercher, raccourci Ctrl + F dans n'importequelle application windows)

    J'arrive à ouvrir cette boite de dialogue à partir de la formview mais je n'arrive pas à intéragir sur la formview à partir de la dialog lorsque je clique sur recherche suivante ou recherche précédente.

    Comment faut-il s'y prendre ?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    j'ai du mal à cerner ton problème, mais dans un premier temps, il faut que tu passe, à ta boite de dialogue (dans le constructeur par exemple), les pointeurs vers les objets dont tu as besoin, de façon à les avoir disponibles lorsque tu auras besoin de les utiliser.

    Hope it helps.

  3. #3
    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

  4. #4
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    En fait, j'arrive déjà à échanger des données entre la formview et la dialog. Mon problème est lié à l'exploitation de ces données.

    J'aimerais, par exemple, ouvrir la dialog à partir de la formview, puis lorsque je clique sur un bouton de la dialog, j'aimerais exécuter la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->mylistbox.SetCurSel (10);
    Afin de sélectionner une ligne de ma listbox qui ferait suite au clic de la dialog.

    Le problème c'est que cette ligne est sélectionnée une fois que la dialog se ferme, or j'aimerais qu'elle soit sélectionnée sans quitter la dialog.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Etrange. Essaye un Invalidate sur la listbox après le setcursel.

  6. #6
    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
    si le parent de la dialogue c'est la forme .
    le parent est desactivé par la dialogue (EnableWindow).
    donc tu peux tenter de faire un EnableWindow(TRUE) de ton parent ,
    faire tes modifs puis EnableWindow(FALSE);

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    non, malheureusement, ça ne marche pas.

    Pour être plus précis : j'ai donc deux classes Cmyform et Cmydialog.

    Dans Cmyform j'ai une fonction de traitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Cmyform::traitement()
    {
       this->mylistbox.SetCurSel(0);
       ... 
       ...
       // traitement
       pDoc->mavariable= ...
      ...
    }
    et dans Cmydialog j'ai une fonction qui correspond à un clic sur un bouton

    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
    24
    void Cmydialog::OnClic()
    {
     
    // ça c'est un test : ça affiche bien ok quand je clic sur le bouton
       AfxMessageBox("ok");
     
    // ça, ça ne résout pas le problème
        CWnd *pParent=this->GetParent();
        pParent->EnableWindow(TRUE);
     
    // et j'aimerais faire ça, mais ça plante
       Cmyform forme;
       forme.traitement();
     
    // j'ai essayé ça juste pour voir mais ça fait rien
       Cmyform forme;
       forme.mylistbox.SetCurSel(0);
     
    // j'ai aussi essayé avec des pointeurs, àa marche pas non plus
       Cmyform *forme;
       forme = new Cmyform();
       forme->mylistbox.SetCurSel(0);
     
    }
    please, help me!

  8. #8
    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
    m'enfin !
    Ça ne risque pas de fonctionner !
    Chaque fenêtre est associée à un objet dont la classe est dérivée de CWnd ,
    tu m'expliques pourquoi tu essaies de créer un nouvel objet (non initialisé qui ne pourra que planter) alors que la fenêtre parent existe déjà ?,
    et qu'il suffit de récupérer un pointeur sur l'objet qui la gère !
    C’est l'objet de ce post dans la faq:
    http://c.developpez.com/faq/vc/?page...ialogGetParent
    et du lien sur le post du post it que je t'ai donné ...


    Pourquoi créer un nouvel objet ? , pose toi la question comme il va faire le lien avec la fenêtre existante ?
    il ne faut pas essayer du code ,il faut comprendre ce que l'on fait..

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    merci farscape, c'est génial, ça marche, j'ai réussi et j'ai compris mon erreur.

    Je vais mettre le bon code, ça pourrait servir à d'autres personnes :

    dans la forme, appeler la dialogue comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //formview.cpp
    Cmydialog diag (this);
    diag.DoModal();
    et surtout pas comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //formview.cpp
    Cmydialog diag ();
    diag.DoModal();
    dans dialog.h, on change le prototype du constructeur comme cela et on rajoute une variable membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //dialog.h
    Cmydialog (Cmyformview maforme , CWnd* pParent = NULL);
    Cmyformview m_maforme;
    enfin, dans dialogue.cpp, on modifie le constructeur comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //dialog.cpp
    Cmydialog::Cmydialog(Cmyformview *maforme, CWnd* pParent /*=NULL*/)
    	: CDialog(Cmydialog::IDD, pParent),m_maforme(maforme)
    On peut maintenant appeler une fontion de traitement de la forme comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //dialog.cpp
    this->m_mes->traitement();

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/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