Scrivere dati nel Registro di Sistema (Regedit) e recuperarli quando servono.  - pagina vista: volte

Seconda parte

Requisiti: buona conoscenza procedure VBA - Conoscenza accesso e struttura del Registro di Sistema (Registro di configurazione).

Al lettore consiglio di leggere la prima parte contenente suggerimenti e spiegazioni sulle Istruzioni e Funzioni utilizzate e che utilizzeremo anche qui.

A completamento delle funzioni viste nella Prima parte, inizio questa seconda parte parlando della Funzione GetAllSettings che restituisce un elenco di impostazioni di chiave e dei rispettivi valori (creati in origine con SaveSetting) da una voce del Registro di configurazione di Windows.

La sintassi è semplice e richiede due argomenti obbligatori: appname e section (gia spiegati nella prima parte), quindi :

  • GetAllSettings(appname, section)

GetAllSettings restituisce un valore Variant costituito da una matrice bidimensionale di stringhe contenenti tutte le impostazioni di chiave della sezione specificata e i valori corrispondenti. Se appname o section non esistono, la funzione GetAllSettings restituisce un valore Variant non inizializzato.

Abbiamo visto che la registrazione di dati tramite l'istruzione SaveSetting genera un doppio elenco di valori: le "chiavi" nella colonna a sinistra e i "settaggi" nella colonna di destra: la funzione GetAllSettings restituisce in un colpo solo entrambi gli elenchi, e li restituisce in forma di una matrice a due dimensioni: tanti "indici di riga" (della matrice) quante sono le righe memorizzare nella sezione specificata del Registro, ogni riga contenente le due colonne di dati memorizzati e cioè la colonna (0) di matrice contenente le "chiavi" e la colonna (1) contenente i "settaggi".

Per reperire i dati quindi scorreremo i limiti di matrice (dall'inferiore al superiore) usando un contatore che per ogni riga in matrice ci restituisca i dati della colonna 0 e  della colonna 1 di quella riga scorsa; cosa ne facciamo? in questo esempio semplifichiamo restituendo i dati in una tabella posta sul Foglio1, a partire dalla riga 1 dove scriveremo le intestazioni di riga; vediamo la routine impostata sui dati salvati nel Registro, dalla ListBox Multipla, ultimo esempio dell'articolo precedente:

a sinistra la situazione nel Registro con i valori in precedenza salvati, schematizzati su come li reperisce la matrice generata tramite la funzione GetAllSetting.

A destra ciò che otterremo (è un esempio che ognuno potrà modificare e destinare dove più gli piace) in restituzione dalla matrice, scritti su foglio.

e queste le istruzioni:

  • Sub RiceviMultisetting()
    Dim R                                              
    'variabile Variant per il contatore del ciclo For..Next
    Dim DalRegistro As Variant          
      'Variabile Variant per archiviare la matrice bidimensionale restituita da GetAllSettings.

    'sotto: usiamo lo stesso appname e la stessa section già usati per il salvataggio nella sub SalvaMultiLista() come argomenti della funzione GetAllSettings
    DalRegistro = GetAllSettings("Prova LBoxMulti", "Lista") 
     'la variabile DalRegistro è ora il vettore della nostra matrice, e per scorrere la matrice, 'useremo un ciclo For... Next usando il contatore di ciclo R
    For R = LBound(DalRegistro, 1) To UBound(DalRegistro, 1)

    Sheets(1).Cells(1, 1) = "Chiavi"    
    'scriviamo quindi nella cella A1 del Foglio1 la parola "Chiavi" come intestazione di colonna
    Sheets(1).Cells(1, 2) = "Settaggio"   
    'e nella cella B1 la parola "Settaggio"
    Sheets(1).Cells(R + 2, 1) = DalRegistro(R, 0)  
     'scriviamo quindi a partire dalla cella R, (che a inizio ciclo è uguale a zero) aggiungendo 2 (non esiste la riga 'zero su un foglio e usiamo la cella riga 1 per le intestazioni di colonna, quindi R + 2) e scriviamo il contenuto della matrice corrispondente alla riga R, colonna 0
    Sheets(1).Cells(R + 2, 2) = DalRegistro(R, 1) 
    'lo stesso faremo con la cella R+2 della colonna 2 del foglio, scrivendo il contenuto della matrice 'corrispondente alla riga R, colonna 1
    Next

    End Sub

