[access]getopenfilename, sélection multiple

gaby -  
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

j'utilise la fonction ouvrirUnFichier de la faq de développez.com, qui permet de récupérer le chemin d'accès vers un fichier.
Le code de la faq utilise la fonction getopenfilename. J'ai rajouter les flags OFN_EXPLORER et OFN_ALLOWMULTIPLESELECTION pour avoir une jolie fenêtre qui permet de sélectionner plusieurs fichiers en même temps.
Problème: la fonction renvoi bien le chemin d'accès et le nom d'un fichier lorsqu'un seul fichier est sélectionnée. Mais lorsque l'on sélectionne deux fichiers, alors je n'arrive à avoir que le chemins d'accès.
OFN_ALLOWMULTISELECT
    Specifies that the File Name list box allows multiple selections. If you also set the OFN_EXPLORER flag, the dialog box uses the Explorer-style user interface; otherwise, it uses the old-style user interface.

    If the user selects more than one file, the lpstrFile buffer returns the path to the current directory followed by the file names of the selected files. The nFileOffset member is the offset, in bytes or characters, to the first file name, and the nFileExtension member is not used. For Explorer-style dialog boxes, the directory and file name strings are NULL separated, with an extra NULL character after the last file name. This format enables the Explorer-style dialog boxes to return long file names that include spaces.


Je crois que la solution se trouve dans ce paragraphe mais je ne comprends pas.. C'est quoi un offset? C'est quoi une séparation par "extra NULL character" et comment la contourner?

Merci d'avance
A voir également:

10 réponses

gaby
 
hum oui désolé chuis pas trés clair mais je fais 15 trucs en même temps.

Voilà le code de la fonction ( qui vient de la faq développez.com):

Public Function OuvrirUnFichier(Handle As Long, _
                                Titre As String, _
                                TypeRetour As Byte, _
                                Optional TitreFiltre As String, _
                                Optional TypeFichier As String, _
                                Optional RepParDefaut As String) As String
 'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
 'la boîte de dialogue de sélection d'un fichier.
 'Explication des paramètres
    'Handle = le handle de la fenêtre (Me.Hwnd)
    'Titre = Titre de la boîte de dialogue
    'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
        '1 = Chemin complet + Nom du fichier
        '2 = Nom fichier seulement
    'TitreFiltre = Titre du filtre
        'Exemple: Fichier Access
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'TypeFichier = Extention du fichier (Sans le .)
        'Exemple: MDB
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'RepParDefaut = Répertoire d'ouverture par defaut
        'Exemple: C:\windows\system32
        'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application

Dim StructFile As OPENFILENAME
Dim sFiltre As String

 'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
  sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)


 'Configuration de la boîte de dialogue
  With StructFile
    .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
    .hwndOwner = Handle 'Identification du handle de la fenêtre
    .lpstrFilter = sFiltre 'Application du filtre
    .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
    .nMaxFile = 254 'Taille maximale du fichier
    .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
    .nMaxFileTitle = 254  'Taille maximale du nom du fichier
    .lpstrTitle = Titre 'Titre de la boîte de dialogue
    .flags = OFN_EXPLORER Or OFN_ALLOWMULTISELECT   'Option de la boite de dialogue originale :
    If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
        RepParDefaut = CurrentDb.Name
        PathStripPath (RepParDefaut)
        .lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1, _
InStr(1, RepParDefaut, vbNullChar) - 1)))
        Else: .lpstrInitialDir = RepParDefaut
    End If
  End With

' sélection multiple
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
    MsgBox StructFile.lpstrFile
    MsgBox StructFile.nFileOffset
    
  End If

End Function


Voilà, comme tu vois j'essaie d'afficher tout à la fin le nom du/des fichier et l'offset.

Imaginons que j'ai un dossier 'mes documents' avec 3 fichiers a,b, et c
Si je sélectionne uniquement a, la première alerte affiche "mes documents/a" et la seconde "59"
Si je sélectionne plusieurs documents, la première alerte donne "mes documents" et la seconde "59".

Donc je n'ai que le chemins d'accès, pas le nom des fichiers.
De plus, un offset qui vaut 59 ça me parait un peu gros pour extraire une sous-chaine, j'ai essayé au cas où mais non.
Je ne sais vraiment pas où sont passés les noms de ces fichiers -_-'
1
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Y'a quand même un truc qui me chagrine...

