OVH Cloud OVH Cloud

Simuler icône "Parent" dans CommonDialog

13 réponses
Avatar
Jacques
Bonjour
Comment, si c'est possible, coder l'action de l'icône "Dossier parent" de
CommonDialog?
Merci

10 réponses

1 2
Avatar
Jacques93
Bonjour Jacques,
Jacques a écrit :
Bonjour
Comment, si c'est possible, coder l'action de l'icône "Dossier parent" de
CommonDialog?



Je ne suis pas sur de comprendre exactement ce que tu désires, mais tu
trouveras sur :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd.htm

un code gérant les contrôles communs de Windows sans se servir de
ComDlg32.ocx, et qui intercepte un certain nombre d'évenements
(notamment changement de fichier / répertoire) :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd6s.zip

Bonne lecture ;-)

--
Cordialement,

Jacques.
Avatar
Jacques
Bonjour Jacques (;-
Merci de ta réponse. J'ai téléchargé cmdlgd mais je dois dire que cela
dépasse quelque peu mes capacités. Cependant, je crois que cela ne répond pas
vraiment à ma recherche. Regarde l'image à l'adresse
http://jacma.chez-alice.fr/images/CmdDial6.gif , tu comprendras l'action que
je veux simuler (l'icôneentourée en rouge).
Cordialement

"Jacques93" a écrit :

Bonjour Jacques,
Jacques a écrit :
> Bonjour
> Comment, si c'est possible, coder l'action de l'icône "Dossier parent" de
> CommonDialog?

Je ne suis pas sur de comprendre exactement ce que tu désires, mais tu
trouveras sur :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd.htm

un code gérant les contrôles communs de Windows sans se servir de
ComDlg32.ocx, et qui intercepte un certain nombre d'évenements
(notamment changement de fichier / répertoire) :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd6s.zip

Bonne lecture ;-)

--
Cordialement,

Jacques.



Avatar
Guy DETIENNE
Salut :O)

Il a selon moi 2 solutions. Une plus ou moins longue et une autre très
simple

+/- Longue :
Ttu écrits entièrement la fonction qui te donnera le répertoire parent en
fonction d'un chemin donné.
Ex: C:WindowsSystem32 -> à toi de déduire que le répertoire parent de
System32 est C:Windows. Avec quelques manipulations de chaînes de
caractères, tu devrais y arriver facilement.

Très simple :
Tu référencies via le menu Projet -> Références, la référence Microsoft
Scripting Runtime
Ce qui nous permettra de manipuler le File System Object (utilisé en
scripting Windows), parfois décrié mais utile pour des projets limités en
diffusion. -> raison ; le scripting peut être désactivé sur une machine,
donc méthode peu sûre. Dans la plupart des cas, le scripting est activé.

A partir de là, tu instancies un objet de la sorte :
Dim oFSO As New FileSystemObject
Dim strPath as String

strPath = "C:WindowsSystem32"

'cela retourne C:Windows
MsgBox oFSO.GetParentFolderName(strPath)

'On kill l'objet
Set oFSO = Nothing

Voilà.

Bonne chance

Guy

