COMMONDIALOG POUR SÉLECTIONNER UN RÉPERTOIRE ( OCX )

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 9 janv. 2006 à 18:37
facknrask Messages postés 5 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 7 mars 2007 - 21 déc. 2006 à 18:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35482-commondialog-pour-selectionner-un-repertoire-ocx

facknrask Messages postés 5 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 7 mars 2007
21 déc. 2006 à 18:41
facknrask Messages postés 5 Date d'inscription vendredi 10 novembre 2006 Statut Membre Derniè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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 janv. 2006 à 00:46
il s'agit bien de cela
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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és 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
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és 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
10 janv. 2006 à 15:03
merci pour ces quelques précision :D
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 janv. 2006 à 10:27
Très court ici aussi et parfaitement typé:
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
cs_corsica Messages postés 147 Date d'inscription lundi 13 mai 2002 Statut Membre Dernière intervention 15 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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 395 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 19 juin 2009 1
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és 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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és 395 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 19 juin 2009 1
9 janv. 2006 à 22:25
Tiens viens ici pour voir ce que tu pouvait ajouter au moins pour faire un OCX!!

http://www.vbfrance.com/code.aspx?ID=35485
cs_nico1610 Messages postés 395 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 19 juin 2009 1
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és 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
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és 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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és 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
9 janv. 2006 à 18:37
Je l'ai pas encore testé mais faut bien le dire... fallait le faire!
Merci.
Rejoignez-nous