Compartir a través de


Eventos (Visual Basic)

Aunque puede visualizar un proyecto de Visual Studio como una serie de procedimientos que se ejecutan en una secuencia, en realidad, la mayoría de los programas están controlados por eventos, lo que significa que el flujo de ejecución viene determinado por repeticiones externas denominadas eventos.

Un evento es una señal que informa a una aplicación de que se ha producido algo importante. Por ejemplo, cuando un usuario hace clic en un control en un formulario, el formulario puede generar un Click evento y llamar a un procedimiento que controle el evento. Los eventos también permiten la comunicación entre tareas separadas. Por ejemplo, que la aplicación realiza una tarea de ordenación por separado de la aplicación principal. Si un usuario cancela la ordenación, la aplicación puede enviar un evento de cancelación que indique al proceso de ordenación que se detenga.

Términos y conceptos del evento

En esta sección se describen los términos y conceptos usados con eventos en Visual Basic.

Declarar eventos

Los eventos se declaran en clases, estructuras, módulos e interfaces mediante la Event palabra clave , como en el ejemplo siguiente:

Event AnEvent(ByVal EventNumber As Integer)

Provocar eventos

Un evento es como un mensaje que anuncia que se ha producido algo importante. La acción de difundir el mensaje se denomina generar el evento. En Visual Basic, se generan eventos con la RaiseEvent instrucción , como en el ejemplo siguiente:

RaiseEvent AnEvent(EventNumber)

Los eventos deben generarse dentro del ámbito de la clase, el módulo o la estructura donde se declaran. Por ejemplo, una clase derivada no puede generar eventos heredados de una clase base.

Emisores de eventos

Cualquier objeto capaz de generar un evento es un remitente de eventos, también conocido como origen de eventos. Los formularios, los controles y los objetos definidos por el usuario son ejemplos de remitentes de eventos.

Controladores de eventos

Los controladores de eventos son procedimientos a los que se llama cuando se produce un evento correspondiente. Puede usar cualquier subrutina válida con una firma coincidente como controlador de eventos. Sin embargo, no se puede usar una función como controlador de eventos, ya que no puede devolver un valor al origen del evento.

Visual Basic usa una convención de nomenclatura estándar para los controladores de eventos que combina el nombre del remitente del evento, un carácter de subrayado y el nombre del evento. Por ejemplo, el Click evento de un botón denominado button1 se denominaría Sub button1_Click.

Nota:

Se recomienda usar esta convención de nomenclatura al definir controladores de eventos para sus propios eventos, pero no es necesario; puede usar cualquier nombre de subrutina válido.

Asociación de eventos con controladores de eventos

Antes de que un controlador de eventos se pueda usar, primero debe asociarlo a un evento mediante la instrucción Handles o AddHandler .

WithEvents y la cláusula Handles

La WithEvents instrucción y Handles cláusula proporcionan una forma declarativa de especificar controladores de eventos. Un evento generado por un objeto declarado con la WithEvents palabra clave se puede controlar mediante cualquier procedimiento con una Handles instrucción para ese evento, como se muestra en el ejemplo siguiente:

' 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

La WithEvents instrucción y la Handles cláusula suelen ser la mejor opción para los controladores de eventos, ya que la sintaxis declarativa que usan facilita el control de eventos para codificar, leer y depurar. Sin embargo, tenga en cuenta las siguientes limitaciones sobre el uso de WithEvents variables:

  • No se puede usar una WithEvents variable como una variable de objeto. Es decir, no se puede declarar como Object; debe especificar el nombre de clase al declarar la variable.

  • Dado que los eventos compartidos no están vinculados a instancias de clase, no se puede usar WithEvents para controlar mediante declaración los eventos compartidos. Del mismo modo, no se puede usar WithEvents ni Handles para controlar eventos de .Structure En ambos casos, puede usar la instrucción AddHandler para controlar esos eventos.

  • No se pueden crear matrices de WithEvents variables.

WithEvents las variables permiten que un único controlador de eventos controle uno o varios tipos de eventos o uno o varios controladores de eventos controle el mismo tipo de evento.

Aunque la Handles cláusula es la forma estándar de asociar un evento con un controlador de eventos, se limita a asociar eventos con controladores de eventos en tiempo de compilación.

En algunos casos, como con eventos asociados a formularios o controles, Visual Basic quita automáticamente un controlador de eventos vacío y lo asocia a un evento. Por ejemplo, al hacer doble clic en un botón de comando en un formulario en modo de diseño, Visual Basic crea un controlador de eventos vacío y una WithEvents variable para el botón de comando, como en el código siguiente:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler y RemoveHandler

La instrucción AddHandler es similar a la cláusula Handles en que ambas permiten especificar un controlador de eventos. Sin embargo, AddHandler, que se usa con RemoveHandler, proporciona mayor flexibilidad que la cláusula Handles, lo que permite agregar, quitar y cambiar dinámicamente el manejador de eventos asociado con un evento. Si desea controlar eventos compartidos o eventos de una estructura, debe usar AddHandler.

AddHandler adopta dos argumentos: el nombre de un evento de un remitente de eventos como un control y una expresión que evalúa a un delegado. No es necesario especificar explícitamente la clase de delegado al usar AddHandler, ya que la AddressOf instrucción siempre devuelve una referencia al delegado. En el ejemplo siguiente se asocia un controlador de eventos a un evento generado por un objeto :

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, que desconecta un evento de un controlador de eventos, usa la misma sintaxis que AddHandler. Por ejemplo:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

En el ejemplo siguiente, un controlador de eventos está asociado a un evento y se genera el evento. El controlador de eventos detecta el evento y muestra un mensaje.

A continuación, se quita el primer controlador de eventos y se asocia un controlador de eventos diferente al evento. Cuando se vuelve a generar el evento, se muestra un mensaje diferente.

Por último, se quita el segundo controlador de eventos y el evento se genera por tercera vez. Dado que ya no hay un controlador de eventos asociado al evento, no se realiza ninguna acción.

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

Control de eventos heredados de una clase base

Las clases derivadas (clases que heredan características de una clase base) pueden controlar los eventos generados por su clase base mediante la Handles MyBase instrucción .

Para controlar eventos de una clase base

  • Declare un controlador de eventos en la clase derivada agregando una Handles MyBase. instrucción eventname a la línea de declaración del procedimiento del controlador de eventos, donde eventname es el nombre del evento en la clase base que controla. Por ejemplo:

    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
    
Título Descripción
Tutorial: Declaración y generación de eventos Proporciona una descripción paso a paso de cómo declarar y generar eventos para una clase.
Tutorial: Control de eventos Muestra cómo escribir un procedimiento de controlador de eventos.
Procedimiento para declarar eventos personalizados para evitar el bloqueo Muestra cómo definir un evento personalizado que permite llamar a sus controladores de eventos de forma asincrónica.
Cómo: Declarar eventos personalizados para conservar memoria Muestra cómo definir un evento personalizado que usa memoria solo cuando se controla el evento.
Solución de problemas de controladores de eventos heredados en Visual Basic Enumera los problemas comunes que surgen con controladores de eventos en componentes heredados.
Eventos Proporciona información general sobre el modelo de eventos en .NET Framework.
Creación de controladores de eventos en formularios Windows Forms Describe cómo trabajar con eventos asociados a objetos de Windows Forms.
delegados Proporciona información general sobre los delegados en Visual Basic.