"Jacques" a écrit dans le message de
news:
Bonjour Jacques (;-
Merci de ta réponse. J'ai téléchargé cmdlgd mais je dois dire que cela
dépasse quelque peu mes capacités. Cependant, je crois que cela ne répond


pas
vraiment à ma recherche. Regarde l'image à l'adresse
http://jacma.chez-alice.fr/images/CmdDial6.gif , tu comprendras l'action


que
je veux simuler (l'icôneentourée en rouge).
Cordialement

"Jacques93" a écrit :

> Bonjour Jacques,
> Jacques a écrit :
> > Bonjour
> > Comment, si c'est possible, coder l'action de l'icône "Dossier parent"


de
> > CommonDialog?
>
> Je ne suis pas sur de comprendre exactement ce que tu désires, mais tu
> trouveras sur :
>
> http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd.htm
>
> un code gérant les contrôles communs de Windows sans se servir de
> ComDlg32.ocx, et qui intercepte un certain nombre d'évenements
> (notamment changement de fichier / répertoire) :
>
> http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd6s.zip
>
> Bonne lecture ;-)
>
> --
> Cordialement,
>
> Jacques.
>


Avatar
Gloops
Salut Guy,

Excuse-moi, j'avais d'abord compris la demande de Jacques, mais après
avoir lu ta réponse, je suis allé voir l'image, car j'ai eu un doute.

J'ai cherché là-dedans :
http://vbnet.mvps.org/index.html?code/callback/browsecallback.htm

J'ai essayé une des boîtes, dans la rubrique
Centering the Open & Save Common Dialogs Using Callbacks, Advanced
et la boîte avait un bouton "Parent".



Plein d'autres choses intéressantes sur le site.
Avatar
Gloops
Guy DETIENNE a écrit, le 12/11/2005 13:49 :


+/- Longue :
Ttu écrits entièrement la fonction qui te donnera le répertoire parent en
fonction d'un chemin donné.
Ex: C:WindowsSystem32 -> à toi de déduire que le répertoire parent de
System32 est C:Windows. Avec quelques manipulations de chaînes de
caractères, tu devrais y arriver facilement.



Salut,

Pour obtenir C:Windows à partir de C:WindowsSystem32, en travaillant
sur des chaînes de caractères ?


Public Function RepAscendant(strRep As String) As String
Dim D As Integer
If Len(strRep) < 3 Then
RepAscendant = ""
Exit Function
End If
If Left$(strRep, 2) = "" Then 'UNC
D = InStr(3, strRep, "")
If D > 0 Then
RepAscendant = Left$(strRep, InStrRev(strRep, "") - 1)
Else
RepAscendant = ""
End If
Else
If Len(strRep) > 3 Then
RepAscendant = Left$(strRep, InStrRev(strRep, "") - 1)
Else
RepAscendant = ""
End If
End If
End Function


Attention, dans le cas de l'UNC, j'ai considéré que le chemin ascendant
du domaine était le serveur. Il y a peut-être à redire, là ?

Autre point d'attention : si on n'a réduit la longueur que de un, c'est
que le chemin était suivi d'une barre inverse, il convient donc de faire
un deuxième appel de la fonction.
Avatar
Guy DETIENNE
Salut ;O)

Je ne suis pas certain que le lien sur VBNET réponde à la question de
Jacques. D'autant plus que l'implémentation est lourde.
Je crois que Jacques se limitera à FileSystemObject
Le but de ton lien est d'appler la boîte de dialogue "BrowseForFolders" en
préselectionnant un chemin.

Guy



"Gloops" a écrit dans le message de
news:43762579$0$19679$
Salut Guy,

Excuse-moi, j'avais d'abord compris la demande de Jacques, mais après
avoir lu ta réponse, je suis allé voir l'image, car j'ai eu un doute.

J'ai cherché là-dedans :
http://vbnet.mvps.org/index.html?code/callback/browsecallback.htm

J'ai essayé une des boîtes, dans la rubrique
Centering the Open & Save Common Dialogs Using Callbacks, Advanced
et la boîte avait un bouton "Parent".



Plein d'autres choses intéressantes sur le site.



Avatar
Gloops
Salut Jacques,

Par curiosité j'ai essayé.
La première adresse propose des téléchargements, et le premier ne
comporte que la DLL et un readme. C'est vrai que ça peut être décourageant.

Pour la deuxième, une fois que je me suis rappelé qu'il fallait charger
ça en tant qu'administrateur, j'ai eu une erreur 80004015, "la classe
est configurée pour être exécutée comme un ID de sécurité différent de
celui de l'appelant".

C'est moi qui me suis trompé ?

Argh, pardon, je regarde l'objet de démarrage : aucun.

Tu as filé le code d'un ActiveX, non ?

Hum, ben tu vois, j'ai percuté parce que la semaine dernière je me suis
attaqué au gestionnaire de tâches, et j'ai eu la même erreur, mais sinon
j'étais largué. En effet, je télécharge la source d'un ActiveX en
croyant télécharger un projet exemple, alors forcément ça coince.

