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 :

transfert données CFormView -> CDialog


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut transfert données CFormView -> CDialog
    Bonjour,

    Malgres quelques recherches sur votre forum ainsi que dans la faq de Visual Cpp, je n'arrive pas à resoudre mon probleme.

    Dans le .cpp de ma CFormView je déclare en global la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<string> FichierRechercheTrouve;
    que je fournis par la suite.

    Une fois ce vecteur rempli, je voudrais l'afficher dans une CListBox située dans un nouveau CDialog1.
    Pour cela je définie bien la variable :;
    Ensuite, dans le fichier .cpp de ma CFormView je fais un appel à ma CDialog avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dialog1 dlg;
    int NbFichierRechercheTrouve = FichierRechercheTrouve.size();
    for (int i = 0; i <NbFichierRechercheTrouve; i++)
    {
        dlg.m_ListViewCSV.AddString(ConversionStringToCString(FichierRechercheTrouve[i]));
    }
    Mais le probleme est qu'il me génère l'erreur suivante lorsque je clique sur le bouton d'ouverture du CDialog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Debug Assertion Failed!
    File : afxwin2.inl
    Line : 669
    Dans ce cas je me suis dit que je contournerai l'erreur en déclarant en global dans le .Cpp du CDialog un vecteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<string> FichierRechercheTrouveDialog;
    MAis il me dis lors de la compilation qu'il ne connait pas std ou encore vector alors que je l'avais déclaré dans .h de ma CFormView...
    J'ai donc déclaré dans mon .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <vector>
    using namespace std;
    Mais il me fait l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dialog1.obj : error LNK2005: "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > 
     FichierRechercheTrouve" (?FichierRechercheTrouve@@3V?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@A) already defined in CreationOutilsView.
    obj
    Est ce que quelqu'un aurait une solution? Car la je suis un peu perdu...

    Merci d'avance
    rv

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je n'ai pas tout compris, mais j'ai l'impression que ton erreur vient du fait que tu fais un AddString sur ton listctrl alors que ce dernier n'est pas encore complètement initialisé.
    En effet, tant que OnInitDialog n'est pas appelé, les controles de ta fenêtre ne sont pas complètement initialisés.
    Si je ne me trompe pas quant à la source du problème, la solution consiste à déclarer un conteneur (CStringList par ex.) dans la dialog (celle qui contiens le listctrl), et de remplir ce conteneur avant de faire le DoModal(). Et c'est dans le OnInitDialog que tu va récupérer le contenu de ce conteneur pour remplir ton listctrl.

    (Je ne rentre pas dans les détails car je ne suis pas sûr d'être sur la bonne voie. N'hésites pas à demander des précisions - et à en donner )

    Hope it helps.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    Et bien tout d'abord merci d'avoir repondu!

    Le probleme est que je ne sais pas comment faire :
    tu dis que je dois
    déclarer un conteneur (CStringList par ex.) dans la dialog (celle qui contiens le listctrl), et de remplir ce conteneur avant de faire le DoModal(). Et c'est dans le OnInitDialog que tu va récupérer le contenu de ce conteneur pour remplir ton listctrl.
    Ainsi dans mon Dialog1.cpp, en dessous de , je dois introduire CStringList ListFichier; pour cela je n'ai pas de probleme mais dès que je veux faire un appel dans le .cpp de ma CFormView par dlg.ListFichier, il me dit qu'il ne fait pas parti de Dialog1... Je me dis que ce n'est pas grave, et que je vais tenter de mettre CStringList ListFichier; dans le Dialog1.h car le Dialog1.h est appele par le .cpp de ma CFormView et par le Dialog1.h...Neanmoins j'ai l'erreur suivante : ialog1.obj : error LNK2005: "class CStringList ListeFichier" (?ListeFichier@@3VCStringList@@A) already defined in CreationOutilsView.obj
    Debug/CreationOutils.exe : fatal error LNK1169: one or more multiply defined symbols found
    Error executing link.exe.
    Que Faire???

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Ta liste doit être membre de ta dialog.

    Je vais te donner un exemple. Dans mon exemple, j'ai une boite de dialogue, que j'ai nommé MaDialog. Normalement, cette classe doit être générée par visual:
    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
    //fichier MaDialog.h
    #pragma once (etc..)
    #include "...
     
    class MaDialog : public CDialog
    {
    public:
    [...]
    void AddStringToList(CString str); //la méthode en question.
    [...]
    CListCtrl m_listCtrl; // Le listctrl qui doit être placé ici par visual via l'editeur de ressources
     
    private:
    CStringList m_list; //le conteneur, ici de type CStringList, qui va contenir les CString
    };
    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
    //fichier MaDialog.cpp
    void MaDialog::AddStringToList(CString str)
    {
        m_list.AddTail(str); //ici, je rajoute la nouvelle CString en queue de list (tail), mais tu le rajoute où tu veux (cf. msdn:cstringlist)
    }
     
    BOOL MaDialog::OnInitDialog()
    {
    [...]
    // la boucle suivante rempli ton listctrl à partir de ta cstringlist
       for (int i=0; i<m_list.GetSize(); i++)
       {
          m_listCtrl.AddString(m_list.GetAt(i));
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //fichier FormViewMachinTruc.cpp, à l'endroit où tu veux ouvrir ta boite de dialogue:
    MaDialog dlg;
    for (/*ce que tu veux*/)
    {
       dlg.AddStringToList(unestring);
    }
    dlg.DoModal();
    P.S: je n'ai pas compilé ce code, je l'ai écris rapidement, donc il y a peut-être des erreurs. Mais c'est pour te faire comprendre le principe.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    Alors je te dis merci!

    Et oui en fait j'ai repris une partie de ce que tu avais fait...et ca marche maintenant.
    Simplement une petite modification dans ton programme : il n'y a qu'a changer le m_list.GetSize(); en m_list.GetCount(); et ce sera parfait

    @+ rv

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

Discussions similaires

  1. pbm transfert données Excel-->Access
    Par mariannesq dans le forum Access
    Réponses: 2
    Dernier message: 02/08/2006, 18h45
  2. Transfert données d'une tab(bdd1) vers tab2(bdd2)
    Par opeo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 18/07/2006, 11h21
  3. transfert données d'interbase vers AS/400
    Par MOSO71 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/05/2006, 12h53
  4. [Mysql] transfert données ajoutées vers serveur distant
    Par hanane28 dans le forum Administration
    Réponses: 3
    Dernier message: 20/11/2005, 19h06
  5. [Socket]Transfert données + fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 17/08/2005, 23h08

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