VB
Il Registry ed il File System

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 d’informazione custodita nel registro. Vediamo dove è custodito l’elenco 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 un’altra 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 dell’articolo).

Tab1.jpeg (47153 byte) 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 dell’albero 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 dell’applicazione è App.Title (l’oggetto App lo abbiamo introdotto nei precedenti articoli) mentre il nome del nodo creato è “Esempio”. Dopo l’esecuzione 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 l’estremo 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 quest’ultima 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 l’impostazione 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 un’altra 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.