Eventos (Visual Basic)

Aunque un proyecto se puede visualizar como una serie de procedimientos que se ejecutan en secuencia, en realidad, la mayoría de los programas se basan en eventos, lo que significa que el flujo de ejecución viene determinado por elementos externos denominados eventos.

Un evento es una señal que comunica a una aplicación que ha sucedido algo importante. Por ejemplo, cuando un usuario hace clic en un control en un formulario, el formulario puede provocar un evento Click y llamar a un procedimiento que controla el evento. Los eventos también permiten que las tareas independientes se comuniquen. Por ejemplo, supongamos que la aplicación realiza una tarea de ordenación de manera independiente a la aplicación principal. Si un usuario cancela la ordenación, la aplicación puede enviar un evento de cancelación que indica al proceso de ordenación que se detenga.

Conceptos y términos de eventos

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

Declarar eventos

Puede declarar eventos dentro de clases, estructuras, módulos e interfaces con la palabra clave Event, como en el ejemplo siguiente:

Event AnEvent(ByVal EventNumber As Integer)

Provocar eventos

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

RaiseEvent AnEvent(EventNumber)

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

Remitentes de eventos

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

Controladores de eventos

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

Visual Basic utiliza una convención de nomenclatura estándar en los controladores de eventos que combina el nombre del remitente del evento, un guion bajo y el nombre del evento. Por ejemplo, el evento Click de un botón con nombre button1 se denominaría Sub button1_Click.

Nota

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

Asociación de eventos con controladores de eventos

Antes de poder utilizar un controlador de eventos, primero debe asociarlo con un evento mediante la utilización de la instrucción Handles o AddHandler.

WithEvents y la cláusula Handles

La instrucción WithEvents y la cláusula Handles proporcionan una forma declarativa de especificar controladores de eventos. Un evento generado por un objeto declarado con la palabra clave WithEvents puede controlarse mediante cualquier procedimiento con una instrucción Handles para ese evento, tal 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 instrucción WithEvents y la cláusula Handles suelen ser la mejor opción para controladores de eventos, porque la sintaxis declarativa que utilizan hace que el control de eventos sea más fácil de codificar, leer y depurar. Sin embargo, tenga en cuenta las siguientes limitaciones en el uso de variables WithEvents:

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

  • Como los eventos compartidos no están enlazados a las instancias de clase, WithEvents no se puede usar para controlar los eventos compartidos mediante declaración. De forma similar, no puede usar WithEvents o Handles para controlar eventos desde Structure. En ambos casos, puede usar la instrucción AddHandler para controlar dichos eventos.

  • No puede crear matrices de las variables WithEvents.

Las variables WithEvents permiten que un único controlador de eventos controle uno o varios tipos de eventos, o bien que uno o varios controladores de eventos controlen el mismo tipo de eventos.

Aunque la cláusula Handles es la forma estándar de asociar un evento con un controlador de eventos, tiene la limitación de que solo puede asociar eventos con controladores de eventos en tiempo de compilación.

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

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 por el hecho de que ambas permiten especificar un controlador de eventos. Sin embargo, AddHandler, que se utiliza con RemoveHandler, aporta más flexibilidad que la cláusula Handles, ya que permite agregar, eliminar y cambiar de forma dinámica el controlador de eventos asociado con un evento. Si desea controlar eventos compartidos o eventos de una estructura, debe utilizar 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 delegada al utilizar AddHandler, puesto que la instrucción AddressOf 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, utiliza 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 otro 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 ningún 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

Clases derivadas: clases que heredan características de una clase base, que pueden controlar eventos generados por su clase base con la instrucción Handles MyBase.

Para controlar eventos de una clase base

  • Declare un controlador de eventos en la clase derivada; para ello, agregue una instrucción Handles MyBase.eventname a la línea de declaración del procedimiento del controlador de eventos, donde eventname es el nombre del evento de la clase base que se va a controlar. 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
    
Title Descripción
Tutorial: Declarar y generar eventos Proporciona una descripción detallada de cómo declarar y generar eventos para una clase.
Tutorial: Controlar eventos Muestra cómo escribir un procedimiento de controlador de eventos.
Procedimiento para declarar eventos personalizados para evitar bloqueos Muestra cómo definir un evento personalizado que permite invocar 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 utiliza la memoria solo cuando se controla el evento.
Solucionar problemas de controladores de eventos heredados en Visual Basic Enumera los problemas habituales que se producen con los controladores de eventos en componentes heredados.
Eventos Proporciona una descripción general del modelo de eventos de .NET Framework.
Crear controladores de eventos en Windows Forms Describe cómo trabajar con eventos asociados a objetos de Windows Forms.
Delegados Proporciona información general sobre delegados en Visual Basic.