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 come Object, 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 usare WithEvents o Handles per gestire gli eventi da Structure. In entrambi i casi, è possibile usare l'istruzione AddHandler 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
    
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.