Guida al Visual Basic .NET
Capitolo 54° - I Controlli
La base delle applicazioni Windows Form
Se gli eventi sono il principale meccanismo con cui scrivere un'applicazione visuale, i controlli sono i principali oggetti da usare.
Formalmente, un controllo non è altro che una classe derivata da System.Windows.Forms.Control. In pratica, esso rappresenta un qualsiasi
componente dell'interfaccia grafica di un programma: pulsanti, menù, caselle di testo, liste varie, e anche le finestre, sono tutti
controlli. Per questa ragione, se volete creare una GUI (Graphical User Interface) per il vostro applicativo, dovrete necessariamente
conoscere quali controlli le librerie standard vi mettono a disposizione (e questo avviene in tutti i linguaggi che supportino librerie
visuali). Conoscere un controllo significa principalmente sapere quali proprietà, metodi ed eventi esso possiede e come usarli.
Una volta aperto il progetto Windows Form, troverete che l'IDE ha creato per noi la prima Form, ossia la prima finestra dell'applicazione.
Essa sarà la prima ad essere aperta quando il programma verrà fatto correre e, per i prossimi capitoli, sarà anche
l'unica che useremo. L'esecuzione termina automaticamente quando tale finestra viene chiusa. Come avrete visto, inoltre, tra le meravigliose
funzionalità del nostro ambiente di sviluppo c'è anche un'area grafica - detta Designer - che ci permette di vedere un'anteprima
della Form e di modificarla o aggiungerci nuovi elementi. Per modificare l'aspetto o il comportamento della Form, è sufficiente
modificare le relative proprietà nella finestra delle proprietà
Mentre per aggiungere elementi alla superficie libera della finestra, è sufficiente trascinare i controlli desiderati dalla toolbox
nel designer. La toolbox è di solito nascosta e la si può mostrare soffermandosi un secondo sulla linguetta "Toolbox" che
spunta fuori dal lato sinistro della schermata dell'IDE:
La classe Control
La classe Control è la classe base di tutti i controlli (ma non è astratta). Essa espone un buon numero di metodi e proprietà
che vengono ereditati da tutti i suoi derivati. Tra questi membri di default, sono da ricordare:
- AllowDrop : specifica se il controllo supporta il Drag and Drop (per ulteriori informazioni su questa tecnica, vedere capitolo relativo);
- Anchor : proprietà enumerata codificata a bit (vedi capitolo sugli enumeratori) che permette di impostare a quali lati del form i corrispondenti lati
del controllo restano "ancorati" durante il processo di ridimensionamento. Dire che un un controllo è ancorato a destra, per esempio,
significa che il suo lato destro manterrà sempre la stessa distanza dal lato destro del suo contenitore (il contenitore per eccellenza
è la Form stessa). Seguendo questa logica, ancorando un controllo a tutti i lati, si otterrà come risultato che quel
controllo si ingrandirà quanto il suo contenitore;
- BackColor : colore di sfondo;
- BackgroundImage : immagine di sfondo;
- ContextMenuStrip : il menù contestuale associato al controllo;
- Controls : l'elenco dei controlli contenuti all'interno del controllo corrente. Un controllo può, infatti, fare da "contenitore"
per altri controlli. La finestra, la Form, è un classico esempio di contenitore, ma nel corso delle lezioni vedremo altri
controlli specializzati e molto versatili pensati apposta per questo compito;
- DoDragDrop() : inizia un'operazione di Drag and Drop da questo controllo;
- Enabled : determina se il controllo è abilitato. Quando disabilitato, esso è di colore grigio scuro e non è possibile alcuna interazone
tra l'utente e il controllo stesso;
- Focus() : attiva il controllo;
- Focused : determina se il controllo è attivo;
- Font : carattere con cui il testo viene scritto sul controllo (se è presente del testo);
- ForeColor : colore del testo;
- Height : altezza, in pixel, del controllo;
- Location : posizione del controllo rispetto al suo contenitore (restituisce un valore di tipo Point);
- MousePosition : posizione del mouse rispetto al controllo (anche questa restituisce un Point);
- Name : il nome del controllo (molto spesso coincide col nome della variabile che rappresenta quel controllo nel form);
- Size : dimensione del controllo (restituisce un valore di tipo Size);
- TabIndex : forse non tutti sanno che con il pulsante Tab (tabulazione) è possibile scorrere
ordinatamente i controlli. Ad esempio, in una finestra con due caselle di testo, è possibile spostarsi dalla prima alla seconda premendo
Tab. Questo accade anche nei moduli Web. La proprietà TabIndex determina l'indice associato al controllo in questo meccanismo. Così, se
una casella di testo ha TabIndex = 0 e un menù a discesa TabIndex = 1, una volta selezionata la casella di testo sarà possibile spostarsi
sul menù a discesa premendo Tab. L'iterazione può continuare indefinitamente per un qualsiasi numero di controlli e, una volta raggiunta la
fine, reinizia daccapo;
- Tag : qualsiasi oggetto associato al controllo. Tag è di tipo Object ed è molto utile per immagazzinare informazioni
di vario genere che non è possibile porre in nessun'altra proprietà;
- Text : testo visualizzato sul controllo (se il controllo prevede del testo);
- Visible : determina se il controllo è visibile;
- Width : larghezza, in pixel, del controllo.
La classe Form
Form è la classe che rappresenta una finestra. Ogni finestra che noi usiamo nelle applicazioni è rappresentata da una classe
derivata da Form. Oltre ai membri di Control, essa ne espone molti altri. Ecco una lista molto sintetica di alcuni membri che potrebbero
interessarvi ad ora:
- AllowTransparency : determina se il form può essere reso trasparente (vedi proprietà Opacity);
- AutoScroll : determina se sulla finestra venga automaticamente mostrata una barra di scorrimento quando i controlli che essa contiene
sporgono oltre il suo bordo visibile;
- Close() : chiude la form. Se si tratta della prima form, l'applicazione termina (è possibile modificare questo comportamento,
come vedremo in seguito);
- FormBorderStyle : imposta il tipo di bordo della finestra (nessuno, singolo, doppio: singolo equivale a non poter ridimensionare
la finestra);
- HelpButton : determina se il pulsante help (?) è visualizzato nella barra del titolo, accanto agli altri;
- Hide() : nasconde la form, ossia la rende invisibile, ma non la chiude;
- Icon : indica l'icona mostrata nell'angolo superiore sinistro della finestra, vicino al titolo. Questà proprietà è
di tipo System.Drawing.Icon;
- MaximizeBox : determina se l'icona che permette di ingrandire la finestra a schermo intero è visualizzata;
- MaximumSize : massima dimensione consentita;
- MinimizeBox : determina se il pulsante che permette di ridurre la finestra a icona è visualizzato;
- MinimumSize : minima dimensione consentita;
- Opacity : imposta l'opacità della finestra: 0 per renderla invisibile, 1 per renderla totalmente opaca (normale);
- Show() : visualizza la form nel caso sia nascosta o comunque non attualmente visibile sullo schermo;
- ShowDialog() : come Show(), ma la finestra viene mostrata in modalità Dialog. In questo modo, l'utente può interagire
solo con essa e con nessun'altra form del programma fino a che questa non sia stata chiusa, confermando una scelta o annullando
l'operazione. Restituisce come risultato un valore enumerato che indica che azione l'utente abbia compiuto;
- ShowIcon : determina se visualizzare l'icona nella barra del titolo;
- ShowInTaskBar : determina se visualizzare la finestra nella barra delle applicazioni;
- TopMost : determina se la finestra è sempre in primo piano;
- WindowState : indica lo stato della finestra (normale, massimizzata, ridotta a icona).
Questi sono solo alcuni dei molteplici membri che la classe espone. Ho elencato soprattutto quelli che vi permetteranno di modificare l'aspetto
ed il comportamento della form, in quanto, allo stato attuale delle cose, non siete in grado di gestire e comprendere il resto delle
funzionalità. Nel corso di questa sezione, comunque, introdurrò via via nuovi dettagli riguardo questa classe e spiegherò
come usarli. Ma ora passiamo alla scrittura del primo programma...
Il controllo Button
Per il prossimo esempio, dovremo usare un nuovo controllo, che possiamo indicare senza remore come il principale e più usato
meccanismo di interazione: il pulsante. Esso viene rappresentato dal controllo Button. Dopo aver aperto un nuovo progetto Windows Form
vuoto, trascinate un nuovo pulsante dalla toolbox sulla superficie della finestra e posizionatelo dove più vi aggrada. Il nome di
questo controllo sarà btnHello, ad esempio.
Ora che abbiamo disposto l'unico elemento della GUI, bisogna creare un gestore d'evento che si occupi di eseguire del codice quando l'utente
clicca sul pulsante. Per fare ciò, possiamo scrivere il codice a mano o semplicemente fare doppio click sul pulsante nel Designer
e l'IDE scriverà automaticamente il codice associato. Questo succede perchè ogni controllo ha un "evento di default", ossia
quell'evento che viene usato più spesso: il doppio click su un elemento dell'interfaccia grafica ci permette di delegare all'ambiente
di sviluppo la stesura del prototipo per la Sub che dovremo creare per tale evento. Nel caso di Button, l'evento più usato è Click.
Il codice automaticamente generato sarà:
Private Sub btnHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHello.Click
End Sub
Ora, all'interno del corpo della procedura possiamo porre ciò che vogliamo. In questo esempio, visualizzeremo a schermo il messaggio
"Hello, World!", ma in modo diverso dalle applicazioni console. In questo ambiente, si è soliti usare una particolare classe
che serve per visualizzare finestre di avvertimento. Tale classe è MessageBox e ha un solo metodo statico, Show:
Public Class Form1
Private Sub btnHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHello.Click
MessageBox.Show("Hello, World!", "Esempio", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Show accetta come minimo un parametro, ossia il messaggio da visualizzare. Tutti gli altri parametri sono "opzionali" (non nel vero senso
del termine, ma esisteono 18 versioni diverse dello stesso metodo Show modificate tramite overloading). In questo caso, il secondo indica
il titolo della finestra di avviso, il terzo i pulsanti visualizzati (un solo pulsante "OK") ed il quarto l'icona mostrata in fianco al
messaggio (una "I" bianca su sfondo blu, che significa "Informazione").
A proposito dell'autore
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|