Istruzione Event

Dichiara un evento definito dall'utente.

Sintassi

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

Parti

In parte Descrizione
attrlist Facoltativo. Elenco degli attributi applicabili all'evento. Gli attributi sono separati da una virgola. È necessario racchiudere l'elenco degli attributi tra parentesi angolari ("<" e ">").
accessmodifier Facoltativo. Specifica il tipo di codice che può accedere all'evento. Può essere uno dei seguenti:

- Public: può accedere qualsiasi codice che sia in grado di accedere all'elemento che lo dichiara.
- Protected: può accedere solo il codice incluso nella relativa classe o in una classe derivata.
- Friend: può accedere solo il codice incluso nello stesso assembly.
- Private: può accedere solo il codice incluso nell'elemento che lo dichiara.
- Protected Friend: può accedere solo il codice nella classe dell'evento, in una classe derivata o nello stesso assembly.
- Private Protected: può accedere solo il codice nella classe dell'evento o in una classe derivata nello stesso assembly.
Shared Facoltativo. Specifica che l'evento non è associato a una specifica istanza di una classe o di una struttura.
Shadows Facoltativo. Indica che l'evento ridichiara e nasconde un elemento di programmazione omonimo o un insieme di elementi in overload di una classe base. È possibile nascondere qualsiasi tipo di elemento dichiarato con qualsiasi altro tipo.

Un elemento nascosto non è disponibile all'interno della classe derivata che lo nasconde, a meno che l'elemento di shadowing sia inaccessibile. Ad esempio, se un elemento Private nasconde un elemento della classe base, il codice che non dispone dell'autorizzazione per accedere all'elemento Private accede invece all'elemento della classe base.
eventname Obbligatorio. Nome dell'evento, conforme alle convenzioni di denominazione standard delle variabili.
parameterlist Facoltativo. Elenco di variabili locali che rappresentano i parametri dell'evento. È necessario racchiudere l'elenco dei parametri tra parentesi.
Implements Facoltativo. Indica che l'evento implementa un evento di un'interfaccia.
implementslist Necessario se si fornisce Implements. Elenco delle routine Sub implementate. Nel caso di più routine, è possibile separarle mediante virgole.

implementedprocedure [ , implementedprocedure ... ]

Ogni implementedprocedure presenta la sintassi e le parti seguenti:

interface.definedname

- interface - Obbligatorio. Nome di un'interfaccia implementata dalla classe o dalla struttura che contiene la routine.
- Definedname - Obbligatorio. Nome mediante il quale la routine viene definita in interface. Non è necessario che questo nome corrisponda al nome usato dalla routine per implementare la routine definita, ossia name.
Custom Obbligatorio. È necessario che gli eventi dichiarati come Custom definiscano funzioni di accesso AddHandler, RemoveHandler e RaiseEvent personalizzate.
delegatename Facoltativo. Nome del delegato che specifica la firma del gestore eventi.
AddHandler Obbligatorio. Dichiara una funzione di accesso AddHandler che specifica le istruzioni da eseguire quando viene aggiunto un gestore eventi, sia in modo esplicito mediante l'istruzione AddHandler che in modo implicito mediante la clausola Handles
End AddHandler Obbligatorio. Termina il blocco AddHandler.
value Obbligatorio. Nome del parametro.
RemoveHandler Obbligatorio. Dichiara una funzione di accesso RemoveHandler, che specifica le istruzioni da eseguire quando un gestore eventi viene rimosso mediante l'istruzione RemoveHandler.
End RemoveHandler Obbligatorio. Termina il blocco RemoveHandler.
RaiseEvent Obbligatorio. Dichiara una funzione di accesso RaiseEvent, che specifica le istruzioni da eseguire quando l'evento viene generato mediante l'istruzione RaiseEvent. In genere, viene richiamato un elenco di delegati gestito dalle funzioni di accesso AddHandler e RemoveHandler.
End RaiseEvent Obbligatorio. Termina il blocco RaiseEvent.
delegatesignature Obbligatorio. Elenco di parametri che corrisponde ai parametri richiesti dal delegato delegatename. È necessario racchiudere l'elenco dei parametri tra parentesi.
statements Facoltativo. Istruzioni che includono i corpi dei metodi AddHandler, RemoveHandler e RaiseEvent.
End Event Obbligatorio. Termina il blocco Event.