Maintenant que je suis passé par tout ça, je crois que j'ai compris le
mode d'emploi :
- télécharger un des composants. Si on a le projet source, en cas
d'erreur pour la suite on peut tenter de le recompiler.
- l'enregistrer par regsvr32 (suivi du nom de la DLL, en ne se trompant
pas sur le chemin d'accès)
- l'appeler dans les références d'un nouveau projet
- y appeler la même syntaxe que précédemment pour ouvrir les boîtes
OpenFileName.

Je dois dire que je n'ai pas essayé, j'ai juste deviné.

J'avoue que j'aime bien les appels aux DLL : on copie le code, ça
marche, et ça marchera sur toutes les machines avec Windows. Après on
peut prendre tranquillement le temps de chercher à comprendre.
________________________________________
Jacques93 a écrit, le 12/11/2005 04:54 :

Bonjour Jacques,
Jacques a écrit :

Bonjour
Comment, si c'est possible, coder l'action de l'icône "Dossier parent"
de CommonDialog?




Je ne suis pas sur de comprendre exactement ce que tu désires, mais tu
trouveras sur :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd.htm

un code gérant les contrôles communs de Windows sans se servir de
ComDlg32.ocx, et qui intercepte un certain nombre d'évenements
(notamment changement de fichier / répertoire) :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd6s.zip

Bonne lecture ;-)



Avatar
Jacques93
Bonjour Guy DETIENNE,
Guy DETIENNE a écrit :
Salut ;O)

Je ne suis pas certain que le lien sur VBNET réponde à la question de
Jacques. D'autant plus que l'implémentation est lourde.
Je crois que Jacques se limitera à FileSystemObject
Le but de ton lien est d'appler la boîte de dialogue "BrowseForFolders" en
préselectionnant un chemin.




J'ai probablement du mal interpréter la question de Jacques. S'il s'agit
de sélectionner un répertoire avec BrowseForFolder, on peut utiliser le
module suivant, en l'appelant avec :

dim Rep as String

Rep = BrowseForFolder(Me.hwnd, "C:Toto", _
"Sélectionner un répertoire", False)

Cela évite les problèmes lié à FSO

A coller dans un module :
'========================================================================
Option Explicit

Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, _
ByVal pszPath As String) As Long
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_DONTGOBELOWDOMAIN As Long = &H2
Private Const BIF_RETURNFSANCESTORS As Long = &H8
Private Const BIF_NEWDIALOGSTYLE As Long = &H40
Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000
Private Const BIF_BROWSEFORPRINTER As Long = &H2000
Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000
Private Const MAX_PATH As Long = 260

Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXTA = (WM_USER + 100)
Private Const BFFM_SETSELECTIONA = (WM_USER + 102)

Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Private mStartFolder As String

Public Function BrowseForFolder(ByVal Owner As Long, _
Optional StartFolder As String = "", _
Optional Caption As String = "", _
Optional ShowFiles As Boolean = False) _
As String
Dim bInfo As BrowseInfo
Dim sResult As String
Dim lResult As Long

With bInfo
.hwndOwner = Owner
.pIDLRoot = 0
.pszDisplayName = String$(MAX_PATH, Chr$(0))
If Len(Caption) > 0 Then
.lpszTitle = Caption
End If
.ulFlags = BIF_RETURNONLYFSDIRS ' Or BIF_NEWDIALOGSTYLE
If ShowFiles Then
.ulFlags = .ulFlags Or BIF_BROWSEINCLUDEFILES
End If
.lpfn = GetAddress(AddressOf BrowseCallbackProc)
.lParam = 0
.iImage = 0
mStartFolder = StartFolder

lResult = SHBrowseForFolder(bInfo)
If lResult <> 0 Then
sResult = String(MAX_PATH, 0)
If SHGetPathFromIDList(lResult, sResult) Then
BrowseForFolder = Left(sResult, InStr(sResult, Chr$(0)) - 1)
End If
CoTaskMemFree lResult
End If
End With
End Function

