Casino online











Mercato forex






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:
Private Sub cmdCiao_Click(ByVal sender As Object, ByVal e As EventArgs) _ 
    Handles cmdCiao.Click

End Sub 
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à:


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:
Private Sub cmdCiao_Click(ByVal sender As Object, ByVal e As EventArgs) _ 
    Handles cmdCiao.Click

End Sub 
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.
È 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:
Private Sub cmdClicked_Click(ByVal sender As Object, ByVal e As EventArgs) _ 
    Handles Button1.Click, Button2.Click, Button3.Click

End Sub 
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:
If sender Is Button1 Then
    '...
ElseIf sender Is Button2 Then
    '...
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:
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 
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.


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 Form1
    Private Sub cmdButton_Click(ByVal sender As Object, _ 
        ByVal e As 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 NewButton As New Button
        Dim Rnd As New Random

        With 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_Click
        End With
    End Sub
End Class 




 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.