Osservazioni:

Dopo aver dichiarato l'evento, usare l'istruzione RaiseEvent per generarlo. Nei frammenti seguenti viene mostrato un esempio tipico di dichiarazione e generazione di un evento:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Nota

È possibile dichiarare argomenti per gli eventi analogamente a quanto avviene per gli argomenti di routine, tenendo però conto che non è possibile specificare per gli eventi argomenti denominati, argomenti ParamArray o argomenti Optional, né ottenere da essi valori restituiti.

Per gestire un evento è necessario associarlo a una subroutine del gestore eventi mediante l'istruzione Handles o AddHandler. Le firme della subroutine e dell'evento devono corrispondere. Per gestire un evento condiviso è necessario usare l'istruzione AddHandler.

Si può usare Event solo a livello di modulo. In altri termini, il contesto della dichiarazione per un evento deve essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine, uno spazio dei nomi, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Nella maggior parte dei casi, per dichiarare un evento è possibile usare la prima sintassi nella sezione relativa alla sintassi di questo argomento. In alcuni scenari è tuttavia necessario disporre di un controllo maggiore sui dettagli del comportamento dell'evento. L'ultima sintassi nella sezione relativa alla sintassi di questo argomento, che usa la parola chiave Custom, offre questa possibilità consentendo la definizione di eventi personalizzati. In un evento personalizzato si specifica esattamente ciò che accade quando il codice aggiunge o rimuove un gestore eventi a o dall'evento oppure quando il codice genera l'evento. Per alcuni esempi, vedere Procedura: Dichiarare eventi personalizzati per risparmiare memoria e Procedura: Dichiarare eventi personalizzati per evitare blocchi.

Esempio

Negli esempi seguenti, gli eventi vengono usati per il conto alla rovescia dei secondi, da 10 a 0. Il codice illustra numerosi metodi, proprietà e istruzioni correlati agli eventi, inclusa l'istruzione RaiseEvent.

La classe che genera un evento viene definita origine e i metodi che lo elaborano vengono definiti gestori eventi. Un'origine eventi può disporre di più gestori per gli eventi generati. Quando la classe genera l'evento, lo stesso evento viene generato in tutte le classi per cui è stato scelto di gestire eventi per tale istanza dell'oggetto.

Nell'esempio vengono usati anche un form (Form1) con un pulsante (Button1) e una casella di testo (TextBox1). Quando si fa clic sul pulsante, nella prima casella di testo viene visualizzato il conto alla rovescia dei secondi da 10 a 0. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".

Il codice di Form1 specifica gli stati di inizio e fine del form. Contiene inoltre il codice eseguito quando vengono generati gli eventi.

Per usare l'esempio, aprire un nuovo progetto Windows Form. Aggiungere quindi un pulsante denominato Button1 e una casella di testo denominata TextBox1 al form principale, denominato Form1. Quindi, fare quindi clic con il pulsante destro del mouse sul form e scegliere Visualizza codice per aprire l'editor di codice.

Aggiungere una variabile WithEvents alla sezione delle dichiarazioni della classe Form1:

Private WithEvents mText As TimerState

Aggiungere il codice seguente al codice per Form1: Sostituire eventuali routine duplicate, ad esempio Form_Load o Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Premere F5 per eseguire l'esempio precedente, quindi fare clic sul pulsante con etichetta Start. Nella prima casella di testo viene avviato il conto alla rovescia dei secondi. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".

Nota

Il metodo My.Application.DoEvents non elabora gli eventi allo stesso modo del form. Per consentire al form di gestire direttamente gli eventi, si può ricorrere al multithreading. Per altre informazioni, vedere Threading gestito.

Vedi anche