Visual Basic Simple
Visualizza la finestra di dialogo per la selezione di una cartella
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Difficoltà: 3 / 5

Insieme alla versione Professional di Visual Basic è fornito il controllo Microsoft Common Dialog, utile per la selezione di un file da aprire o salvare. Ma non esiste un modo per selezionare una cartella tramite queste finestre.

Figura 1Esiste a questo scopo una finestra di dialogo all'interno della DLL Shell32. Il suo nome è BrowseForFolder. In questo HowTo vedremo come richiamare questa funzione mediante l'API.

Per il nostro scopo creeremo una funzione che ritorna il percorso, ma prima è necessario scrivere alcune dichiarazioni API all'interno del nostro form oppure in un modulo standard

  1. Option Explicit
  2. Private Type BROWSEINFO
  3.     hOwner As Long
  4.     pidlRoot As Long
  5.     pszDisplayName As String
  6.     lpszTitle As String
  7.     ulFlags As Long
  8.     lpfn As Long
  9.     lParam As Long
  10.     iImage As Long
  11. End Type
  12. Private Const BIF_RETURNONLYFSDIRS = &H1
  13. Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long    
  14. Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
  15. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)

Le righe dal 3 al 12 definiscono un nuovo tipo di nome BROWSEINFO. Tale struttura è richiesta dalla funzione API.

La riga 14 presenta una costante BIF_RETURNONLYFSDIRS che indica che vogliamo presentate soltanto le cartelle. Ulteriori costanti che è possibile utilizzare in questa funzione sono presenti nelle dichiarazioni API. Per rintracciarle bisogna cercare tutte le costanti il cui nome inizia per "BIF_" (BrowseInfo Flags).

Alla riga 15 viene dichiarata la prima funzione API: SHBrowseForFolders. Essa richiede che sia passata una variabile di tipo BROWSEINFO (definita prima), mostra la finestra di dialogo per la scelta della cartella e, nel momento in cui l'utente clicca il pulsante OK alloca in uno spazio apposito il nome della cartella selezionata.

La seconda funzione API (riga 16) estrae il percorso della cartella selezionata dall'area di memoria allocata.

L'ultima funzione API (riga 17) dealloca l'area di memoria bloccata dalla funzione SHBrowseForFolders.

Terminate le dichiarazioni passiamo alla scrittura di una funzione che faccia tutto il lavoro mediante un semplice richiamo. La nostra funzione prende il nome di SfogliaCartelle.

  1. Public Function SfogliaCartelle(ByVal Handle As Long) As String

La funzione richiede l'handle del form dentro il quale apparirà la finestra di scelta della cartella e restituisce una stringa in uscita.

  1.     Dim BInfo As BROWSEINFO

Come già accennato prima, la funzione SHBrowseForFolders richiede che sia passata una variabile con la struttura BROWSEINFO. La nostra variabile si chiamerà BInfo.

  1.     Dim CartellaScelta As Long
  2.     Dim PercorsoAllocato As Long
  3.     Dim PercorsoScelto As String

Dichiareremo anche una serie di altre variabili: CartellaScelta indica che è stato possibile estrarre il percorso scelto dall'area di memoria allocata. In caso di mancata estrazione - ovvero quando l'utente preme il tasto Annulla della finestra di dialogo - essa avrà il valore 0.
La variabile PercorsoAllocato conterrà l'indirizzo dell'area di memoria allocata dalla funzione. Tale valore sarà in seguito utilizzato per ricavare il percorso della cartella selezionata che verrà memorizzato nella variabile PercorsoScelto.

  1.     BInfo.hOwner = Handle
  2.     BInfo.lpszTitle = "Scegli una cartella:"
  3.     BInfo.ulFlags = BIF_RETURNONLYFSDIRS

La struttura BROWSEINFO ha tre elementi fondamentali: hOwner che indica l'handle della finestra dentro la quale apparirà la nostra finestra di dialogo. La nostra funzione SfogliaCartelle ci provvede l'handle da assegnare a tale elemento (riga 24).
Altro elemento fondamentale è lpszTitle e indica il testo che apparirà nella parte superiore della finestra di dialogo. L'ultimo elemento è anche il più importante: esso indica il tipo di azione da eseguire con tale finestra: noi assegneremo il valore della costante BIF_RETURNONLYFSDIRS dichiarata prima.

  1.     PercorsoAllocato = SHBrowseForFolder(BInfo)

Eseguiamo la chiamata alla funzione SHBrowseForFolders che mostrerà la finestra di scelta della cartella. All'uscita della finestra, la variabile PercorsoAllocato conterrà un puntatore all'area di memoria allocata dall'ultima funzione.

  1.     PercorsoScelto = Space$(512)

Come per tutte le funzioni API che utilizzano stringhe, è necessario prepare prima la variabile mediante l'istruzione Space$.

  1.     CartellaScelta = SHGetPathFromIDList(PercorsoAllocato, PercorsoScelto)

La funzione SHGetPathFromIDList estrae il percorso allocato dall'area di memoria indicata da PercorsoAllocato e lo memorizza nella variabile PercorsoScelto.
Se l'utente ha annullato la scelta, il tentativo di estrazione del percorso ritornerà il valore 0.

  1.     If CartellaScelta Then

Quindi segue un controllo che si assicura che l'utente abbia scelto qualche cartella. In caso negativo il programma salta alla riga 34.

  1.         SfogliaCartelle = Left$(PercorsoScelto, InStr(PercorsoScelto, Chr$(0)) - 1)

Tutte le funzioni API restituiscono le variabili stringa con un terminatore (codice ASCII 0) alla fine. Questa riga provvede a eliminare il terminatore finale da PercorsoScelto e memorizza il rimanente nella variabile SfogliaCartelle che sarà il valore ritornato all'uscita della funzione.

  1.         CoTaskMemFree PercorsoAllocato

Fatto questo è necessario deallocare la memoria allocata.
La funzione CoTaskMemFree provvede a questo e richiede un puntatore.

  1.     Else
  2.         SfogliaCartelle = ""

L'utente ha annullato la selezione. Non sarà ritornata alcuna cartella all'uscita.

  1.     End If
  2. End Function

Figura 2Terminata la nostra funzione possiamo passare alla semplice interfaccia.
Inseriamo sopra il nostro form due controlli: un pulsante di comando di nome Sfoglia ed una casella di testo di nome Percorso.

Nel momento in cui l'utente clicca il pulsante Sfoglia viene richiamato l'evento click:

  1. Private Sub Sfoglia_Click()
  2.     Percorso.Text = SfogliaCartelle(Me.hWnd)
  3. End Sub

Questa semplice routine scrive il percorso della cartella selezionata all'interno della casella di testo di nome Percorso.

È terminata qui. Basta cliccare il pulsante Sfoglia per vedere apparire la finestra di dialogo "Sfoglia per Cartelle".

Fibia FBI
4 Dicembre 2000

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'indice degli HowTo