Compartir a través de


Event (instrucción)

Declara un evento definido por el usuario.

Sintaxis

[ <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  

Partes

Parte Descripción
attrlist Opcional. Lista de atributos que se aplican a este evento. Varios atributos están separados por comas. Debe incluir la lista de atributos entre corchetes angulares ("<" y ">").
accessmodifier Opcional. Especifica qué código puede tener acceso al evento. Puede ser uno de los siguientes:

- Public: cualquier código que pueda tener acceso al elemento que lo declara puede acceder a él.
- Protegido: solo el código dentro de su clase o una clase derivada puede acceder a él.
- Friend: solo el código del mismo ensamblado puede acceder a él.
- Privado: solo el código del elemento que lo declara puede acceder.
- El código de solo confianza protegido en la clase del evento, una clase derivada o el mismo ensamblado puede acceder a él.
- El código privado de solo protección en la clase del evento o una clase derivada del mismo ensamblado puede acceder a él.
Shared Opcional. Especifica que este evento no está asociado a una instancia específica de una clase o estructura.
Shadows Opcional. Indica que este evento vuelve a declarar y oculta un elemento de programación con un nombre idéntico, o un conjunto de elementos sobrecargados, en una clase base. Puede sombrear cualquier tipo de elemento declarado con cualquier otro tipo.

Un elemento sombreado no está disponible desde dentro de la clase derivada que lo sombrea, excepto desde donde no se puede acceder al elemento de sombreado. Por ejemplo, si un Private elemento sombrea un elemento de clase base, el código que no tiene permiso para acceder al Private elemento tiene acceso al elemento de clase base en su lugar.
eventname Obligatorio. Nombre del evento; sigue las convenciones de nomenclatura de variables estándar.
parameterlist Opcional. Lista de variables locales que representan los parámetros de este evento. Debe incluir la lista de parámetros entre paréntesis.
Implements Opcional. Indica que este evento implementa un evento de una interfaz.
implementslist Obligatorio si Implements se proporciona. Lista de Sub procedimientos que se implementan. Varios procedimientos están separados por comas:

implementprocedure [ , implementóprocedure ... ]

Cada implementedprocedure tiene la sintaxis y las partes siguientes:

interface.definedname

- interface -Obligatorio. Nombre de una interfaz que implementa la clase o estructura que contiene este procedimiento.
- Definedname -Obligatorio. Nombre por el que se define el procedimiento en interface. Esto no tiene que ser el mismo nameque , el nombre que usa este procedimiento para implementar el procedimiento definido.
Custom Obligatorio. Los eventos declarados como Custom deben definir descriptores de acceso personalizados AddHandler, RemoveHandlery RaiseEvent .
delegatename Opcional. Nombre de un delegado que especifica la firma del controlador de eventos.
AddHandler Obligatorio. Declara un AddHandler descriptor de acceso, que especifica las instrucciones que se van a ejecutar cuando se agrega un controlador de eventos, ya sea explícitamente mediante la AddHandler instrucción o implícitamente mediante la Handles cláusula .
End AddHandler Obligatorio. Finaliza el AddHandler bloque.
value Obligatorio. Nombre del parámetro.
RemoveHandler Obligatorio. Declara un RemoveHandler descriptor de acceso, que especifica las instrucciones que se van a ejecutar cuando se quita un controlador de eventos mediante la RemoveHandler instrucción .
End RemoveHandler Obligatorio. Finaliza el RemoveHandler bloque.
RaiseEvent Obligatorio. Declara un RaiseEvent descriptor de acceso, que especifica las instrucciones que se van a ejecutar cuando se genera el evento mediante la RaiseEvent instrucción . Normalmente, esto invoca una lista de delegados mantenidos por los AddHandler descriptores de acceso y RemoveHandler .
End RaiseEvent Obligatorio. Finaliza el RaiseEvent bloque.
delegatesignature Obligatorio. Lista de parámetros que coinciden con los parámetros requeridos por el delegatename delegado. Debe incluir la lista de parámetros entre paréntesis.
statements Opcional. Instrucciones que contienen los cuerpos de los AddHandlermétodos , RemoveHandlery RaiseEvent .
End Event Obligatorio. Finaliza el Event bloque.

Observaciones

Una vez declarado el evento, use la RaiseEvent instrucción para generar el evento. Un evento típico puede declararse y generarse como se muestra en los siguientes fragmentos:

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:

Puede declarar argumentos de evento igual que argumentos de procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos con nombre, ParamArray argumentos o Optional argumentos. Los eventos no tienen valores devueltos.

Para controlar un evento, debe asociarlo a una subrutina del controlador de eventos mediante la Handles instrucción o AddHandler . Las firmas de la subrutina y el evento deben coincidir. Para controlar un evento compartido, debe usar la AddHandler instrucción .

Solo puede usar Event en el nivel de módulo. Esto significa que el contexto de declaración de un evento debe ser una clase, estructura, módulo o interfaz, y no puede ser un archivo de origen, un espacio de nombres, un procedimiento o un bloque. Para obtener más información, vea Contextos de declaración y Niveles de acceso predeterminados.

En la mayoría de las circunstancias, puede usar la primera sintaxis de la sección Sintaxis de este tema para declarar eventos. Sin embargo, algunos escenarios requieren que tenga más control sobre el comportamiento detallado del evento. La última sintaxis de la sección Sintaxis de este tema, que usa la Custom palabra clave , proporciona ese control al permitirle definir eventos personalizados. En un evento personalizado, se especifica exactamente lo que ocurre cuando el código agrega o quita un controlador de eventos al evento o cuando el código genera el evento. Para obtener ejemplos, vea Cómo: Declarar eventos personalizados para conservar memoria y Cómo: Declarar eventos personalizados para evitar bloqueos.

Ejemplo

En el ejemplo siguiente se usan eventos para contar los segundos de 10 a 0. El código muestra varios de los métodos, propiedades y instrucciones relacionados con eventos. Esto incluye la RaiseEvent instrucción .

La clase que genera un evento es el origen del evento y los métodos que procesan el evento son los controladores de eventos. Un origen de eventos puede tener varios controladores para los eventos que genera. Cuando la clase genera el evento, ese evento se genera en cada clase que ha elegido controlar eventos para esa instancia del objeto.

En el ejemplo también se usa un formulario (Form1) con un botón (Button1) y un cuadro de texto (TextBox1). Al hacer clic en el botón, el primer cuadro de texto muestra una cuenta atrás de 10 a 0 segundos. Cuando ha transcurrido el tiempo completo (10 segundos), el primer cuadro de texto muestra "Listo".

El código para Form1 especifica los estados iniciales y terminales del formulario. También contiene el código ejecutado cuando se producen los eventos.

Para usar este ejemplo, abra un nuevo proyecto de Windows Forms. A continuación, agregue un botón denominado Button1 y un cuadro de texto denominado TextBox1 al formulario principal, denominado Form1. A continuación, haga clic con el botón derecho en el formulario y haga clic en Ver código para abrir el editor de código.

Agregue una WithEvents variable a la sección de declaraciones de la Form1 clase :

Public Class TimerExample
    Private WithEvents mTimer As TimerState

Agregue el código siguiente al código para Form1. Reemplace los procedimientos duplicados que puedan existir, como Form_Load o Button_Click.

    Public Sub StartCountdownExample()
        mTimer = New TimerState()
        mTimer.StartCountdown(10.0, 1.0)
    End Sub

    Private Sub mTimer_UpdateTime(ByVal Countdown As Double) Handles mTimer.UpdateTime
        Console.WriteLine("Time remaining: " & Format(Countdown, "##0.0") & " seconds")
    End Sub

    Private Sub mTimer_Finished() Handles mTimer.Finished
        Console.WriteLine("Done")
    End Sub
End Class

Public Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim SoFar As Double = 0
        Do While SoFar < Duration
            System.Threading.Thread.Sleep(CInt(Increment * 1000))
            SoFar += Increment
            RaiseEvent UpdateTime(Duration - SoFar)
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Presione F5 para ejecutar el ejemplo anterior y haga clic en el botón denominado Inicio. El primer cuadro de texto comienza a contar los segundos. Cuando ha transcurrido el tiempo completo (10 segundos), el primer cuadro de texto muestra "Listo".

Nota:

El My.Application.DoEvents método no procesa los eventos de la misma manera que lo hace el formulario. Para permitir que el formulario controle los eventos directamente, puede usar multithreading. Para obtener más información, consulte Managed Threading.

Consulte también