General

6.5 Richiamare la finestra di dialogo per la selezione di una directory.
  Nicola
(D)
Come posso richiamare la finestra per la selezione e il recupero del path di una directory?

(R)
Quella che segue è la dichiarazione della struttura da passare alla funzione SHBrowseForFolder che permette di mostrare il browse folder. Nell'esempio imposto poi soltanto 3 degli elementi della struttura; hOwner che è l'ID della finestra chiamante, lpszTitle che permette di visualizzare una stringa di intestazione e ulFlags che indica di mostrare un tipo di visualizzazione di oggetti piuttosto che un altro nel browse folder. Provate a cambiare il valore associato a ulFlags per avere altre visualizzazioni con altri risultati ritornati associati.
Public Type BROWSEINFO
   hOwner 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
Queste invece sono le costanti che possono essere passate a ulFlags
Public Const BIF_RETURNONLYFSDIRS = &H1
Public Const BIF_DONTGOBELOWDOMAIN = &H2
Public Const BIF_STATUSTEXT = &H4
Public Const BIF_RETURNFSANCESTORS = &H8
Public Const BIF_BROWSEFORCOMPUTER = &H1000
Public Const BIF_BROWSEFORPRINTER = &H2000
La dichiarazione successiva è della funzione che permette di richiamare il Browser Folder. Si noti che il valore long restituito sarà poi utilizzato dalla successiva funzione che permette di "recuperare" il path e il nome del folder. Questo perchè la SHBrowseForFolder restituisce un puntatore a una struttura che è la lista degli identificatori a partire dal desktop di Windows (che è la radice dello spazio dei nomi del sistema) e passando per tutti i folder che contengono l’oggetto. Il PIDL è un puntatore a questa struttura. Se il PIDL identifica un percorso valido, è possibile convertirlo in una stringa utilizzando SHGetPathFromIDList().
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
   "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
La funzione che segue permette appunto di recuperare il percorso e il folder selezionato nel browser.
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
   "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Nell'esempio che segue viene richiamato il browser e recuperato il path e il folder.
Dim bInf As BROWSEINFO
Dim RetVal As Long,PathID As Long,RetPath As String,Offset As Integer

' impostazione degli elementi della struttura
bInf.hOwner = Me.hWnd
bInf.lpszTitle = " ==== Stringa visualizzata nel browser ====="
bInf.ulFlags = BIF_RETURNONLYFSDIRS

' Mostra il "Browse For Folder" dialog
PathID = SHBrowseForFolder(bInf)
RetPath = Space$(512)

' Recupero il path
RetVal = SHGetPathFromIDList(ByVal PathID, ByVal RetPath)

If RetVal Then
   Offset = InStr(RetPath, Chr$(0))
   MsgBox "Il folder selezionato è :" & Chr$(10) & Chr$(10) & _
   Left$(RetPath, Offset - 1), vbInformation
Else
   MsgBox "Selezionato Tasto Annulla", vbInformation
End If


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.