Utilizzare “Sfoglia per cartelle” in VB6

Scritto da loige

E’ 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.

Sfoglia per Cartelle
Figura 1
La possibilità di utilizzare questa interfaccia di windows non è offerta di default da visual basic. Sarà quindi necessario inserire un modulo nel nostro progetto che definisca una particolare funzione in grado di richiamare e gestire la finestra “sfoglia per cartelle” offerta da Windows. Tale funzione sarà poi accessibile da qualsiasi punto del nostro progetto. Ecco il codice che dobbiamo inserire nel nuovo modulo:
 
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:

Sample VB application
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 ;)

Articoli simili

    • Nessun articolo simile

Sponsor

12 Commenti a “Utilizzare “Sfoglia per cartelle” in VB6”

  1. Veramente bel bloggo! Se solo fosse un po più attivo :)

    Ho letto le faq, provo a fare una cosa:


  2. 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!

  3. Cmq per quanto riguarda al tua prova devi scrivere del codice all’interno del commento, esempio:

     
    echo(“ciao Stifler”);

  4. 4
    Riccardo Del Bello ITALY

    Grazie 1000… è perfetto… proprio quello che mi serviva!!!

  5. Bella l’idea e se mi servisse tenere traccia di un file e non di una cartella?

  6. “Bella l’idea e se mi servisse tenere traccia di un file e non di una cartella?”

    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.

  7. 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. 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!

  9. tutto risolto!!!!!!!!!!!!!!!!!!!!!

  10. 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! ;)

  11. 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

  12. 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?!

Scrivi un commento