Utilizzare “Sfoglia per cartelle” in VB6
Scritto da loigeE’ possibile sfruttare la finestra standard di Windows (figura 1) per selezionare una particolare cartella che intendete utilizzare in un progetto Visual Basic 6. In questo articolo vedremo brevemente come fare.
Option Explicit
Public Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Public Const BIF_RETURNONLYFSDIRS = 1
Public Const MAX_PATH = 260
Public Declare Sub CoTaskMemFree Lib “ole32.dll” (ByVal hMem As Long)
Public Declare Function lstrcat Lib “kernel32″ Alias “lstrcatA” (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Public Declare Function SHBrowseForFolder Lib “shell32″ (lpbi As BrowseInfo) As Long
Public Declare Function SHGetPathFromIDList Lib “shell32″ (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String
‘declare variables to be used
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
‘initialise variables
With udtBI
.hwndOwner = hwndOwner
.lpszTitle = lstrcat(sPrompt, “”)
.ulFlags = BIF_RETURNONLYFSDIRS
End With
‘Call the browse for folder API
lpIDList = SHBrowseForFolder(udtBI)
‘get the resulting string path
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then sPath = Left$(sPath, iNull - 1)
End If
‘If cancel was pressed, sPath = ""
BrowseForFolder = sPath
End Function
Come è semplice intuire dal codice sovrastante, la funzione avrà il nome di ” BrowseForFolder “.
Vediamo subito un esempio su come utilizzare direttamente la funzione appena definita.
Supponiamo di avere un form come quello presentato nella figura seguente:

Figura 2
Questo form presenta un campo di testo text1 e un pulsante cmd1. Come è facile intuire il pulsante servirà per aprire la finestra di selezione delle cartelle di windows, mentre il campo di testo conterrà il percorso completo della directory selezionata.
Il codice che dovremmo inserire nel form sarà simile a questo:
Private Sub cmd1_Click()
folder = BrowseForFolder(hWnd, “Seleziona la cartella in cui desideri salvare il file”)
If folder <> “” Then Text1.Text = folder
End Sub
Il funzionamento di questo codice è molto intuitivo: alla pressione del pulsante cmd1 viene richiamata la funzione BrowseForFolder definita precedentemente. Il secondo parametro sta ad indicare ciò che apparirà nella label della finestra di selezione della cartella, nel nostro caso apparirà “Seleziona la cartella in cui desideri salvare il file“. il percorso della directory selezionata sarà salvato nella variabile folder. Quindi se folder risulta essere una stringa diversa da una stringa nulla allora il contenuto di folder viene inerito come testo di text1.
Con questo è tutto. Provate a sbizzarrirvi un po’ facendo diverse prove. Io per esempio ho utilizzato questa funzione in un programmino che si occupava di copiare dei files in una directory. Alla prossima

17 Marzo 2007 alle 15:33
Veramente bel bloggo! Se solo fosse un po più attivo
Ho letto le faq, provo a fare una cosa:
17 Marzo 2007 alle 19:52
Ciao Stifler, grazie mille del commento.
Siamo pienamente consapevoli della poca attività del blog, ma a gestirlo siamo in pochi ed il tempo non basta mai. Cmq siamo ben intenzionati a cercare qualche volentieroso che ci dia una mano. Quindi se c’è qualche ambito particolare della programmazione che ti piacerebbe affrontare non esitare a farti aventi!
A presto!
19 Marzo 2007 alle 00:54
Cmq per quanto riguarda al tua prova devi scrivere del codice all’interno del commento, esempio:
12 Aprile 2007 alle 11:25
Grazie 1000… è perfetto… proprio quello che mi serviva!!!
15 Aprile 2007 alle 04:00
Bella l’idea e se mi servisse tenere traccia di un file e non di una cartella?
15 Aprile 2007 alle 15:48
Puoi farlo facilmente utilizzando i common controls. Spesso non li trovi nella toolbars degli strumenti all’avvio di Visual Basic 6, quindi devi aggiungerli manualmente esplorando tutti i controlli ocx disponibili e cercando “Microsoft common controls” oppure gli ocx “mscomctl.ocx” e “comctl32.ocx”.
Questi ocx offrono al programmatore l’opportunità di utilizzare comuni interfacce di windows tra le quale anche quella per la selezione di un file.
8 Giugno 2007 alle 16:24
scusa loige
nn capisco xke’ quando premo si cmd1 mi da errore di applicazione?!
e poi nn ho capito dove copiare il primo codice?!
8 Giugno 2007 alle 16:36
vredo di aver risolto i problemi prec.
nn capisco invece xke’ (ed è l’unico errore ke mi da’) nn riconosce il tipo “SHBrowseForFolder”?
risp presto!
8 Giugno 2007 alle 16:39
tutto risolto!!!!!!!!!!!!!!!!!!!!!
11 Giugno 2007 alle 16:56
Scusami giovanni se la risposta non è stata così tempestiva, ma sono sommerso dagli impegni ultimamente!
Che tipo di errore avevi riscontrato?!
Fammi sapere se cmq posso aiutarti in qualche modo!
12 Giugno 2007 alle 17:19
Scusami loige se ti importuno un altra volta!
ho inserito i common controls ma nn riesco a trovare quello ke mi permette di selezionare un file!
e se anke lo trovassi nn saprei cm utilizzarlo!
delucidami!!!
grazie in anticipo, Giovanni
13 Giugno 2007 alle 17:33
Ciao giovanni.
Ti dico subito che il controllo che ti permette di selezionare i file non sta in common controls ma in “common dialogs”.
Sono passato al Visual Basic .NET ed al momento non mi ritrovo più installato il Visual Basic 6… Poichè nel .NET le cose sono parecchio diverse non posso dirti esattamente come fare con VB6…
Ad ogni modo cercherò di darti qualche spiegazione sul funzionamento dei Common Controls per VB6…
Allora innanzitutto bisogna osservare che il common dialogs è un unico componente, ma contiene in se diversi metodi che permettono di utilizzare molte interfacce per così dire “comuni” come ad esempio: salvataggio o apertura di un file, selezione di un colore, selezione di varie opzioni di stampa, selezione di fonts, ecc…
Il primo passo fondamentale da eseguire è quello di abilitare il controllo nel pannello dei controlli disponibili.
Così facendo potrai facilmente inserire il controllo in tutti i form in cui vorrai utilizzare una delle tante “interfacce comuni”.
Una volta inserito il controllo in un form, dal codice di quel form potrai accedere ad ogni metodo ed attributo pubblico del controllo.
In linea di massima, se non ricordo male, dovrebbe essistere una funzione specifica per invocare ogni interfaccia. Ogni interfaccia ovviamente espone una serie di controlli (campi di testo, bottoni, ecc) che in fase di esecuzione verranno opportunamente utilizzati dall’utente. Ogni interfaccia “comune” ogni volta che viene evocata modifica alcuni attributi del controllo, di conseguenza per capire cosa ha selezionato un utente o quali parametri ha fatto variare, basterà ispezionare gli attributi desiderati alla chiusura di una particolare interfaccia comune…
Forse detto così non riesco a dirti nulla di pratico, ma spero almeno di averti dato un’idea generale di come comportarti con i conmon dialogs.
Cmq se vuoi avere in mano qualcosa di più concreto e qualche esempio puoi dare un’occhiata a questo link:
http://www.pierotofy.it/pages/dispense/Visual_Basic/Salvare_e_aprire_file/
Data la tua attiva presenza nel sito mi piacerebbe molto se decidessi di registrarti… che ne dici?!