|
1. Vedremo, che cosè il registro di sistema e come si manipolano i suoi valori.
2. Illustreremo i controlli per manipolare gli elementi del File System: Dirlistbox,
Filelistbox, Drivelistbox.
3. Costruiremo diversi esempi chiarificatori. Facciamo alcune precisazioni di carattere
generale sugli argomenti che tratteremo. I controlli elencati sono di serie disponibili in
Visual Basic, infatti, sono contenuti nella libreria VB (file VB6.OLB) aggiunta
automaticamente tra i componenti. Per quanto riguarda il registro di sistema, in parole
povere, ricordiamo (o illustriamo, per chi è alle prime armi) che è il custode delle
informazioni sul funzionamento del sistema operativo Windows (start up, drive,
impostazione desktop, oggetti utilizzati, ecc..) e delle applicazioni installate. Per tale
motivo, quando si lavora con il registro bisogna stare molto attenti, altrimenti si è
costretti a ripristinare il Registry o reinstallare il sistema operativo (e noi non ci
riteniamo responsabili! Lo sappiamo che siamo egoisti!).
Il Registro di sistema
Il registro di sistema (Registry) è una struttura gerarchica con 6 rami e con
radice Risorse del Computer. Nella Tab. 1 sono riassunte le caratteristiche
principali dei rami; alcuni di essi sono fittizi (puntano ad altri pezzi di albero) e
servono a portare in primo piano delle caratteristiche contenute in sotto alberi. Facciamo
qualche esempio per capire il tipo dinformazione custodita nel registro. Vediamo
dove è custodito lelenco dei file, recenti, aperti con Visual Basic; a tal fine
aprite il registro (Regedit.exe) ed analizzate il seguente ramo:
HKEY_USERS\. DEFAULT\ Software\
Microsoft\ Visual Basic\ 6.0\
RecentFiles.
|
Se sul vostro computer sono configurati più utenti, sotto HKEY_ USERS dovete cercare i
dati che vi interessano. Vediamo come inserire una nuova voce nel menu (di scelta rapida)
che si apre quando si clicca con il tasto destro del mouse su una directory. A tal fine
posizionatevi al seguente ramo: HKEY_ CLASSES_ROOT\Folder\ shell\ ed inserite una nuova
chiave sotto shell (cliccando con il tasto destro del mouse su shell e selezionando nuovo
e poi chiave) e rinominatela TaskMan. Sotto TaskMan inserite unaltra chiave e
rinominatela Command. Spostatevi sulla ListView e cliccate due volte sulla voce
predefinito relativa al nodo Command, ed inserite la seguente riga come
valore: C:\WINDOWS\TASKMAN.EXE. Chiudete il registro e provate a cliccare, con il tasto
destro del mouse, su una directory e successivamente selezionare TaskMan (non ci siamo
soffermati sul significato delle singole azioni precedenti perché esula dagli scopi
dellarticolo).
Tab.1: Rami
predefiniti del Registry. |
|
Usare
il Registry da Visual Basic
Purtroppo gli esempi elencati, non possono essere eseguiti, direttamente, con istruzioni
Visual Basic (salvo utilizzando delle API), poiché le funzioni, che permettono di
manipolare il Registy possono operare solo sul seguente albero secondario:
HKEY_CURRENT_USER\Software\
VB and VBA Program Settings.
|
Le funzioni per programmare il registro sono le seguenti:
1. SaveSetting appname, section, key, setting: permette di salvare un valore nel
registro
2. GetSetting (appname,section,key[,default]): legge un valore dal registro
3. GetAllSettings (appName,section): restituisce un elenco di valori
4. DeleteSetting appname,section,key: cancella un valore.
Appname è il nome del progetto per il quale si vuole salvare o leggere il valore
Fig. 1: Sono mostrati i comandi da
inserire nel Registry per abilitare TaskMan.Exe. |
di una chiave. Section rappresenta il nome della sezione
dellalbero in cui è salvata la chiave (per capirci è il nodo). Key è il
nome associato alla chiave (mostrata nella ListView). Default è il valore da
restituire quando la chiave selezionata è vuoto. Setting è il dato associato alla
chiave. Con degli esempi illustriamo come utilizzare le funzioni.
Una Form con memoria
Supponiamo di voler scrivere e rileggere dal registro il contenuto di un Textbox. Create
un nuovo progetto con una form, in cui inserite due Textbox (Text1, Text2) e un bottone
(Command1) ed usate il seguente codice.
Private Sub Command1_Click()
SaveSetting App.Title, Esempio,
Valore, Text1
Me.Text2 = GetSetting(App.Title,
Esempio, Valore)
End Sub
|
In questo caso, il nome dellapplicazione è App.Title (loggetto App lo
abbiamo introdotto nei precedenti articoli) mentre il nome del nodo creato è Esempio.
Dopo lesecuzione delle istruzioni precedenti controllate il registro nel punto: HKEY_CURRENT_
USER\ Software\VB and VBA Program Settings. Ora supponiamo di voler archiviare,
e poi leggere, una lista di valori utilizzando la funzione GetAllSettings. Innanzi
tutto, nella procedura click, di un bottone, inserite quanto segue.
Private Sub Command3_Click()
SaveSetting App.Title, Posizione,
Left, Text1.Left
SaveSetting App.Title, Posizione,
Top, Text1.Top
SaveSetting App.Title, Posizione,
Width, Text1.Width
SaveSetting App.Title, Posizione,
Height, Text1.Height
End Sub
|
Con le istruzioni precedenti vengono inseriti quattro valori, nel registro, associati al
nodo Posizione con nome: Left, Top, Width e Height; i cui valori
sono le coordinate di un textbox (Text1). Per leggere questi valori utilizziamo .
Inseriamo le istruzioni necessarie in un bottone:
Private Sub Command2_Click()
Dim vettore As Variant
Dim i As Long
vettore = GetAllSettings(App.
Title, Posizione)
For i = 0 To UBound(vettore)
MsgBox Nome: + vettore(i, 0)
+ Dato: + vettore(i, 1)
Next i
End Sub
|
Con la Click di Command2 leggiamo, in un solo colpo, tutti i valori memorizzati in
precedenza. Questi sono inseriti in un vettore di dimensioni e tipo non definiti (Variant)
ed attraverso un ciclo di For, tra zero e lestremo superiore del vettore, sono
mostrati (nome e valore) in un MsgBox. Questo esempio, opportunamente migliorato, può
essere utilizzato per realizzare una procedura che mappa la posizione dei controlli
presenti su una form nel Registry.
Implementiamo un esempio più realistico
Supponiamo che su una form vogliamo abilitare un collegamento (stile collegamento
ipertestuale) in base al valore di un CheckBox e che questa informazione deve essere
ricordata anche dopo aver chiuso il programma. Per fare ciò inseriamo su una
form:
1. una label con Caption Documento (Label3);
2. un TextBox;
3. un CheckBox;
e prevediamo il codice per salvare e rileggere il valore del CheckBox dal/nel registro. Il
valore deve essere letto quando è necessario abilitare o disabilitare il collegamento
ipertestuale. In particolare nella Form_ Load stabiliamo se nel registro è stato
salvato qualche valore:
Private Sub Form_Load()
Me.Check1.Value = GetSetting(
App.Title, CheckBox,
Valore, 1)
End Sub
|
Notate che nella GetSetting abbiamo impostato un valore di default che permette di
abilitare il collegamento alla prima esecuzione.
|
Adesso
prevediamo di impostare il collegamento, e di scrivere nel registro, quando si spunta il
checkbox (nella Check1_Click).
Private Sub Check1_Click()
SaveSetting App.Title, CheckBox,
Valore, Str(Check1.Value)
If Check1.Value Then
impostacollegamento True
Else
impostacollegamento False
End If
End Sub
|
Per impostare il collegamento in stile ipertestuale abbiamo definito la procedura impostacollegamento.
Public Sub impostacollegamento(
setta As Boolean)
With Label3
label da modificare
If setta Then
.ForeColor = &HFF0000
.Font.Underline = -1 True
.MousePointer = 99
.MouseIcon = LoadPicture(
App.Path + \Point05.ico)
Else
.ForeColor = &H0&
.Font.Underline = 0
.MousePointer = 0
End If
End With
End Sub
|
Fig. 2: La figura mostra lo stile del
collegamento attivato sulla Form. |
La procedura precedente lavora sulla label3 ed in base al valore
del parametro setta imposta il suo stile: colore blu, carattere
sottolineato, mouse personalizzato con icona a forma di mano ecc. La icona a forma di mano
(Point05.ico) si trova tra quelle fornite con Visual Basic, ricercatela ed inseritela
nella directory in cui è salvato il progetto. Infine bisogna prevedere la procedura da
richiamare quando il collegamento è attivo (label3: blu e sottolineata).
Private Sub Label3_Click()
If Me.Check1 Then
Form2.Show 1
End If
End Sub
|
In questultima procedura prevediamo di richiamare una nuova form (Form2) a scelta
obbligatoria. La Form2 la definiremo tra poco, dopo aver introdotto gli oggetti: Dirlistbox,
Filelistbox, Drivelistbox.
Una vista sui File
In Visual Basic per creare una vista sul File System sono disponibili vari oggetti. Questi
permettono di eseguire delle ricerche sui componenti visibili del File System: i Dischi,
le Directory ed i File. In particolare per esaminare i dischi è disponibile il controllo DriveListBox,
per mostrare le directory è disponibile il controllo DirListBox mentre per
elencare i file è disponibile il controllo FileListBox. Prima di descrivere come
utilizzarli facciamo una breve carrellata sulla sintassi.
DriveListBox: casella di riepilogo delle unità, permette a runtime di
selezionare il disco che si vuole esaminare; la proprietà drive restituisce il disco
selezionato.
DirListBox: casella di riepilogo delle directory, mostra in un TreeView una
gerarchia di directory; la radice è specificata nella proprietà DirList.Path.
FileListBox: casella di riepilogo dei file, mostra in una lista un elenco di
file; attraverso la proprietà Path è specificata la directory in cui leggere tali file.
Di questi oggetti descriveremo soltanto le proprietà principali e vi rimandiamo alla
guida in linea per maggiori dettagli (se necessari!).
Form di ricerca dei file
Nel progetto precedente inserite una nuova form, la form2, e sulla stessa impostate quanto
segue:
1. Un Dirlistbox (che rinominate: DirList), un Filelistbox (filList) e un Drivelistbox
(drvList);
2. Due CommandButton (Ok e Annulla);
3. Un TextBox in cui mostrare il file selezionato.
Disponete il tutto in dei frame così come in Fig. 3. Sicuramente la prima procedura da
implementare è:
Private Sub Form_Load()
drvList.Drive= App.Path
dirList.Path = App.Path
End Sub
|
Con la quale impostiamo il drive di DrvList ed il Path del controllo Dirlistbox.
Della stringa App.Path nel caso di drvList.drive è utilizzato solo il primo
carattere. Dopo la Form_load impostiamo la procedura che ci permette di
sincronizzare il controllo drvlist con dirlist:
Private Sub DrvList_Change()
On Error GoTo errore
dirList.Path = drvList.Drive
Exit Sub
errore:
drvList.Drive = dirList.Path
Exit Sub
End Sub
|
Fig. 3: La figura mostra la form di ricerca dei file e la casella degli
strumenti. |
Quando si cambia il drive, il Path di dirlist è
posto sul drive selezionato; on error serve ad evitare errori quando un drive non
è disponibile, per esempio quando si seleziona il drive A e non è inserito
nessun dischetto (provate a recuperare in modo più originale questo tipo di errore,
magari con qualche MsgBox). Dato che dobbiamo sincronizzare anche dirList e filList
nel Change di dirlist inseriamo le seguenti righe di codice.
Private Sub dirList_Change()
filList.Path = dirList.Path
End Sub
|
|
Quando
DirList perde il focus dobbiamo, anche, prevedere il cambio di directory, per
questo scriviamo la seguente riga di codice che imposta il path di DirList.
Private Sub DirList_LostFocus()
dirList.Path = dirList.List(dirList.
ListIndex)
restituisce il contenuto della
riga selezionata
End Sub
|
Esso è impostato in base alla riga della dirlist. Per riempire il textbox1, quando si
clicca sulla lista dei file, con il path del file selezionato bisogna prevedere le
seguenti righe di codice.
Private Sub filList_Click()
Dim i As Integer
For i = 0 To filList.ListCount - 1
If filList.Selected(i) = True Then
Text1.Text = dirList.Path & \
& filList.List(i)
End If
Next i
End Sub
|
La procedura precedente si preoccupa di esaminare tutti gli elementi di fillist,
individuare il file selezionato e copiarlo, insieme al suo path, nel text1. Il numero di
elementi della lista di file è dato da filList.ListCount, mentre la riga
selezionata è individuata attraverso la Selected. Notate che la numerazione delle
righe inizia da zero.
Filtriamo i file
Supponiamo di voler selezionare solo un certo tipo di file (creare un filtro sul FileListBox).
Per fare questo dobbiamo modificare limpostazione di default della proprietà Pattern,
di filList, impostandola sul tipo di file da selezionare. Questo deve essere previsto
nella Load così come mostrato:
Private Sub Form_Load()
filList.Pattern = *.Doc
Text1.Text = .Doc
in Text1 è mostrato il
tipo di file selezionabile
End Sub
|
In altre parole si imposta che si vogliono selezionare solo file con estensione Doc.
Possiamo ulteriormente forzare la scelta inserendo le seguenti righe di codice, nella Change
del Text1 (impostato in precedenza su .doc)
Private Sub text1_Change()
If Right(Text1.Text, 4) = .doc
Or Right(Text1.Text, 4)
= .dot Then
prevedere solo caratteri
maiuscoli, come? Con U
Else
MsgBox Errore: modificato
il tipo di file
Unload Me
Exit Sub
End If
End Sub
|
A questo punto possiamo prevedere il codice per restituire ad unaltra form il nome
del file selezionato, quindi inseriamo il seguente codice nei bottini OK ed Annulla.
Private Sub Ok_Click()
Form1.Text3 = Text1
Unload Me
End Sub
Private Sub Annulla_Click()
Unload Me
End Sub
|
Nella Ok_Click abbiamo previsto che il nome del file è restituito al Text3 della
form1.
|
|