B19. Eventi e Handler
Fino ad ora si è visto che è possibile scrivere il codice relativo ad un evento semplicemente facendo doppio click sul controllo
relativo e ponendo il codice dove viene posizionato automaticamente il cursore. Ad esempio, dopo aver fatto doppio click sul pulsante
cmdCiao, appariva questa dicitura:

Come si vede nel (rudimentale) schema che ho fatto, è sempre possibile cambiare la visualizzazione tra le proprietà e gli eventi. Alcuni eventi sono quasi sempre presenti per tutti i controlli con interfaccia grafica, come KeyDown, KeyUp, KeyPress, Click, DoubleClick, MouseDown, MouseUp, MouseEnter, MouseLeave, MouseHover, DragEnter, DragLeave, DragDrop e altri spesso inutili, importanti solo in rare circostante.
È anche possibile avere più eventi associati ad un unica procedura: in questo caso tutti i delegate relativi punteranno solo a quella. In tali circostante, il codice si presenta sotto questa forma:
Questo fatto è sempre stato limitante poichè si andava a prendere solo un evento per controllo. In realtà tutti gli altri eventi sono comunque accessibili e senza il bisogno di impararseli a memoria. Per visualizzare una lista completa degli eventi associati ad un controllo basta cliccare sull'icona del fulmine appena sopra la finestra delle proprietà:Private Sub cmdCiao_Click(ByVal senderAs Object ,ByVal eAs EventArgs) _Handles cmdCiao.ClickEnd Sub
Tuti gli eventi
Come si vede nel (rudimentale) schema che ho fatto, è sempre possibile cambiare la visualizzazione tra le proprietà e gli eventi. Alcuni eventi sono quasi sempre presenti per tutti i controlli con interfaccia grafica, come KeyDown, KeyUp, KeyPress, Click, DoubleClick, MouseDown, MouseUp, MouseEnter, MouseLeave, MouseHover, DragEnter, DragLeave, DragDrop e altri spesso inutili, importanti solo in rare circostante.
Handler d'evento
Un handler è un "gestore" d'evento, ossia una procedura che indica cosa fare quando si genera un evento: come è già stato ripetuto molte
volte, un evento è un delegate a cui si sottoscrivono una o più altre routine (chiamate anche, per l'appunto, sottoscrittori).
Una volta scritto il sottoscrittore, si può notare che alla fine della signature è presenta una linea particolarmente importante:
La keyword Handles specifica che la procedura appena dichiarata gestisce l'evento cmdCiao.Click. Per coloro che provengono dal Visual Basic 6 sarà interessante notare che l'unica cosa che lega una procedura a un evento è proprio questo piccolo pezzo di codice e non, come avveniva in passato, il nome della procedura. Se si scrivono sottoscrittori manualmente bisogna fare sempre attenzione al secondo parametro, e, il cui tipo può cambiare a seconda dell'evento: si ricordi anche di usare sempre e comunque i nomi "sender" ed "e" per il sottoscrittore, in quanto è una convenziona consolidata e dura a morire.Private Sub cmdCiao_Click(ByVal senderAs Object ,ByVal eAs EventArgs) _Handles cmdCiao.ClickEnd Sub
È anche possibile avere più eventi associati ad un unica procedura: in questo caso tutti i delegate relativi punteranno solo a quella. In tali circostante, il codice si presenta sotto questa forma:
Se si devono fare distinzioni sul comportamento del codice a seconda del pulsante premuto, l'unico modo è controllare l'identita' di sender con altri controlli:Private Sub cmdClicked_Click(ByVal senderAs Object ,ByVal eAs EventArgs) _Handles Button1.Click, Button2.Click, Button3.ClickEnd Sub
If senderIs Button1Then '... ElseIf senderIs Button2Then '... Else '... End If
Aggiungere e rimuovere Handler da codice
Quando un controllo viene aggiunto da codice e non in fase di progettazione, si presenta la necessità di gestire dinamicamente anche gli
eventi ad esso associati. Per fare questo, ossia per modificare sottoscrittori da codice, bisogna utilizzare le keyword AddHandler o
RemoveHandler, a seconda che si voglia aggiungere o rimuovere una routine associata all'evento. La sintassi è questa:
Per sapere i parametri dell'evento basta lasciare aperta la parentesi dopo il nome, e il compilatore provvederà a fornire, attraverso un fumetto detto DataTip, tutte le informazioni necessarie.AddHandler [Controllo].[Evento],AddressOf [Sottoscrittore]RemoveHandler [Controllo].[Evento],AddressOf [Sottoscrittore] 'Si nota bene come gli eventi e i delegate siano legati dall'uso della 'keyword AddressOf, già ampiamente discussa e analizzata
Esempio: Push It!
In questo semplice esempio, c'è un solo pulsante sulla finestra e, premendolo, se ne genera un altro in un punto casuale (ma su una
griglia). Il sorgente è altrettanto semplice, ma incisivo:
Class Form1Private Sub cmdButton_Click(ByVal senderAs Object , _ByVal eAs EventArgs)Handles cmdButton.Click 'Rimuove l'handler da sender RemoveHandler DirectCast (sender, Button).Click, _AddressOf cmdButton_Click 'Rimuove dal form il controllo che ha scatenato l'evento Me .Controls.Remove(sender) 'Ma aggiunge un nuovo pulsante Dim NewButtonAs New ButtonDim RndAs New RandomWith NewButton 'Un punto qualsiasi in una griglia di 25 quadretti 32x32 .Location =New Point(Rnd.Next(1, 5) * 32, Rnd.Next(1, 5) * 32) .Size =New Size(32, 32) 'Lo aggiunge al form Me .Controls.Add(NewButton) 'Ma aggiunge anche l'handler relativo, ossia questa procedura AddHandler .Click,AddressOf cmdButton_ClickEnd With End Sub End Class
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



