La funzione DlgDirList (Tutorial completo)
Spesso per lavorare con i files e le directory si rende necessario individuare la struttura
di una directory. Per far ciò viene molto di frequente utilizzato il controllo DirListBox.
Tale controllo viene reso possibile da una funzione, la DlgDirList che popola
una ListBox con files.
Qual'è il passo avanti che si compie utilizzando l'API invece del controllo? Semplicemente
si rende possibile una maggior elasticità nel recuperare informazioni sulla struttura
di una sezione dell'hard disk.
Potremo così utilizzare delle varianti molto interessanti rispetto al controllo standard
DirListBox.
Prima di vedere com'è possibile operare in questo senso, vediamo la dichiarazione
della funzione:
Declare Function DlgDirList Lib "user32" Alias "DlgDirListA" (ByVal hDlg As _
Long, ByVal lpPathSpec As String, ByVal nIDListBox As Long, ByVal nIDStaticPath _
As Long, ByVal wFileType As Long) As Long
|
Da questa dichiarazione si apprende che la funzione necessita di ben cinque parametri,
quattro dei quali sono interi ed uno è in formato stringa (nella fattispecie lpPathSpec, che come vedremo
tra poco è il percorso di un file o di una directory, per cui non può che essere in formato non numerico).
Il valore di ritorno è 0 se la funzione fallisce oppure un intero diverso da zero in
caso di successo.
Ecco di seguito la tabella con la spiegazione di tutti i parametri implicati nella funzione:
hDlg |
E' il riferimento alla form
che include la ListBox che dev'essere manipolata.
|
lpPathSpec |
Indica il percorso
di una directory o di un file. Un esempio di directory valida è "C:\Documenti".
Nel caso di un file, ad esempio "C:\Documenti\1.txt", la funzione divide la stringa in
drive ("C:\"), directory ("Documenti\") e file "1.txt" e quindi comincia a cercare la directory
nel drive specificato ed all'interno di essa opera la ricerca del file. Nel caso in cui drive
e directory non siano specificati, la funzione cerca il nome del file all'interno della directory
corrente. E' anche possibile recuperare tutti i files con una determinata estensione, ad
esempio "C:\Documenti\*.txt, recupera tutti i file di testo ossia con estensione .txt presenti
nella directory "Documenti\" del drive "C:\".
|
nIDListBox |
Identifica la ListBox all'interno della form indicata dal parametro hDlg. Nel caso
tale intero sia 0, la funzione non avrà successo
|
nIDStaticPath |
Identifica un controllo presente sulla stessa form della ListBox. Attraverso tale controllo
(che il più delle volte è una TextBox oppure una ComboBox) la funzione DlgDirList
visualizza il drive e la directory correnti. Impostando questo parametro a 0 si può disattivare
questa possibilità
|
uFileType |
Indica l'operazione che deve essere compiuta sulla ListBox o meglio, con quali
elementi popolare la ListBox. Il parametro può essere rappresentato da uno o più
dei seguenti valori:
DDL_ARCHIVE include i files archiviati;
DDL_DIRECTORY include le directory. Le sottodirectory verranno quindi racchiuse
tra i simboli "[ ]";
DDL_DRIVES include il nome dei drives;
DDL_EXCLUSIVE include solamente files con gli attributi specificati;
DDL_HIDDEN include i files nascosti;
DDL_READONLY include i files di sola lettura;
DDL_READWRITE include i files senza attributi speciali;
DDL_SYSTEM include i files di sistema;
DDL_POSTMSGS se impostata, la funzione DlgDirList utilizza la funzione
PostMessage per inviare messaggi al controllo ListBox, in caso contrario
viene utilizzata la funzione SendMessage (default),
|
Elenchiamo di seguito le costanti dei valori appena visti:
Ecco di seguito la tabella con la spiegazione di tutti i parametri implicati nella funzione:
DDL_ARCHIVE = &H20
DDL_DIRECTORY = &H10
DDL_DRIVES = &H4000
DDL_EXCLUSIVE = &H8000
DDL_HIDDEN = &H2
DDL_READONLY = &H1
DDL_READWRITE = &H0
DDL_SYSTEM = &H4
DDL_POSTMSGS = &H2000
|
Prima di fare un esempio accenniamo al fatto che per identificare un controllo valido
per la funzione DlgDirList sarà necessario utilizzare la funzione GetDlgCtrlID
trattata separatamente e quindi non analizzata in maniera approfondita nel codice che
segue.
Apriamo dunque un nuovo progetto EXE Standard. Apparirà per default la form denominata
Form1. Trasciniamo sul piano un controllo ListBox ed un controllo TextBox.
Dichiariamo la funzione DlgDirList e la GetDlgCtrlID ed i relativi flags:
Private Declare Function DlgDirList Lib "user32" Alias "DlgDirListA" (ByVal hDlg As _
Long, ByVal lpPathSpec As String, ByVal nIDListBox As Long, ByVal nIDStaticPath As Long, ByVal wFileType As Long) As Long
Private Declare Function GetDlgCtrlID Lib "user32" (ByVal hwnd As Long) As Long
Private Const DDL_ARCHIVE = &H20
Private Const DDL_DIRECTORY = &H10
Private Const DDL_DRIVES = &H4000
Private Const DDL_EXCLUSIVE = &H8000
Private Const DDL_HIDDEN = &H2
Private Const DDL_POSTMSGS = &H2000
Private Const DDL_READONLY = &H1
Private Const DDL_SYSTEM = &H4
Private Const DDL_READWRITE = &H0
|
Premettiamo che è perfettamente inutile dichiarare tutte le costanti se, come faremo
noi, ne utilizzeremo solamente due o tre. In ogni caso, se la cosa non crea troppa
confusione nel codice, possiamo anche tenerle tutte.
A questo punto entriamo in merito dell'evento Load di Form1 e facciamo mente
locale su tutto quello che dobbiamo fornire alla funzione. Innanzitutto il primo parametro
richiesto è il riferimento alla form che ospita la ListBox, valore semplice in quanto dato
come sempre da:
Private Sub Form_Load()
Dim RiferimentoForm As Long
RiferimentoForm = Form1.hWnd
|
Il secondo parametro richiesto è l'intero che identifica la ListBox, facilmente recuperabile
attraverso la funzione GetDlgCtrlID al quale far elaborare il riferimento al controllo:
Dim ListBoxID As Long
ListBoxID = GetDlgCtrlID(List1.hWnd)
|
La stessa cosa vale per la TextBox:
Dim TextBoxID As Long
TextBoxID = GetDlgCtrlID(Text1.hWnd)
|
Per concludere quindi richiamiamo la funzione e chiudiamo la sottoprocedura con End Sub:
DlgDirList RiferimentoForm, "C:\Documenti", ListBoxID, _
TextBoxID, DDL_DIRECTORY Or DDL_DRIVES Or DDL_ARCHIVE
End Sub
|
Queste due linee di codice necessitano di una spiegazione. Abbiamo innanzitutto indicato
con RiferimentoForm che la ListBox si trova all'interno di Form1. Abbiamo poi indicato
il percorso della directory che c'interessa mappare e rispettivamente l'ID della ListBox
che conterrà files e directory e quello della TextBox che visualizzerà il percorso corrente.
Infine abbiamo specificato con quali dati riempire la ListBox: directory e sottodirectory,
drives e files.
Ecco di seguito il codice completo dell'esempio:
Private Declare Function DlgDirList Lib "user32" Alias "DlgDirListA" (ByVal hDlg As _
Long, ByVal lpPathSpec As String, ByVal nIDListBox As Long, ByVal nIDStaticPath _
As Long, ByVal wFileType As Long) As Long
Private Declare Function GetDlgCtrlID Lib "user32" (ByVal hwnd As Long) As Long
Private Const DDL_ARCHIVE = &H20
Private Const DDL_DIRECTORY = &H10
Private Const DDL_DRIVES = &H4000
Private Const DDL_EXCLUSIVE = &H8000
Private Const DDL_HIDDEN = &H2
Private Const DDL_POSTMSGS = &H2000
Private Const DDL_READONLY = &H1
Private Const DDL_SYSTEM = &H4
Private Const DDL_READWRITE = &H0
Private Sub Form_Load()
Dim RiferimentoForm As Long
RiferimentoForm = Form1.hWnd
Dim ListBoxID As Long
ListBoxID = GetDlgCtrlID(List1.hWnd)
Dim TextBoxID As Long
TextBoxID = GetDlgCtrlID(Text1.hWnd)
DlgDirList RiferimentoForm, "C:\Documenti", ListBoxID, _
TextBoxID, DDL_DIRECTORY Or DDL_DRIVES Or DDL_ARCHIVE
End Sub
|
|