Eventi (Visual Basic)
Sebbene sia possibile visualizzare un progetto Visual Studio come una serie di procedure eseguite in una sequenza, in realtà la maggior parte dei programmi è basata su eventi, ovvero il flusso di esecuzione è determinato da occorrenze esterne chiamate eventi.
Un evento è un segnale che informa un'applicazione che si è verificato qualcosa di importante. Ad esempio, quando un utente fa clic su un controllo in un form, il form può generare un evento Click
e chiamare una routine che gestisce l'evento. Gli eventi consentono anche le comunicazioni tra attività separate. Si supponga, ad esempio, che un'applicazione esegua un'attività di ordinamento separatamente dall'applicazione principale. Se un utente annulla l'ordinamento, l'applicazione può inviare un evento di annullamento per segnalare la necessità di interrompere il processo di ordinamento.
Termini e concetti relativi agli eventi
In questa sezione vengono descritti i termini e i concetti usati con gli eventi in Visual Basic.
Dichiarazione di eventi
Gli eventi vengono dichiarati all'interno di classi, strutture, moduli e interfacce tramite la parola chiave Event
, come nell'esempio seguente:
Event AnEvent(ByVal EventNumber As Integer)
Generazione di eventi
Un evento può essere paragonato a un messaggio che annuncia che si è verificato qualcosa di importante. L'atto di trasmettere il messaggio viene definito generazione dell'evento. In Visual Basic si generano eventi con l'istruzione RaiseEvent
, come nell'esempio seguente:
RaiseEvent AnEvent(EventNumber)
Gli eventi devono essere generati nell'ambito della classe, del modulo o della struttura in cui sono dichiarati. Ad esempio, una classe derivata non può generare eventi ereditati da una classe di base.
Mittenti di eventi
Qualsiasi oggetto in grado di generare un evento è un mittente di eventi, noto anche come origine di eventi. I form, i controlli e gli oggetti definiti dall'utente sono alcuni esempi di mittenti di eventi.
Gestori di eventi
I gestori eventi sono le routine chiamate quando si verifica un evento corrispondente. È possibile usare qualsiasi subroutine valida con una firma corrispondente come gestore eventi. Non è possibile usare una funzione come gestore eventi, tuttavia, perché non può restituire un valore all'origine di eventi.
Visual Basic usa una convenzione di denominazione standard per i gestori eventi che combinano il nome del mittente dell'evento, un carattere di sottolineatura e il nome dell'evento. Ad esempio, il nome dell'evento Click
per un pulsante denominato button1
sarebbe Sub button1_Click
.
Nota
È consigliabile usare questa convenzione di denominazione durante la definizione dei gestori per gli eventi personalizzati, ma non è obbligatorio. Si può usare qualsiasi nome di subroutine valido.
Associazione di eventi a gestori eventi
Un gestore eventi diventa utilizzabile solo dopo averlo associato a un evento mediante l'istruzione Handles
o AddHandler
.
WithEvents e clausola Handles
L'istruzione WithEvents
e la clausola Handles
offrono una modalità dichiarativa per specificare i gestori eventi. Un evento generato da un oggetto dichiarato con la parola chiave WithEvents
può essere gestito da qualsiasi routine con un'istruzione Handles
per tale evento, come illustrato nell'esempio seguente:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
L'istruzione WithEvents
e la clausola Handles
rappresentano spesso la scelta migliore per i gestori eventi, perché la sintassi dichiarativa che usano semplifica la scrittura del codice, la lettura e il debug per la gestione degli eventi. Tenere presenti, tuttavia, le limitazioni seguenti per l'uso delle variabili WithEvents
:
Non è possibile usare una variabile
WithEvents
come variabile oggetto, ovvero non è possibile dichiararla comeObject
, ma è necessario specificare il nome della classe quando si dichiara la variabile.Poiché gli eventi condivisi non sono associati alle istanze di classe, non è possibile usare
WithEvents
per gestire in modo dichiarativo gli eventi condivisi. In modo analogo, non è possibile usareWithEvents
oHandles
per gestire gli eventi daStructure
. In entrambi i casi, è possibile usare l'istruzioneAddHandler
per gestire tali eventi.Non è possibile creare matrici di variabili
WithEvents
.
Le variabili WithEvents
consentono a un unico gestore eventi di gestire uno o più tipi di evento oppure a uno o più gestori eventi di gestire lo stesso tipo di evento.
Anche se la clausola Handles
rappresenta la modalità standard per associare un evento a un gestore eventi, è limitata all'associazione di eventi a gestori eventi in fase di compilazione.
In alcuni casi, ad esempio con eventi associati a maschere o controlli, Visual Basic stub automaticamente un gestore eventi vuoto e lo associa a un evento. Ad esempio, quando si fa doppio clic su un pulsante di comando in una maschera in modalità progettazione, Visual Basic crea un gestore eventi vuoto e una WithEvents
variabile per il pulsante di comando, come nel codice seguente:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler e RemoveHandler
L'istruzione AddHandler
è simile alla clausola Handles
, perché entrambe consentono di specificare un gestore eventi. Tuttavia, l'uso di AddHandler
con RemoveHandler
offre una maggiore flessibilità rispetto alla clausola Handles
, perché consente di aggiungere, rimuovere e modificare dinamicamente il gestore eventi associato a un evento. Per gestire eventi condivisi o eventi da una struttura, è necessario usare AddHandler
.
AddHandler
accetta due argomenti: il nome di un evento da un mittente di eventi, ad esempio un controllo e un'espressione che restituisce un delegato. Non è necessario specificare in modo esplicito la classe delegata quando si usa AddHandler
, perché l'istruzione AddressOf
restituisce sempre un riferimento al delegato. L'esempio seguente associa un gestore eventi a un evento generato da un oggetto:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, che disconnette un evento da un gestore eventi, usa la stessa sintassi di AddHandler
. Ad esempio:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
Nell'esempio seguente un gestore eventi viene associato a un evento e l'evento viene generato. Il gestore eventi intercetta l'evento e visualizza un messaggio.
Il primo gestore eventi viene quindi rimosso e all'evento viene associato un diverso gestore eventi. Quando l'evento viene generato di nuovo, viene visualizzato un messaggio diverso.
Infine, il secondo gestore eventi viene rimosso e viene generato l'evento per una terza volta. Dato che all'evento non è più associato un gestore eventi, non viene eseguita alcuna azione.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
Gestione degli eventi ereditati da una classe di base
Le classi derivate, ovvero le classi che ereditano le caratteristiche da una classe di base, possono gestire gli eventi generati dalla rispettiva classe di base usando l'istruzione Handles MyBase
.
Per gestire gli eventi da una classe di base
Dichiarare un gestore eventi nella classe derivata aggiungendo un'istruzione
Handles MyBase.
nomeevento alla riga della dichiarazione della routine del gestore eventi, dove nomeevento è il nome dell'evento nella classe di base che si sta gestendo. Ad esempio:Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
Sezioni correlate
Titolo | Descrizione |
---|---|
Procedura dettagliata: dichiarazione e generazione di eventi | Descrizione dettagliata della procedura per dichiarare e generare eventi per una classe. |
Procedura dettagliata: gestione di eventi | Illustra come scrivere una routine di gestore eventi. |
Procedura: dichiarare eventi personalizzati per evitare il blocco | Illustra come definire un evento personalizzato che consente la chiamata asincrona dei gestori eventi. |
Procedura: dichiarare eventi personalizzati per proteggere la memoria | Illustra come definire un evento personalizzato che usa la memoria solo quando viene gestito l'evento. |
Risoluzione dei problemi relativi ai gestori eventi ereditati in Visual Basic | Elenca i problemi comuni che si verificano con i gestori eventi nei componenti ereditati. |
Eventi | Viene fornita una panoramica del modello di eventi usato in .NET Framework. |
Creazione di gestori eventi in Windows Form | Descrive come usare gli eventi associati agli oggetti di Windows Form. |
Delegati | Panoramica dei delegati in Visual Basic. |