Menù personalizzabili su USERFORM. - pagina vista: volte

Difficoltà : Media

Un altro modo di creare Menù personalizzati (in alternativa a quanto spiegato nell'articolo "Menù personalizzati" in questa stessa sezione), lo possiamo ottenere seguendo una procedura abituale per il VB6 (molto meno per il VBA), che è quella di inserire su una UserForm due appositi "oggetti ActiveX", prendendoli dalla "Casella degli strumenti" dall'editor di visual basic in Excel.

Questi due "oggetti" non sono di default disponibili in detta Casella, ma cliccandoci sopra di destro (sulla Casella), dal menù che appare, scegliere "Controlli Aggiuntivi" facendo apparire l'apposita finestra dove si potranno leggere i controlli ActiveX disponibili sul proprio computer, e scegliere questi due, mettendo un segno di spunta nell'apposita casella a lato del nome del controllo:

  • Microsoft ImageList Control 6.0  - corrispondente alla libreria mscomctl.ocx che si trova nella cartella System32 di Windows

  • Microsoft ToolBar Control 6.0  - contenuto nella stessa libreria ocx.

Una volta premuto OK in quella finestra, troveremo i controlli appena aggiunti nella Casella degli Strumenti, dalla quale li potremo selezionare e inserire sulla UserForm.

Premetto che se non avrete disponibili queste versioni degli oggetti, le procedure che useremo più avanti non sortiranno nessun effetto, anzi creeranno errori di debug.

A cosa servono questi due nuovi oggetti aggiunti?

Il controllo ToolBar serve a creare una barra menù, dove sarà possibile inserire dei pulsanti (buttons) cliccabili, sui quali è possibile inserire delle immagini (gif, bmp, ico), e che verranno usati né più né meno come le tradizionali barre dei menù a icone che vediamo in tanti programmi. A questi pulsanti ovviamente si possono associare istruzioni.

Il controllo ImageList invece serve a caricare e memorizzare le immagini che vedremo sui pulsanti. Vediamo intanto una immagine dei due controlli, sulla Casella degli strumenti, e posizionati sulla userform:

Il controllo ImageList non è visibile in esecuzione, quindi non imposta né dove la posizioniamo, né modificarne la dimensione, mentre la ToolBar andrà poi spostata al limite superiore della userform (o all'estrema sinistra) e dimensionata in larghezza. Per quanto riguarda l'altezza della ToolBar, non sarà possibile sottodimensionarla a 19,5 punti (di default) mentre in altezza risentirà della dimensione delle immagini che verranno poste nei pulsanti; attenzione quindi a non usare dei "lenzuoli" come immagini; suggerisco di cercarsi delle icone anche sul web, oppure scaricare questa cartella : Icons.zip, 209 Kb, che contiene parecchie icone, divise per argomenti.

Il risultato che otterremo sarà simile a questo (ho esemplificato con solo tre pulsanti):

Ma passiamo alle procedure. Intanto non possiamo per questi due controlli, intervenire su settaggi a livello di progettazione, come invece è possibile fare in VB6, ma possiamo agire solo in fase di esecuzione, e non saranno disponibili in VBA alcune proprietà e metodi come in VB6.

Sceglieremo quindi un "evento" che permetta di lanciare le procedure per le varie impostazioni, e scegliamo di usare l'"Activate" della UserForm.

Per prima cosa dovremo istruire una procedura che assegni alla proprietà ListImages dell'ImageList1 i percorsi che mirano ai file immagine (ico, gif, o bmp che siano); dovremo caricare tante immagini quanti saranno i pulsanti che inseriremo, e per caricare le immagini useremo la funzione Add  della Classe ImageList, funzione che richiede alcuni parametri, tra i necessari il "nome" che identificherà l'immagine e l'istruzione LoadPicture seguita dal percorso che mira all'immagine; ogni immagine andrà caricata in memoria e per questo useremo l'istruzione Set. Vediamo un esempio di questo passaggio che comunque modificheremo:

  • 'Carica immagini nel controllo ImageList.
    Set mia = ImageList1.ListImages.Add(, "apri", LoadPicture("C:\Icone\apri.ico"))
    Set mia = ImageList1.ListImages.Add(, "salva", LoadPicture("C:\Icone\salva.ico"))

    ecc. ecc. per tante immagini quanti saranno i pulsanti (la variabile "mia" resta la stessa per tutte le immagini)

confermo che i nomi "apri" e "salva" servono per identificare le immagini, indipendentemente dal nome dell'immagine.

Suggerisco di usare due Array, per poi assegnare "nome" e "percorso file" ad un indice, e poi caricare la ImageList1 con un ciclo For Next che scorrerà gli indici, così:

  • A = Array("C:\Icone\apri.ico", "C:\Icone\salva.ico", "C:\Icone\esci.ico") 'con A memorizziamo i percorsi
    B = Array("apri", "salva", "esci")  
    'con B memoriziamo i nomi
    For N = LBound(A) To UBound(A)
     'poi si scorre la matrice
    Set mia = ImageList1.ListImages.Add(, B(N), LoadPicture(A(N)))
    ' e si carica la ImageList1
    Next

Suggerisco di inizializzare le matrici con indice a 1, inserendo nella sezione Generale - Dichiarazioni della UserForm, questa istruzione: Option Base 1

Una volta effettuato questo passaggio, nello stesso evento dovremo "dire" alla ToolBar dove prendere le immagini per i pulsanti che creeremo: sfruttiamo la proprietà ImageList della ToolBar alla quale assegniamo il nome del controllo ImageList1, e questa è l'istruzione:

  • Toolbar1.ImageList = ImageList1

Ora dobbiamo creare i pulsanti (buttons) usando ancora una variabile per assegnare un riferimento (Set) e sfruttare Add (aggiungi) . Qui useremo come parametri, dei "nomi" per identificare il pulsante, lo Style del button e infine i "nomi" precedentemente assegnati alle immagini, per identificare l'immagine da associare (inserire) ad ogni pulsante; inoltre potremo sfruttare la proprietà TooltipText per visualizzare il nome della funzione del pulsante quando ci soffermeremo col puntatore del mouse su quel pulsante. Per evitare confusioni ho usato gli stessi nomi sia per nomimare le immagini, sia per identificarle, sia per identificare i pulsanti. Queste le istruzioni:

  • 'Si crea una variabile
    Dim btnX
    ' Si aggiungono oggetti Button a un insieme Buttons utilizzando il metodo Add. Dopo aver creato ciascun pulsante, si 'imposta la proprietà ToolTipText.
    Set btnX = Toolbar1.Buttons.Add(, "apri", , tbrDefault, "apri")
    btnX.TooltipText = "Apri file"
    Set btnX = Toolbar1.Buttons.Add(, "salva", , tbrDefault, "salva")
    btnX.TooltipText = "Salva file"
    Set btnX = Toolbar1.Buttons.Add(, "esci", , tbrDefault, "esci")
    btnX.TooltipText = "Esci"

E il risultato sarà simile a questo (dipenderà dalla dimensione delle icone; queste nell'esempio sono 16x16x16):

Vediamo la routine completa:

  • Private Sub UserForm_Activate()
    A = Array("C:\Icone\apri.ico", "C:\Icone\salva.ico", "C:\Icone\esci.ico")
    B = Array("apri", "salva", "esci")

    For N = LBound(A) To UBound(A)
    Set mia = ImageList1.ListImages.Add(, B(N), LoadPicture(A(N)))
    Next

    Toolbar1.ImageList = ImageList1

    Dim btnX
    Set btnX = Toolbar1.Buttons.Add(, "apri", , tbrDefault, "apri")
    btnX.TooltipText = "Apri file"
    Set btnX = Toolbar1.Buttons.Add(, "salva", , tbrDefault, "salva")
    btnX.TooltipText = "Salva file"
    Set btnX = Toolbar1.Buttons.Add(, "esci", , tbrDefault, "esci")
    btnX.TooltipText = "esci"

    End Sub

Se poi vorremo creare un ciclo anche per aggiungere i pulsanti, basterà sostituire le istruzioni da Dim btnX in poi, con questo: (gli Array B sono già stati impostati ad inizio routine)

  • For M = LBound(B) To UBound(B)
    Set btnX = Toolbar1.Buttons.Add(, B(M), , tbrDefault, B(M))
    btnX.TooltipText = B(M)
    Next

     

Non scordiamoci Option Base 1.  Ora dobbiamo istruire la procedura perchè si possano sfruttare i click sui pulsanti; per questo useremo l'evento ButtonClick della Toolbar1, ed useremo il Select Case che, leggendo i "nomi" da noi assegnati ai pulsanti, eseguirà le istruzioni che inseriremo nel Case di pertinenza (nell'esempio faccio apparire un semplice messaggio):

  • Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    Select Case Button.Key
    Case Is = "apri"
    MsgBox "Sono il pulsante 1"    
    'qui sostituire con le istruzioni da eseguire con la pressione sul pulsante
    Case Is = "salva"
    MsgBox "Sono il pulsante 2"   
     'qui sostituire con le istruzioni da eseguire con la pressione sul pulsante
    Case Is = "esci"
    MsgBox "Sono il pulsante 3"    
     'qui sostituire con le istruzioni da eseguire con la pressione sul pulsante
    End Select
    End Sub

 

Buon lavoro

prelevato sul sito www.ennius.altervista.org