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 comoObject
: 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 usarWithEvents
oHandles
para controlar eventos desdeStructure
. En ambos casos, puede usar la instrucciónAddHandler
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
Secciones relacionadas
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. |