Tu as une fonction en français (OuvrirUnFichier) avec des paramètres et tu utilises une fonction en anglais (GetOpenFileName) dont je ne vois pas la description !
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Salut,

un offset est un déplacement dans une zone. Ici, cela semble vouloir dire que le nom du premier fichier commence à la position donnée par la variable nFileOffset.

Les noms sont séparés par un caractère de valeur 0 (NULL), il te suffit donc de parcourir la chaine renvoyée par la fonction et d'éclater les différents noms chaque fois que tu trouves le caractère NULL.

L'extra NULL character veut dire qu'à la fin de la liste des noms de fichiers, tu as aussi un caractère NULL.

Pas de contournement possible, la fonction est construite comme ça.
0
gaby
 
Merci je comprends un peu mieux.
Nouvelle question , comment je parcours la chaine en utilisant les offset ?
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Il faut utiliser right pour ne prendre que les n derniers caractères de la chaine à droite de l'offset.

Ensuite, c'est un truc classique, tu lis tes caractères et tu crées tes chaines quand tu tombes sur NULL.
0
gaby
 
Eh bien non ça ne marche toujours pas -.-

Je sais pas trop à quoi c'est dû, lorsque je ne sélectionne qu'un fichier tout se passe correctement mais dès que j'en prends deux, je n'arrive à récupérer que le chemin d'accès et rien d'autre... L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
je n'arrive à récupérer que le chemin d'accès et rien d'autre...
Par quelle méthode ?

L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
C'est quoi : trop gros ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gaby
 
C'est la fonction getOpenFileName qui ouvre les fichiers.
La fonction ouvrirUnFichier est une fonction "fait main" destinée à simplifier l'utilisation de getOpenFileName dans le reste du code.
Si j'ai 3 boutons parcourir, je ne vais pas m'amuser à initialiser la structure structfile puis à lancer getOpenFileName et enfin testé le résultat, je mets tout dans la fonction ouvrirUnFichier.

Si tu veux la description de getOpenFileName il faut consulter la doc officielle ^^
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Je viens de voir ça :

If the user selects more than one file, the lpstrFile buffer returns the path to the current directory followed by the file names of the selected files.
Si tu sélectionnes plusieurs fichiers, lpstrFile contient le path du rép courant suivi de la liste des fichiers sélectionnés...
0
gaby
 
Bin oui, c'est justement ça mon problème!
Lorsque j'affiche lpstrfile avec une alerte, je n'ai que le chemin d'accès et pas le noms des fichiers.
Regarde tout à la fin du code de la fonction OuvrirUnFichier, après le test de getOpenFileName.
Y a une alerte qui affiche lpstrfile et une autre nOffsetFile.
Eh bien lorsque je sélectionne 3 fichiers qui se trouvent dans mes documents, l'alerte renvoi "c:\mes documents" et c'est tout.
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
justement, t'as essayé de taper plus loin que ce qui est affiché ? car il est possible que l'affichage VBA s'arrête au premier NULL trouvé...
0
gaby
 
Je pense que le problème vient effectivement de là! Mais comment faire ? Avec Right, ça foire lamentablement : /
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
mid ?
0
gaby
 
j'ai regarder la doc mais je ne vois pas comment mid pourrait changer quelquechose.. Pour moi, le problème vient du fait que les noms de fichiers sont séparés par NULL, ce qui fait que lors de la lecture de la chaine vba interpréte les null comme une fin de chaine...Ce qui n'est pas le cas.
Du coup il faudrait aller piocher direct dans le buffer les noms de fichiers, mais en vba je ne sais pas du tout comment faire.
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
as-tu essayé ?
car si c'est une fonction appellable en VBA, elle doit être utilisable...
0
gaby
 
Oui j'ai testé mais peu importe la longueur que je précise, la chaine s'arrête sur le NULL...
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
ben là, je sèche...

y'a un exemple, là où tu l'as pêchée, ta fonction ?
0
gaby
 
Mmmm il y a des exemples sur msdn.com, mais évidemment dans un cas simple.
Je pense que le jour où ils ont codés cette fonction, ils ont du oublier que null était un délimiteur de chaine -_-.
Tant pis.
0
blux Messages postés 1970 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
ca m'étonnerait que le loupé soit aussi gros...
0