[access]getopenfilename, sélection multiple
gaby
-
blux Messages postés 1970 Date d'inscription Statut Modérateur Dernière intervention -
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.
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
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:
- [access]getopenfilename, sélection multiple
- Ecran multiple pc - Guide
- Excel cellule choix multiple - Guide
- Copier coller multiple - Guide
- Acer quick access - Forum Logiciels
- Quick Access service ✓ - Forum PC portable
10 réponses
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):
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 -_-'
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 -_-'
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.
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.
Merci je comprends un peu mieux.
Nouvelle question , comment je parcours la chaine en utilisant les offset ?
Nouvelle question , comment je parcours la chaine en utilisant les offset ?
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ^^
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 ^^
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...
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...
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.
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.
Je pense que le problème vient effectivement de là! Mais comment faire ? Avec Right, ça foire lamentablement : /
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.
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.
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 !