ComboBox, ListBox, Label e Image :          (22/03/03)

Ovvero: come utilizzare una ComboBox o una ListBox per visualizzare delle immagini (foto) in un controllo "Image" o in una Label (etichetta).

Abbiamo visto nel paragrafo precedente, come "caricare" con dati una ComboBox o una ListBox: sfruttando la proprietà "RowSource", alla quale va associato il riferimento alle celle che contengono i dati da visualizzare.

In questo esercizio ci occupiamo di come associare la selezione di un dato presente nel "menu" dei due controlli, con la comparsa di un immagine associata al dato stesso. Per poter visualizzare delle immagini è necessario di disporre di due "controlli" (o "oggetti") presenti nella "casella degli strumenti" tipica di una UserForm: il controllo "Image", che grazie alle sue "proprietà" consente una migliore gestione di come visualizzare una determinata foto o immagine, oppure di una normale "Label" che offre decisamente poche possibilità. Vediamo le caratteristiche di questi due controlli:

  • Controllo Image - proprietà:

A destra, la finestra delle proprietà di un controllo Image: tre sono le proprietà più importanti:
  • Picture: a lato andrebbe scritto il percorso completo che porta all'immagine da visualizzare, ma che invece gestiremo via codice.
  • PictureAlignment: di default impostato su 2, cioè con l'immagine piazzata nel centro del controllo.
  • PictureSizeMode: cioè il modo con cui la foto verrà visualizzata, e quindi:
  • fmPictureSizeModeClip indica che si desidera visualizzare l'immagine con le dimensioni e l'ingrandimento originali. Se il controllo Image ha dimensioni inferiori rispetto all'immagine, verrà visualizzata soltanto la parte dell'immagine che rientra nel controllo.
  • L'impostazione fmPictureSizeModeStretch ingrandisce l'immagine verticalmente e orizzontalmente, fino a farle raggiungere i margini del contenitore o del controllo.
  • fmPictureSizeModeZoom ingrandisce l'immagine fino a quando questa non raggiunge i margini orizzontali oppure i margini verticali del del controllo. Se l'immagine raggiunge prima i margini orizzontali, lo spazio rimanente tra l'immagine e i margini verticali resterà vuoto. Se l'immagine raggiunge prima i margini verticali, lo spazio rimanente tra l'immagine e i margini orizzontali resterà vuoto.
  • PictureTiling: di default impostata a False. Se le dimensioni di un'immagine sono inferiori a quelle del controllo che la contengono, è possibile affiancare più copie dell'immagine nel controllo.
    La modalità di affiancamento dipende dall'impostazione corrente delle proprietà PictureAlignment e PictureSizeMode. Se ad esempio PictureAlignment è impostata su fmPictureAlignmentTopLeft, la disposizione inizia nell'angolo superiore sinistro e l'immagine viene ripetuta verso destra e verso il basso nel form o nella pagina. Se PictureSizeMode è impostata su fmPictureSizeModeClip, quando l'ultima immagine affiancata non rientra completamente nei margini del controllo, tale immagine verrà ritagliata
  • Controllo Label. Le proprietà di una Label interessate a ricevere un immagine sono in pratica due:

  • La proprietà Picture (già vista sopra)

  • La proprietà PicturePosition, che di default è impostata a : fmPicturePositionAboveCenter e che centra l'immagine all'interno della Label. 12 sono le impostazioni settabili, e invito i pellegrini a scoprirle da soli.

Ma veniamo all'esempio di questo esercizio. In una zona del foglio di lavoro, creeremo un elenco che formerà il RowSource della ComboBox o della ListBox. Le ho usate tutte e due solo per mostrare le istruzioni usate che comunque differiscono di poco, e perchè la destinazione delle immagini collegate all'elenco richiamato dalla ListBox sarà la Label1. Il controllo Image supporta i seguenti formati di file:
*.bmp - *.cur - *.gif - *.ico - *.jpg - *.wmf
 

Condizione necessaria sarà comunque di definire una cartella che conterrà le immagini, e sarà opportuno chiamare le immagini con un nome che sarà lo stesso che scriveremo nel nostro elenco sul foglio di lavoro. Io ho chiamato le immagini : foto1.ipg, foto2.jpg, ecc.ecc. mentre nell'elenco ho usato solo il nome: foto1, foto2, ecc. senza estensione: in questo modo nelle istruzioni imposto una sola volta il formato dell'estensione: .jpg. Vediamo le istruzioni:

Nell'UserForm_Activate faccio caricare le liste dei controllo ComboBox e ListBox :

Private Sub UserForm_Activate()
ComboBox1.RowSource = "A1:A10"
ListBox1.RowSource = "A1:A10"
End Sub

Il comando per il caricamento dell'immagine nel controllo Image, si avvale della funzione LoadPicture seguita dall'indicazione del percorso dove risiede l'immagine. Poichè dovremo poter caricare più immagini a scelta, uso una variabile ( X ) per definire di volta in volta il nome che verrà selezionato nella ComboBox, sfruttando quindi l'evento ComboBox_Click per inserire le istruzioni, queste:

Private Sub ComboBox1_Click()
Dim X
X = ComboBox1.Text
Image1.Picture = LoadPicture("C:\Temp\" & X & ".jpg")
End Sub

Per la ListBox stesso discorso, con poche varianti, in particolare la destinazione che è una Label:

Private Sub ListBox1_Click()
Dim X
X = ListBox1.Text
Label1.Picture = LoadPicture("C:\Temp\" & X & ".jpg")
End Sub

E questa un immagine dei risultati: frecce verdi per ListBox1 e Label1, frecce rosse per ComboBox1 e Image1. Nella colonna A vediamo l'elenco che forma il RowSource:

 


Buon Lavoro.


prelevato sul sito http://ennius.interfree.it