Nella routine non ho impostato il controllo degli errori, comunque necessario, ma provvederà il lettore se userà le istruzioni di esempio.

 

Ultimo esempio.

In questo esempio ci occuperemo del salvataggio e successivo recupero di dati e/o valori contenuti in Oggetti ActiveX (Controlli ActiveX) posti su userform, e più precisamente di alcune TextBox, di alcune OptionButton e di alcune CheckBox.

Anche in questo caso l'esercizio è un esercizio didattico che deve servire solo ad illustrare il meccanismo necessario all'identificazione dei "Controlli" (che formeranno le "Key" nell'apposita sezione del registro, con i relativi contenuti (per le TextBox) e i valori (Value, per le OptionButton e le CheckBox)  che formeranno i "Setting").

Il lettore adatterà gli esempi alle proprie esigenze ed ai "Controlli" che impiegherà sulle proprie UserForm.

Allorchè posizioniamo dei "Controlli ActiveX" in una UserForm, automaticamente ad ogni "Controllo" inserito viene assegnato un indice identificativo, il TabIndex, che inizia dall'indice 0 e si incrementa di 1 per ogni "Controllo" inserito facente parte della stessa "Classe" di controlli; Il TabIndex è una "proprietà" che ogni "Controllo ActiveX" possiede ed è univoco all'interno della stessa "Classe".

Un altro aiuto nell'identificazione di un "Controllo" ci viene fornito dal Nome stesso del controllo: se ad esempio vogliamo identificare il TextBox1 che avrà come TabIndex il valore 0 in quanto il primo tra le TextBox, potremmo istruire l'istruzione

  • se le prime 7 lettere da sinistra del nome di un "Controllo", sono uguali a "TextBox", allora la mia variabile sarà uguale al TabIndex del "Controllo" + il suffisso "TxT"

Lo stesso faremo legando nome-controllo e suo Tabindex per i vari controlli che avremo inserito, "leggendoli" con un ciclo che "scorra" tutti i controlli, e lo stesso schema di istruzioni lo potremo usare sia per le istruzioni di salvataggio sia per il recupero dei dati salvati.

Possiamo usare due eventi della UserForm, l'evento Activate per lanciare il richiamo dei dati e l'evento Terminate per salvare i dati; useremo due macro il cui nome inseriremo negli eventi; useremo la variabile Ctrl come variabile in comune alle due macro poste nel modulo della stessa userform, e la posizioniamo quindi nella sezione "Generale - Dichiarazioni", così:

  •  Dim Ctrl As Control

prima delle macro, vediamo l'immagine di una possibile UserForm (sotto) con i dati da memorizzare nelle tre textbox e le scelte delle optionbutton,  delle checkbox, e della voce che avremo selezionato in una ListBox collegata ad una Label il cui valore di Caption sarà salvato, e a destra  ciò che alla chiusura registreremo nel Registro: ho usato come nome di programma (appname) "I Miei Dati", e come sezione (section) il nome "Form2"

 

Le istruzioni.

bene, vediamo le istruzioni che non sono difficili da capire; ho separato le due azioni (salvataggio e recupero) in due routine che poi faremo richiamare negli eventi della Userform; in entrambe le macro ho inserito due semplici controlli per avvisare se mancano registrazioni precedenti, e se non si è scritto almeno cognome e nome nel salvataggio; la prima istruzione è quella per il salvataggio dei dati che vediamo nell'esempio dell'immagine sopra a sinistra, e l'effetto nel Registro è visibile nell'immagine sopra, a sinistra:

  • Sub Salva()

    If TextBox1 = "" Or TextBox2 = "" Then  
    'controlliamo che si siano scritti dati nelle due textbox, altrimenti avvisiamo ed usciamo dalla Sub
    MsgBox "MANCANO DATI - IMPOSSIBILE SALVARE"
    Exit Sub
    End If
    'sotto: la variabile "Ctrl" l'abbiamo già dichiarata nella sezione " Generale - Dichiarazioni" ed iniziamo un ciclo che scorre tutti i ("Ctrl") Controlli presenti nella 'UserForm
    For Each Ctrl In Me.Controls

    'quindi per ogni "Controllo" letto, si verifica se il suo nome corrisponde al testo tra doppi apici: nel caso si verifichi l'associazione, sfruttiamo l'istruzione SaveSetting 'facendo salvare nel Registro l'appname, la section, il valore di TabIndex del "Controllo" stesso, concatenato al suffisso specificato, ed infine il "setting" 'rappresentato dall testo contenuto nelle textbox o il valore rappresentato (Vero/Falso) per i "Controlli" tipo OptionButton e/o CheckBox.

    If Left(Ctrl.Name, 7) = "TextBox" Then SaveSetting "I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "Txt", Ctrl.Text
    If Left(Ctrl.Name, 12) = "OptionButton" Then SaveSetting "I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "OpB", Ctrl.Value
    If Left(Ctrl.Name, 8) = "CheckBox" Then SaveSetting "I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "CkB", Ctrl.Value

    Next
    SaveSetting "I MieiDati", "Form2", CStr(Label4.TabIndex) & "Lbl", Label4.Caption
    'quindi salviamo anche il TabIndex della Label4 col suffisso "Lbl" e 'come setting il testo utilizzato come Caption della Label4 (ottenuto dall'evento Listbox1_Click)
    End Sub

 

  • Sub Carica()
    'anche per ricaricare i dati eseguiamo un ciclo che scorrerà tutti i "Controlli" presenti nella UserForm -
    For Each Ctrl In Me.Controls
    'e anche qui eseguiamo un raffronto con il nome del "Controllo" letto: se esiste corrispondenza usiamo la funzione GetSetting per leggere nel registro i dati che 'corrisponderanno allo stesso TabIndex concatenato al suffisso, e ne leggiamo il dato di "setting"
    If Left(Ctrl.Name, 7) = "TextBox" Then Ctrl.Text = GetSetting("I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "Txt", Ctrl.Text)
    If Left(Ctrl.Name, 12) = "OptionButton" Then Ctrl.Value = CBool(GetSetting("I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "OpB", Ctrl.Value))
    If Left(Ctrl.Name, 8) = "CheckBox" Then Ctrl.Value = CBool(GetSetting("I MieiDati", "Form2", CStr(Ctrl.TabIndex) & "CkB", Ctrl.Value))
    Next
    Sotto: terminato il ciclo reperiamo ed assegniamo alla Caption della Label4 il valore di setting reperito tramite GetSetting. L'istruzione è esterna al ciclo in quanto 'trattasi di istruzione specifica per un "Controllo" ben identificato.
    Label4.Caption = GetSetting("I MieiDati", "Form2", CStr(Label4.TabIndex) & "Lbl", Default)
    'sotto: poichè NON si verificherebbe errore nel caso di mancanza dei dati richiesti da GetSetting per effetto dell'istruzione condizionale impiegata, (sono tutti 'valori testuali o boleani) inseriamo un semplice controllo sulla TextBox1: se rimarrà vuota, avvisiamo con il messaggio. -
    If Me.TextBox1 = "" Then
    MsgBox "NON ESISTONO DATI SALVATI - RIEMPIRE I CAMPI E CHIUDERE LA FINESTRA"
    End If
    End Su
    b

Queste due macro le richiameremo nei due eventi sotto esemplificati: con L'Activate provvediamo pure a caricare la ListBox1 con i dati che formeranno il "Tipo di Domicilio"

  • Private Sub UserForm_Activate()
    Carica  
     'chiamiamo la Sub Carica()
    'sotto: con AddItem inseriamo elementi nella ListBox1
    ListBox1.AddItem "Appartamento"
    ListBox1.AddItem "Capannone"
    ListBox1.AddItem "Casa indipendente"
    ListBox1.AddItem "Castello"
    ListBox1.AddItem "Villetta"
    ListBox1.AddItem "Non specificato"
    End Sub

e

  • Private Sub UserForm_Terminate()
    Salva
    End Sub

e infine l'istruzione per trasferire l'elemento che sarà selezionato nella ListBox, nella e come Caption della Label4:

  • Private Sub ListBox1_Click()
    Label4.Caption = ListBox1.Text
    End Sub

Ovviamente potremo usare anche l'istruzione DeleteSetting per cancellare dal Registro le chiavi desiderate.

 

Conclusioni.

Ognuno potrà sfruttare questi suggerimenti per migliorare i propri lavori, e potrà sfruttare i concetti di identificazione proposti, per tutte le Classi di "Controlli ActiveX" che impiegherà, ma ricordo di fare attenzione: conviene non scherzare col Registro di Configurazione.

 

 


buon lavoro a tutti.

prelevato sul sito www.ennius.altervista.org