Private Function BrowseCallbackProc(ByVal hwnd As Long, ByVal uMsg As
Long, ByVal lParam As Long, ByVal lpData As Long) As Long
Select Case uMsg
Case BFFM_INITIALIZED
If Len(mStartFolder) > 0 Then
SendMessage hwnd, BFFM_SETSELECTIONA, True, ByVal mStartFolder
End If
End Select
End Function

Private Function GetAddress(Addr As Long) As Long
GetAddress = Addr
End Function



--
Cordialement,

Jacques.
Avatar
Jacques93
Bonsoir Gloops,
Gloops a écrit :
Salut Jacques,

Par curiosité j'ai essayé.
La première adresse propose des téléchargements, et le premier ne
comporte que la DLL et un readme. C'est vrai que ça peut être décourageant.



Le lien sur le Zip est le dernier des 6 liens 'Download' sur la page :

http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgd.htm

==> VB6 Full Source Code (73kb)

et ce qu'il faut charger dans VB, c'est le groupe de projet :

gTstCDLG6.vbg

C'est là que c'est le plus intéressant, à mon sens, car on voit dans la
fenêtre de débogage les différents événements : Folder Change, File
Change, Dialog Closed, etc ..., et on peut adapter le code. Il faut
clicker sur 'cCommonDialog call - Hooked Open' :

http://cjoint.com/?lmueSRIk0f

Et il n'y a rien à enregistrer ... Cela peut être fait lors de la phase
de déploiement, lorsque l'on sépare la dll du projet de développement.

--
Cordialement,

Jacques.
Avatar
Gloops
C'est vrai que sur VBNet, quand on navigue, ça ne met pas à jour l'URL.
ça, ce n'est pas ce qu'ils ont fait de mieux, je n'avais pas bien "fait
gaffe", merci de m'avoir alerté.

Il faut cliquer sur API Index, dans la barre de navigation à gauche,
puis dans la catégorie API cliquer sur G, descendre à GetOpenFileName,
et essayer le deuxième exemple.

Il y a une partie à copier dans un module (d'un nouveau projet, pour
démarrer, ça sera plus simple), et une partie à copier dans le code d'un
formulaire. Le formulaire doit comporter un certain nombre de contrôles
: deux CommandButtons, une ListBox, sept TextBoxes, un Frame avec une
collection de trois boutons radio (OptionButtons, c'est vrai que j'ai
commencé en Anglais : il faut en créer un, le sélectionner, presser Ctrl
C puis Ctrl V, valider la création d'une collection, et encore Ctrl V).
Ensuite si on a créé les contrôles par des doubles-clics il faut les
disposer pour qu'ils soient visibles, on peut se référer à
l'illustration si on le souhaite. Laisser aux contrôles leurs noms par
défaut.

Pour finir lancer le projet, cliquer sur le bouton de son choix.

Une fois que j'ai fait ça j'ai eu une boîte de dialogue (GetOpenFileName
ou GetSaveFileName selon le bouton cliqué) avec un bouton "répertoire
parent" (la petite flèche vers le haut) pour que l'utilisateur puisse,
pendant sa sélection de fichier, aller chercher dans le répertoire du
dessus, puis éventuellement s'apercevoir qu'il s'est trompé et revenir
en double-cliquant sur le répertoire où il était, descendre dans un
sous-répertoire de la même manière, remonter grâce au bouton, la boîte
de dialogue restant ouverte pendant tout ce temps. ça m'a paru
correspondre dans le principe à l'illustration fournie par Jacques. Il y
a d'autres exemples sur le site, il se peut qu'un autre convienne mieux.
____________________________________________
Guy DETIENNE a écrit, le 12/11/2005 19:11 :

Salut ;O)

Je ne suis pas certain que le lien sur VBNET réponde à la question de
Jacques. D'autant plus que l'implémentation est lourde.
Je crois que Jacques se limitera à FileSystemObject
Le but de ton lien est d'appler la boîte de dialogue "BrowseForFolders" en
préselectionnant un chemin.

Guy


1 2