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 :

CFileDialog et sélection multiple


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut CFileDialog et sélection multiple
    Bonjour a tous !!

    Voila, je suis en train de coder une mini interface permettant de fabriquer un fichier avi à partir de multiples images.
    Après avoir bien regardé les infos de Farscape (http://c.developpez.com/faq/vc/?page...DialogHowToUse) concernant l'utilisation d'une CFileDialog, je me heurte à un bug (a moins que je ne sache pas coder, ce qui est tjs possible ).

    En gros, voila mon souci, pour sélectionner plusieurs fichiers, il faut activer le Flag OFN_ALLOWMULTISELECT, et utiliser les fonctions GetStartPosition et GetNextPathName, par l'intermédiaire d'une variable POSITION Pos. Le hic, c'est que cette méthode ne semble pas marcher quand la sélection dépasse 10 fichiers (en effet, il ne récupère qu'un seul nom de fichier, qui est faux d'ailleurs, et Pos est directement mis à NULL après la première itération)....et je n'ose pas entrer dans la fonction GetNextPathName (qui décrémente Pos) pour comprendre pourquoi je ne récupère pas tous les fichiers.
    Voila, alors maintenant, je vous pose la question : Suis-je un imbécile congénital ? (J'espère que oui, ça fait 2 jours que je m'arrache le peu de cheveux qu'il me reste, et j'aimerais en garder encore un peu )

    Merci a quiconque pourra donner un coup de main la dessus!!!
    Access

  2. #2
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    1. CFileDialog c'est du MFC. Le forum approprié est celui consacré à Visual C++
    2. Poste du code
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  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
    Par défaut
    salut,
    en fait les selections multiples sont stockées dans un buffer et sepparées par un \0 .
    ce buffer est la variable membre m_ofn.lpstrFile
    cette variable sert aussi a initialisér l'edit de selection de nom au depart.
    si sa taille est trop petite domodal renvoie false .
    et la fonction CommDlgExtendedError renvoie FNERR_BUFFERTOOSMALL.
    la solution : donner un buffer plus grand au depart en specifiant la taille.
    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
    25
    26
    27
    28
     
    CString OpenFilter;
        OpenFilter = "Text File (*.doc)|*.doc|";
        OpenFilter += "All Files (*.*)|*.*||";
     
    CFileDialog FileOpenDialog(
    TRUE,
    NULL,
    NULL,
    OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
    OpenFilter,        // filter
    AfxGetMainWnd());// the parent window
     
        FileOpenDialog.m_ofn.lpstrFile= new char[2000];
        FileOpenDialog.m_ofn.nMaxFile=2000;
        *FileOpenDialog.m_ofn.lpstrFile=0;
     
         int ct=0;
         CString str;
         if(FileOpenDialog.DoModal()==IDOK)
         {
            POSITION pos=FileOpenDialog.GetStartPosition();
            while(pos)
            {            
                str.Format("%d ",++ct);            
                AfxMessageBox(str+FileOpenDialog.GetNextPathName(pos));
            }
        }

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ben franchement, plus rapide et plus efficace, je pouvais pas espérer!!
    Merci bcp farscape, ça fait plaisir de voir qu'on est pas tout seul devant windows...
    Le problème est donc résolu (enfin presk, voir PS2), merci encore a tous, même a ceux qui répondent pour ne rien dire....mais surtout à Farscape !!

    Access!

    PS : Farscape (ou les autres qui voudraient débattre ), je trouve quand même étrange que la méthode adaptée à la multi sélection ne soit pas suceptible de gerer plus de 10 entrées...sans doute ne connais-je pas assez ce genre de programmation, mais bon, sur msdn, pas la moindre trace de la solution que tu viens de me donner

    PS2 : Il me reste un petit souci...Quand j'affecte un pointeur sur lpstrFile, il semble que je n'arrive plus a gerer lpstrFilter...
    Alors j'envoie mon code, pour faire plaisir a tout le monde....
    (NB Dans extension, il y a vous vous en doutez l'extension que j'aimerais uniquement voir apparaitre, choisie par l'utilisateur)

    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
    CFileDialog	Boite_Ouv(TRUE, NULL, Extension, OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST, "Images Files (" + Extension +")");
     
    Boite_Ouv.m_ofn.lpstrTitle    =	"Sélectionnez les images";
    //Boite_Ouv.m_ofn.lpstrFilter   =	Extension;
    Boite_Ouv.m_ofn.lpstrFile     =	new char[2000]; 
    Boite_Ouv.m_ofn.nMaxFile    =	2000; 
    *Boite_Ouv.m_ofn.lpstrFile   =	0;
     
    int ct		=	0;
    POSITION pos;
    m_nFile		=	0;
    CString str; 
    if(Boite_Ouv.DoModal()==IDOK) 
    { 
            pos=Boite_Ouv.GetStartPosition(); 
            while(pos) 
            {            
                    str.Format("%d ",++ct);            
                    AfxMessageBox(str+Boite_Ouv.GetNextPathName(pos)); 
    	m_nFile++;
            } 
    }
    Le truc le plus bizarre, c'est quand je commente les instruction sur lpstrFile, ou nMaxFile, le filtre sur l'extension fonctionne. Est ce que cela vous parait "normal" ?

  5. #5
    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
    re,
    tu te trompes dans les arguments de construction:
    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
    25
    26
    27
     
    CString OpenFilter;
        OpenFilter = "Text File (*.doc)|*.doc|";
        OpenFilter += "All Files (*.*)|*.*||";
     
        CString Extension="doc";
        CFileDialog   Boite_Ouv(TRUE, Extension,NULL, OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER,OpenFilter);
     
        Boite_Ouv.m_ofn.lpstrTitle    =   "Sélectionnez les images";
        //Boite_Ouv.m_ofn.lpstrFilter   =   Extension;
        Boite_Ouv.m_ofn.lpstrFile     =   new char[2000];
        Boite_Ouv.m_ofn.nMaxFile    =   2000;
        *Boite_Ouv.m_ofn.lpstrFile   =   0;
     
        int ct      =   0;
        POSITION pos;    
        CString str;
        if(Boite_Ouv.DoModal()==IDOK)
        {
            pos=Boite_Ouv.GetStartPosition();
            while(pos)
            {           
                str.Format("%d ",++ct);           
                AfxMessageBox(str+Boite_Ouv.GetNextPathName(pos));
     
            }
        }
    extension c'est le 2ieme argument pas le 3ieme .

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ben Nickel, ca marche farpaitement !! :o
    Il me restait juste à adapter mon extension variable à Openfilter, et fignoler les options de compression (c'est pour ca que je t'ai pas remercié et clos le sujet, ou cas ou ca merdoierait encore... )
    En tout cas, pour la enieme fois, MERCIIIIiiiIII.

    Access

  7. #7
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Bonjour,

    Je rouvre cette discussion car j'ai rencontré un petit problème...
    Moi aussi j'ai dû avoir recours au code proposé par Farscape. Ça marche très bien, sauf que l'outil Compuware BoundsChecker, que j'utilise, a détecté une fuite mémoire dans ce code. L'outil se trompe peut-être, mais toujours est-il que dans le doute j'ai apporté un petit complément (en fin de 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CString OpenFilter;
    OpenFilter = "Text File (*.doc)|*.doc|";
    OpenFilter += "All Files (*.*)|*.*||";
     
    CString Extension = "doc";
    CFileDialog Boite_Ouv(TRUE, Extension, NULL, OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_EXPLORER, OpenFilter);
     
    Boite_Ouv.m_ofn.lpstrTitle	= "Sélectionnez les images";
    //Boite_Ouv.m_ofn.lpstrFilter	= Extension;
    Boite_Ouv.m_ofn.lpstrFile	= new char[2000];
    Boite_Ouv.m_ofn.nMaxFile	= 2000;
    *Boite_Ouv.m_ofn.lpstrFile	= 0;
     
    int ct = 0;
    POSITION pos;    
    CString str;
     
    if (Boite_Ouv.DoModal() == IDOK)
    {
    	pos = Boite_Ouv.GetStartPosition();
     
    	while(pos)
    	{           
    	    str.Format("%d ", ++ct);           
    	    AfxMessageBox(str + Boite_Ouv.GetNextPathName(pos));
    	}
    }
     
    if (Boite_Ouv.m_ofn.lpstrFile)
    {
    	delete [] fileDialog.m_ofn.lpstrFile;
    	Boite_Ouv.m_ofn.lpstrFile = NULL;
    }
    Il semblerait donc qu'il faille libérer la mémoire allouée pour lpstrFile, ceci n'étant pas fait dans le destructeur de CFileDialog. D'ailleurs, cela serait logique : il vaut mieux libérer la mémoire dans l'objet même qui l'a allouée...

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

Discussions similaires

  1. Sélection multiple dans un sous formulaire ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2019, 01h05
  2. Réponses: 1
    Dernier message: 13/01/2008, 01h39
  3. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21
  4. créer un [ComboBox ??? ] à sélection multiple ?
    Par chasseur37 dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/07/2005, 07h52
  5. [JList] bloquer la sélection multiple
    Par soad dans le forum Composants
    Réponses: 2
    Dernier message: 05/08/2004, 22h28

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