Eventi (Visual Basic)
Sebbene sia possibile rappresentare graficamente un progetto di Visual Studio come una serie di procedure eseguite in sequenza, in realtà la maggior parte dei programmi è guidata dagli eventi, ovvero il flusso di esecuzione è determinato da occorrenze esterne denominate eventi.
Un evento è un segnale che informa un'applicazione che si è verificato qualcosa di importante.Quando ad esempio l'utente fa clic su un controllo in un form, quest'ultimo può generare un evento Click e chiamare una routine che gestisce tale evento.Gli eventi consentono anche la comunicazione tra diverse attività.Se ad esempio l'applicazione esegue un'attività di ordinamento separatamente rispetto all'applicazione principale,e l'ordinamento viene annullato dall'utente, l'applicazione può inviare un evento di annullamento che determina l'interruzione del processo di ordinamento.
Termini e concetti relativi agli eventi
In questa sezione vengono descritti i termini e i concetti utilizzati con gli eventi in Visual Basic.
Dichiarazione di eventi
Per dichiarare eventi all'interno di classi, strutture, moduli e interfacce, è possibile utilizzare la parola chiave Event, come nell'esempio seguente:
Event AnEvent(ByVal EventNumber As Integer)
Generazione di eventi
Un evento è una sorta di messaggio che informa che è accaduto qualcosa di importante.L'atto di trasmettere il messaggio è detto generazione dell'evento.In Visual Basic è possibile generare eventi con l'istruzione RaiseEvent, come nell'esempio seguente:
RaiseEvent AnEvent(EventNumber)
È necessario generare gli eventi nell'ambito della classe, modulo o struttura quando sono dichiarati.Non è ad esempio possibile che una classe derivata generi eventi ereditati da una classe base.
Origini eventi
Qualsiasi oggetto capace di generare un evento è un mittente dell'evento, noto anche come origine eventi.Form, controlli e oggetti definiti dall'utente sono esempi di origini eventi.
Gestori di eventi
I gestori di eventi sono routine che vengono richiamate quando si verifica un evento corrispondente.È possibile utilizzare qualsiasi subroutine valida con una firma corrispondente come gestore di eventi.Non è invece possibile utilizzare una funzione come gestore di eventi in quanto questa non è in grado di restituire un valore all'origine evento.
In Visual Basic per i gestori degli eventi viene utilizzata una convenzione di denominazione standard che combina il nome del mittente dell'evento, seguito da un carattere di sottolineatura e dal nome dell'evento.Ad esempio, l'evento Click di un pulsante denominato button1 verrebbe denominato Sub button1_Click.
[!NOTA]
L'utilizzo di questa convenzione di denominazione è consigliato ma non obbligatorio per la definizione dei gestori eventi; è possibile utilizzare qualsiasi nome di subroutine valido.
Associazione di eventi a gestori di eventi
Perché un gestore di eventi diventi utilizzabile, è necessario dapprima associarlo a un evento utilizzando l'istruzione Handles o AddHandler.
WithEvents e clausola Handles
L'istruzione WithEvents e la clausola Handles forniscono una modalità dichiarativa per specificare i gestori di eventi.Un evento generato da un oggetto dichiarato con la parola chiave WithEvents può essere gestito mediante qualsiasi routine con un'istruzione Handles relativa a 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 spesso costituiscono la soluzione ottimale per i gestori di eventi, poiché la sintassi dichiarativa che utilizzano semplifica le attività di codifica, lettura e debug per la gestione degli eventi.Si tengano tuttavia presenti le seguenti limitazioni relative all'utilizzo delle variabili WithEvents:
Non è possibile utilizzare una variabile WithEvents come variabile di oggetto.In altre parole, non è possibile dichiararla come Object ma è necessario specificare il nome della classe quando la si dichiara.
Poiché gli eventi condivisi non sono collegati a istanze di classe, non è possibile utilizzare WithEvents per gestire eventi condivisi in maniera dichiarativa.In modo analogo, non è possibile utilizzare WithEvents o Handles per gestire eventi da una Structure.In entrambi i casi, è possibile utilizzare l'istruzione AddHandler per gestire tali eventi.
Non è possibile creare matrici di variabili WithEvents.
Le variabili WithEvents consentono a unico gestore di eventi di gestire uno o più tipi di evento o a uno o più gestori di eventi di gestire lo stesso tipo di evento.
Sebbene la clausola Handles sia il metodo standard per associare un evento a un gestore di eventi, questa si limita ad associare gli eventi ai gestori di eventi in fase di compilazione.
In alcuni casi, ad esempio con eventi associati a form o controlli, in Visual Basic viene generato automaticamente un gestore degli eventi vuoto che viene associato a un evento.Quando ad esempio si fa doppio clic su un pulsante di comando in un form in modalità progettazione, Visual Basic crea un gestore degli eventi vuoto e una variabile WithEvents per tale pulsante, 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, poiché entrambe consentono di specificare un gestore eventi.AddHandler, utilizzato con RemoveHandler, offre tuttavia un grado superiore di flessibilità rispetto alla clausola Handles, in quanto consente di aggiungere, rimuovere e modificare dinamicamente il gestore eventi associato a un evento.Se si desidera gestire eventi condivisi o eventi da una struttura, è necessario utilizzare AddHandler.
AddHandler richiede due argomenti: il nome di un evento da un'origine eventi, ad esempio un controllo, e un'espressione che identifica un delegato.Con AddHandler non è necessario specificare esplicitamente la classe delegata poiché l'istruzione AddressOf restituisce sempre un riferimento al delegato.Di seguito è fornito un esempio di associazione tra un gestore di eventi e un evento generato da un oggetto:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler, che disconnette un evento da un gestore di eventi, utilizza la stessa sintassi di AddHandler.Di seguito è riportato un esempio:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
Nell'esempio seguente un gestore degli eventi viene associato a un evento e l'evento viene generato.Il gestore degli eventi rileva l'evento e visualizza un messaggio.
Il primo gestore degli eventi viene quindi rimosso e all'evento viene associato un gestore diverso.Quando l'evento viene generato di nuovo, viene visualizzato un messaggio diverso.
Infine viene rimosso il secondo gestore degli eventi e l'evento viene generato per la terza volta.Poiché all'evento non è più associato alcun gestore, 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 di eventi ereditati da una classe base
Le classi derivate, ossia le classi che ereditano le caratteristiche da una classe base, sono in grado di gestire gli eventi generati dalla classe base utilizzando l'istruzione HandlesMyBase.
Per gestire gli eventi ereditati da una classe base
Dichiarare un gestore eventi nella classe derivata aggiungendo un'istruzione Handles MyBase.eventname alla riga della dichiarazione della routine per la gestione di eventi, in cui eventname corrisponde al nome dell'evento nella classe base che viene gestita.Di seguito è riportato un 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 (Visual Basic) |
Viene fornita una descrizione dettagliata di come dichiarare e generare eventi per una classe. |
Viene mostrato come scrivere una routine di gestione di eventi. |
|
Procedura: dichiarare eventi personalizzati per evitare il blocco (Visual Basic) |
Viene mostrato come definire un evento personalizzato che consenta la chiamata asincrona dei gestori eventi. |
Procedura: dichiarare eventi personalizzati per proteggere la memoria (Visual Basic) |
Viene mostrato come definire un evento personalizzato che consenta l'uso della memoria solo quando l'evento viene gestito. |
Risoluzione dei problemi relativi ai gestori eventi ereditati in Visual Basic |
Vengono elencati problemi comuni relativi ai gestori eventi nei componenti ereditati. |
Vengono forniti i cenni preliminari sul modello eventi in .NET Framework. |
|
Viene descritto come utilizzare gli eventi associati agli oggetti Windows Form. |
|
Vengono forniti i cenni preliminari sui delegati di Visual Basic. |