La creazione di un progetto da zero in Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
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


Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it