facknrask
Messages postés5Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention 7 mars 2007 21 déc. 2006 à 18:40
y a plus simple !!!!
Function ChoixDossierFichier(Racine, Optional SelType As Byte = 0)
Dim objShell, objFolder, chemin, SecuriteSlash, FlagChoix&, Msg$
If SelType = 0 Then
FlagChoix &H1&: Msg "Choisissez votre dossier :"
Else
FlagChoix &H4000&: Msg "Choisissez votre fichier :"
End If
Set objShell = CreateObject("Shell.Application")
'le troisième paramètre permet de choisir
'la sélection d'un dossier ou d'un fichier (0 ou 1)
'le dernier paramètre permet de choisir le dossier racine
Set objFolder = objShell.BrowseForFolder(&H0&, Msg, FlagChoix, Racine)
On Error Resume Next
chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & ""
If objFolder.Title = "Bureau" Then
chemin = "C:\Windows\Bureau"
End If
If objFolder.Title = "" Then
chemin = ""
End If
SecuriteSlash = InStr(objFolder.Title, ":")
If SecuriteSlash > 0 Then
chemin = Mid(objFolder.Title, SecuriteSlash - 1, 2) & ""
End If
ChoixDossierFichier = chemin
End Function
Public Sub testfolder()
aaa = ChoixDossierFichier("d:")
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 11 janv. 2006 à 00:46
il s'agit bien de cela
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 10 janv. 2006 à 18:19
Oui, la MSDN parle de liaison tardive ou précoce - enfin, je crois que c'est ces termes...
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 10 janv. 2006 à 18:13
Ok merci pour l'info, maintenant que tu le dis il me semble que j'en avais entendu parlé (par toi :-)) ailleurs sur le site.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 janv. 2006 à 17:41
Const BIF_NEWDIALOGSTYLE As Long = &H40
le Late Binding, en gros, c'est le fait de définir en cours d'execution le type d'objet que l'on manipule... (ca n'est pas fait à la compilation)...
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 10 janv. 2006 à 17:31
Renfield>>2 questions
1°-Quel valeur doit-on attribuer à BIF_NEWDIALOGSTYLE.
2°-Qu'est ce que le Late-Binding.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 10 janv. 2006 à 15:03
merci pour ces quelques précision :D
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 janv. 2006 à 12:55
oui, As Object... a ce niveau, ca ne changerai pas grand chose.
Cette fonction, etant déstinée à VBS, CreateObject est utilisé, et ces variables sont juste déclarées pour valider le 'Option Explicit'.
touché par cette considération pour mon travail
la Dll de BruNews apporte du tout en un, et facilite l'integration de telles fonctions, pour les utilisateurs de VB / VBA.... Les APIs, sont là, mais il faut bien souvent un brin de code autour, pour les 'wrapper' dans des fonction VB utilisables tel quel...
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 10 janv. 2006 à 12:33
(Nota Renfield que c'est plutôt Bouv qui disait ça ;-)
Dit moi Renfield... pardonne moi cette question de "débutant" mais pourquoi tu déclare Folder en Variant plutôt qu'en Objet ??? Ne serait-ce pas mieux typé ainsi ?
Pi dit, c'est toi qui aurait du faire cette source puisque tu métrise tellement ces APIs !!! Franchement, si tu nous faisais un OCX ou une classe, je l'utiliserais les yeux fermés (et je ne crois pas être le seul!!!) !
Bru, bon, d'accord, mais c'est en utilisant ta DLL !!! J'ai donc une question qui me brule les lèvres : pourquoi as-tu codé (1515 lignes en ASM si j'ai bien tout compris...) cette DLL puisqu'il existe des APIs ???
Défi personnel ou réel utilité (comblage d'un trou quelconque - lequel ?) ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 janv. 2006 à 10:27
Sub ChoisitDossier()
Dim strDir As String, sTitle As String
sTitle = "Dossier depuis Excel"
strDir = "D:\bosser"
If bnSelectDir(sTitle, strDir) Then Debug.Print strDir
End Sub
cs_corsica
Messages postés147Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention15 février 2010 10 janv. 2006 à 10:16
Merci pour vos remarques , j'en prends bonne note , je bosse sur la version améliorée :-)
Renfield , ta fonction BrowseAndCreate marche à merveille mais ne permet pas de choisir un répertoire de démarrage. On pourra tout au plus spécifier un rootFolder différent de Desktop et ainsi restreindre le parcour de l'arborescence de fichiers.
Mais effectivement c'est quand même diablement plus court que ce que je propose !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 janv. 2006 à 10:03
dans BrowseForFolderCallBackFunc, le Select Case est inutile :
If uMsg = BFFM_INITIALIZED Then
SendMessage hwnd, BFFM_SETSELECTIONA, 1, ByVal BFFInitialPath
End If
suffit. Le test sur la longueur de BFFInitialPath a été reporté là :
If LenB(BFFInitialPath) > 0 Then
.lpfnCallback = GetAddress(AddressOf BrowseForFolderCallBackFunc)
End If
dans ShowBrowseForFolderDlg,
.lpszTitle = lstrcat(Msg, "")
est faux, regarde le libellé, au dessus de ton TreeView, la chaine ne comprend qu'un caractère...
il faudrait :
.lpszTitle = StrPtr(StrConv(Msg, vbFromUnicode))
de même, si l'on presse Annuler, le chemin est vide... ca devrait conserver le chemin originel.
je rejoins ScSami : un OCX est inutile ici
petit détail,
il vaut mieux favoriser :
sPath = Space$(MAX_PATH)
que
sPath = String$(MAX_PATH, 0)
en ajoutant le flag BIF_NEWDIALOGSTYLE dans BrowseInfo, tu pourra redimensionner la fenetre, et tu aura un bouton "nouveau dossier"
pour conclure, j'indique une simple alternative :
Public Function BrowseAndCreate(Title As String) As String
Dim Shell As Variant, Folder As Variant
Set Shell = CreateObject("Shell.Application")
Set Folder = Shell.BrowseForFolder(hWnd, Title, 0, "")
BrowseAndCreate = Folder.items.Item.Path
End Function
cette fonction est plutot destinée au VBS, mais fonctionne aussi sous VB, bien que je ne la préconise pas (en partie a cause du non typage des données, et du Late-Binding)
cs_nico1610
Messages postés395Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention19 juin 20091 10 janv. 2006 à 07:46
l'OCX que je parle ici (http://www.vbfrance.com/code.aspx?ID=35485) c'est le tiens corsica que j'ai reprit et fait une gestion des erreurs des plus simples, nom du selecteur de dossier personalisable.
Tous ca sans commentaire !! Oups !!
Je vais la modifié pour y mettre des commentaire !!
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 10 janv. 2006 à 03:06
Tient, je la connaissait pas celle-là!
OCX, module de class, module de code... wai, perso, je préfère les OCX s'ils sont bien codé (prise en charge des erreurs). Mais bon, chacun code comme il aime!
cs_nico1610
Messages postés395Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention19 juin 20091 9 janv. 2006 à 22:25
Tiens viens ici pour voir ce que tu pouvait ajouter au moins pour faire un OCX!!
cs_nico1610
Messages postés395Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention19 juin 20091 9 janv. 2006 à 20:42
Bien mais manque un peut d'option pour faire un vrai OCX (Gestion des erreurs(quand tu clic sur Cancel) ... )
Comme dit Bouv il n'y a aucun interet de creer un Ocx si on peut le faire avec un module !!
Je met aucune note, mais bien sur l'API et la création d'un OCX
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 9 janv. 2006 à 20:07
Je connaissais déjà cette API. Mais c'est toujours bon a rappeler.
Cependant, je pense que l'utilisation d'un controle utilisateur n'a pas d'interet ici (le module se suffit en lui même).
Tu met la fonction GetFolder (en public) dans le module et toutes les autres en privées...
Cela évite de se trimbaler une OCX de plus (ou controle utilisateur).
Bonne prog
++
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 9 janv. 2006 à 18:47
Enfin moi, je serais toi, je ne mettrais pas un titre pareil à ma source parce qu'on croit vraiment que c'est encore un newbie qui a découvert CommonDialog !!!
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 9 janv. 2006 à 18:37
Je l'ai pas encore testé mais faut bien le dire... fallait le faire!
Merci.
21 déc. 2006 à 18:41
21 déc. 2006 à 18:40
Function ChoixDossierFichier(Racine, Optional SelType As Byte = 0)
Dim objShell, objFolder, chemin, SecuriteSlash, FlagChoix&, Msg$
If SelType = 0 Then
FlagChoix &H1&: Msg "Choisissez votre dossier :"
Else
FlagChoix &H4000&: Msg "Choisissez votre fichier :"
End If
Set objShell = CreateObject("Shell.Application")
'le troisième paramètre permet de choisir
'la sélection d'un dossier ou d'un fichier (0 ou 1)
'le dernier paramètre permet de choisir le dossier racine
Set objFolder = objShell.BrowseForFolder(&H0&, Msg, FlagChoix, Racine)
On Error Resume Next
chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & ""
If objFolder.Title = "Bureau" Then
chemin = "C:\Windows\Bureau"
End If
If objFolder.Title = "" Then
chemin = ""
End If
SecuriteSlash = InStr(objFolder.Title, ":")
If SecuriteSlash > 0 Then
chemin = Mid(objFolder.Title, SecuriteSlash - 1, 2) & ""
End If
ChoixDossierFichier = chemin
End Function
Public Sub testfolder()
aaa = ChoixDossierFichier("d:")
End Sub
11 janv. 2006 à 00:46
10 janv. 2006 à 18:19
10 janv. 2006 à 18:13
10 janv. 2006 à 17:41
le Late Binding, en gros, c'est le fait de définir en cours d'execution le type d'objet que l'on manipule... (ca n'est pas fait à la compilation)...
10 janv. 2006 à 17:31
1°-Quel valeur doit-on attribuer à BIF_NEWDIALOGSTYLE.
2°-Qu'est ce que le Late-Binding.
10 janv. 2006 à 15:03
10 janv. 2006 à 12:55
Cette fonction, etant déstinée à VBS, CreateObject est utilisé, et ces variables sont juste déclarées pour valider le 'Option Explicit'.
touché par cette considération pour mon travail
la Dll de BruNews apporte du tout en un, et facilite l'integration de telles fonctions, pour les utilisateurs de VB / VBA.... Les APIs, sont là, mais il faut bien souvent un brin de code autour, pour les 'wrapper' dans des fonction VB utilisables tel quel...
10 janv. 2006 à 12:33
Dit moi Renfield... pardonne moi cette question de "débutant" mais pourquoi tu déclare Folder en Variant plutôt qu'en Objet ??? Ne serait-ce pas mieux typé ainsi ?
Pi dit, c'est toi qui aurait du faire cette source puisque tu métrise tellement ces APIs !!! Franchement, si tu nous faisais un OCX ou une classe, je l'utiliserais les yeux fermés (et je ne crois pas être le seul!!!) !
Bru, bon, d'accord, mais c'est en utilisant ta DLL !!! J'ai donc une question qui me brule les lèvres : pourquoi as-tu codé (1515 lignes en ASM si j'ai bien tout compris...) cette DLL puisqu'il existe des APIs ???
Défi personnel ou réel utilité (comblage d'un trou quelconque - lequel ?) ?
10 janv. 2006 à 10:27
http://www.vbfrance.com/code.aspx?id=18494
Sub ChoisitDossier()
Dim strDir As String, sTitle As String
sTitle = "Dossier depuis Excel"
strDir = "D:\bosser"
If bnSelectDir(sTitle, strDir) Then Debug.Print strDir
End Sub
10 janv. 2006 à 10:16
Renfield , ta fonction BrowseAndCreate marche à merveille mais ne permet pas de choisir un répertoire de démarrage. On pourra tout au plus spécifier un rootFolder différent de Desktop et ainsi restreindre le parcour de l'arborescence de fichiers.
Mais effectivement c'est quand même diablement plus court que ce que je propose !
10 janv. 2006 à 10:03
If uMsg = BFFM_INITIALIZED Then
SendMessage hwnd, BFFM_SETSELECTIONA, 1, ByVal BFFInitialPath
End If
suffit. Le test sur la longueur de BFFInitialPath a été reporté là :
If LenB(BFFInitialPath) > 0 Then
.lpfnCallback = GetAddress(AddressOf BrowseForFolderCallBackFunc)
End If
dans ShowBrowseForFolderDlg,
.lpszTitle = lstrcat(Msg, "")
est faux, regarde le libellé, au dessus de ton TreeView, la chaine ne comprend qu'un caractère...
il faudrait :
.lpszTitle = StrPtr(StrConv(Msg, vbFromUnicode))
de même, si l'on presse Annuler, le chemin est vide... ca devrait conserver le chemin originel.
je rejoins ScSami : un OCX est inutile ici
petit détail,
il vaut mieux favoriser :
sPath = Space$(MAX_PATH)
que
sPath = String$(MAX_PATH, 0)
en ajoutant le flag BIF_NEWDIALOGSTYLE dans BrowseInfo, tu pourra redimensionner la fenetre, et tu aura un bouton "nouveau dossier"
pour conclure, j'indique une simple alternative :
Public Function BrowseAndCreate(Title As String) As String
Dim Shell As Variant, Folder As Variant
Set Shell = CreateObject("Shell.Application")
Set Folder = Shell.BrowseForFolder(hWnd, Title, 0, "")
BrowseAndCreate = Folder.items.Item.Path
End Function
cette fonction est plutot destinée au VBS, mais fonctionne aussi sous VB, bien que je ne la préconise pas (en partie a cause du non typage des données, et du Late-Binding)
10 janv. 2006 à 07:46
Tous ca sans commentaire !! Oups !!
Je vais la modifié pour y mettre des commentaire !!
10 janv. 2006 à 03:06
OCX, module de class, module de code... wai, perso, je préfère les OCX s'ils sont bien codé (prise en charge des erreurs). Mais bon, chacun code comme il aime!
9 janv. 2006 à 22:25
http://www.vbfrance.com/code.aspx?ID=35485
9 janv. 2006 à 20:42
Comme dit Bouv il n'y a aucun interet de creer un Ocx si on peut le faire avec un module !!
Je met aucune note, mais bien sur l'API et la création d'un OCX
9 janv. 2006 à 20:07
Cependant, je pense que l'utilisation d'un controle utilisateur n'a pas d'interet ici (le module se suffit en lui même).
Tu met la fonction GetFolder (en public) dans le module et toutes les autres en privées...
Cela évite de se trimbaler une OCX de plus (ou controle utilisateur).
Bonne prog
++
9 janv. 2006 à 18:47
9 janv. 2006 à 18:37
Merci.