UserForm : randomizzare il colore di fondo. - pagina vista: volte

Funzione QBColor  -  che restituisce un valore Long che rappresenta il codice di colore RGB corrispondente a un numero di colore specificato.

Se ci può interessare far cambiare colore al BackColor delle nostre UserForm, ad ogni click sulle stesse, fra i vari sistemi colore, possiamo far ricorso ad una (vecchia) funzione Basic, la funzione QBColor.

Questa funzione (poi sostituita dalla più versatile funzione RGB, vedi anche l'articolo Funzione RGB x colori  ) si basa su un'istruzione che richiede, come argomento della funzione, di specificare un valore compreso tra 0 e 15, valore che specifica e restituisce i valori di rosso, verde e blu utilizzati per l'impostazione del colore appropriato nel sistema RGB.

Questo esercizio che può essere considerato poco interessante, può invece avvicinare i neofiti, a capire che in vba, è necessario abituarci a prendere in considerazione le "proprietà" che gli oggetti "Controlli ActiveX" possiedono, e che non sempre le "proprietà" simili, di oggetti "Controlli ActiveX" diversi, richiedono le medesime impostazioni, o sopportano le stesse costanti.

Infatti potremmo essere portati a ritenere che se per cambiare il colore (con cui vediamo) una UserForm, usiamo la sua proprietà BackColor,  lo stesso potremmo fare per cambiare il colore (con cui vediamo) il Font della Caption di una Label.

Ma anche la Label possiede la proprietà BackColor, che si riferisce quindi al suo colore di fondo, e che può sfruttare la funzione QBColor, ma per cambiare il colore del Font dovremo usare un'altra proprietà della Label, la proprietà ForeColor, che però non sopporta la funzione QBColor, ma qualsiasi valore intero che rappresenta un colore valido, oppure la funzione RGB.

Queste brevi note solo per puntualizzare la necessità di "informarsi" circa le "proprietà" che gli oggetti "Controlli ActiveX" possiedono, in modo da sfruttare le giuste impostazioni per ogni proprietà. La guida in linea è ben "fornita" circa questi argomenti, e per trovarli (gli argomenti) si può seguire anche questa strada:

  • dovremo trovarci nell'Editor di Visual Basic (VBE); una volta inserito un Controllo ActiveX qualsiasi (da una UserForm ad una Label, o un CommandButton, o una TextBox, ecc.), di ogni oggetto selezionato, possiamo vederne le proprietà possedute nella finestra "Proprietà", di default posta nella zona in basso a sinistra della videata quando siamo in VBE, oppure richiamabile dal menu "Visualizza/Finestra proprietà" del VBE.

  • tanto per capirci, questa:     

  • In questa finestra le "proprietà" dell'oggetto (in questa foto di una UserForm) sono elencate nella prima colonna, a sinistra, mentre nella colonna a destra sono elencate, per ogni proprietà, l'impostazione della proprietà, che in genere è modificabile.

  • ora, se noi vogliamo sapere che cosa rappresenta e come modificare (caratteristiche e modalità applicative) una determinata "proprietà", è sufficiente selezionare con un click la proprietà, e premere il tasto F1: apparirà la guida in linea che mostrerà le caratteristiche della proprietà; se selezioniamo ad esempio la proprietà ForeColor,  come in questa immagine    e premiamo il tasto F1, apparirà la guida in linea che ci mostrerà questa finestra dove potremo leggere le informazioni relative:

  • non solo, ma se in questa finestra clicchiamo su "Si applica a", otterremo un'altra finestra che mostrerà tutti gli oggetti (Controlli ActiveX) che possiedono la stessa proprietà, questa: 
    se in questa nuova finestra selezioneremo un controllo e premeremo il pulsante "Visualizza", la guida in linea si aprirà sull'oggetto (Controllo) selezionato mostrandone le caratteristiche.

  • Questo procedimento risulta veloce e ci consente di trovare tutte le informazioni che ci possono servire.

Ritornando all' esercizio, useremo la funzione QBColor  per modificare o impostare il colore di fondo di una UserForm, agendo sulla "proprietà" BackColor della Userform; ma in genere su una UserForm inseriamo altri "Controlli ActiveX", come ad esempio delle Label (etichette), oppure dei CommandButton, ed avremo necessità di poter modificare anche il colore dei caratteri delle Label (o dei CommandButton che di default è impostato a nero), in un colore di contrasto rispetto al fondo che risulterà (per effetto della randomizzazione) per lo sfondo della Userform. Se anche questo fosse nero, o comunque blu scuro, o rosso scuro, o verde scuro, il testo (Caption) delle Label (nero) sarebbe difficilmente ben leggibile.

Ora vediamo una tabellina con i 16 colori ottenibili con la funzione QBColor e relativo numero indice:

Numero Colore Numero Colore
0 Nero 8 Grigio scuro
1 Blu 9 Blu chiaro
2 Verde 10 Verde limone
3 Azzurro 11 Azzurro chiaro
4 Rosso scuro 12 Rosso chiaro
5 Fucsia 13 Fucsia chiaro
6 Verde oliva 14 Giallo chiaro
7 Grigio medio 15 Bianco brillante

La randomizzazzione agirà quindi sul numero indice per restituire il colore associato al numero indice casualizzato, e l'istruzione per ottenere questo risultato sarà questa:

  • Randomize
    Me.BackColor = QBColor(Rnd * 15)
     'generiamo un numero compreso tra zero e 15 e lo assegniamo alla proprietà BackColor della UserForm

La nostra UserForm la vedremo col colore corrispondente al numero generato dalla funzione Rnd. Questa istruzione potremo inserirla nell'evento Activate dell'UserForm (ed ad ogni avvio della stessa avremo un colore diverso), oppure sfruttare l'evento Click della UserForm, e saremo noi, cliccando in una zona libera della UserForm, ad attivare l'istruzione.

Per la questione di far cambiare in contemporanea al colore della UserForm, il colore di fondo delle Label, ed il colore dei Font delle Caption delle stesse, possiamo toglierci un dente impostando la proprietà BackStyle della Label a "trasparente", cioè a : 0 - fmBackStyleTransparent  ; in questo modo non dovremo preoccuparci del suo colore di fondo, sarà trasparente e vedremo quindi il colore sotto della UserForm.

Per impostare il colore dei Font della Caption della Label, dovremo usare la sua proprietà ForeColor, che però non sopporta la funzione QBColor,  ma solo un colore RGB (Red, Green, Blue).

Bisogna precisare che la Funzione QBColor non restituisce il suo valore indice corrispondente al colore (come nella tabellina sopra), ma il valore RGB corrispondente al colore. Poichè dovremo istruire un'istruzione condizionale che, verificando il colore di fondo della UserForm, modifichi il colore dei Font delle Label, dovremmo poter conoscere il valore di codice RGB che risulterà dalla randomizzazione generata con QBColor. Per semplificarvi e suggerirvi i codici colori RGB corrispondenti, vi riporto questa tabella con inseriti i codici colore RGB accanto al valore indice QBColor:

Numero valore RGB Colore Numero valore RGB Colore
0 0 Nero 8 8421504 Grigio scuro
1 8388608 Blu 9 16711680 Blu chiaro
2 32768 Verde 10 65280 Verde limone
3 8421376 Azzurro 11 16776960 Azzurro chiaro
4 128 Rosso scuro 12 255 Rosso chiaro
5 8388736 Fucsia 13 16711935 Fucsia chiaro
6 32896 Verde oliva 14 65535 Giallo chiaro
7 12632256 Grigio medio 15 16777215 Bianco brillante

Se vorrete conoscere i codici colori RGB corrispondenti ai valori indice della Funzione QBColor, provate questa istruzione inserita nell'evento Click di un commandbutton posto su una userform: ad ogni click vedrete il colore ed un messaggio con il codice corrispondente RGB:

  • Private Sub CommandButton1_Click()
    For n = 0 To 15   
    'scorriamo con un ciclo For Next i 16 valori indice
    x = QBColor(n) 
     'assegniamo alla variabile "x" il codice colore RGB risultante dalla funzione QBColor(n)
    Me.BackColor =  x 
     ' coloriamo il fondo con il colore
    MsgBox x 
     'avvisiamo fornendo il codice colore RGB
    Next
    End Sub

Bene, chiariti questi aspetti, vediamo la nostra routine per randomizzare il colore di fondo della UserForm, alternando il ForeColor delle Label : bianco con il fondo scuro, nero con il fondo chiaro: sfruttiamo l'evento Click della Userform

  • Private Sub UserForm_Click()
    Randomize
    x = QBColor(Rnd * 15)
     'generiamo un colore casuale tra i 16 previsti dalla funzione QBColor
    Me.BackColor = x     
     'impostiamo il colore di fondo della UserForm con il codice RGB ottenuto (la "x")
    Select Case x  
     'istruiamo un Select Case, se il Case "x" corrisponderà ad uno dei colori scuri
    Case 0, 32768, 16711680, 128, 8388608, 8388736, 16711680
    Label1.ForeColor = RGB(255, 255, 255)
     'impostiamo il ForeColor della label a bianco (funzione RGB)
    Case Else 
      'negli altri casi
    Label1.ForeColor = 0  
     'impostiamo il ForeColor a nero (valore colore RGB)
    End Select
    End Sub

Ovviamente nella stessa istruzione Case potremo modificare tutti i BackColor o i ForeColor di altri componenti ActiveX posti sulla UserForm, come i colori di fondo di commandbutton, textbox, combobox, listbox, ecc. ecc. come pure il ForeColor degli stessi oggetti.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org