PDF de programación - Delegados y eventos en Visual Basic 2005

Delegados y eventos en Visual Basic 2005gráfica de visualizaciones

Publicado el 14 de Enero del 2017
310 visualizaciones desde el 14 de Enero del 2017
277,7 KB
6 paginas
Guillermo “Guille” Som

dnm.inicio.fundamentos
dnm.incio.fundamentos

Delegados y eventos en Visual Basic 2005
Llega Custom Event... ¡y yo con estos pelos!

En esta ocasión vamos a centrarnos en los delegados y eventos desde el punto de vis-
ta del programador de Visual Basic,y particularmente en la nueva instrucción Custom
Event,desde la que tendremos control total sobre cómo se crean,destruyen y utilizan
los eventos desde Visual Basic 2005.También veremos cómo definir e interceptar los
eventos de las distintas formas que nos permite ese lenguaje.

<<

Eventos en Visual Basic 2005

Desde sus inicios, Visual Basic ha sido un lengua-
je enfocado a aliviar al programador de las tareas de
bajo nivel, consiguiendo de esa forma que el progra-
mador se centre en lo realmente importante y se olvi-
de un poco de todo lo que ocurre de fondo. Los even-
tos no son una excepción, y por eso los programado-
res de Visual Basic a la hora de definir un evento solo
tienen que preocuparse de una cosa: definirlo. Aunque
esto estaba bien en las versiones anteriores a .NET, ya
que .NET Framework necesita más, y no le basta con
una simple definición de un evento. Porque, tal como
vimos en los dos artículos anteriores (dotNetManía
nº 30 y 31), el motor de tiempo de ejecución de .NET
(CLR) necesita que cada evento que hayamos defini-
do tenga un delegado asociado, y por suerte el compi-
lador de Visual Basic se encarga de esa exigencia y crea
ese delegado por nosotros.

Cuando definimos un evento en Visual Basic, solo
nos tendremos que preocupar del nombre que ten-
drá dicho evento y de los parámetros (si tiene) que
usará. Esos parámetros –la cantidad y tipos– son
importantes, ya que el método usado para intercep-
tar el evento debe tener el mismo número y tipos de
parámetros que hayamos usado a la hora de definir el
evento. Por ejemplo, si tenemos la definición de even-
to que se muestra en el código del fuente 1, la defi-
nición del método que lo interceptará (el que recibi-
rá la notificación cuando dicho evento se produzca)
también ha de tener esos dos parámetros de tipo
String, tal como vemos en el código del fuente 2.

Event DatosCambiados( ByVal nuevo As String, _
ByVal anterior As String)

Fuente 1. Definición de un evento con dos parámetros

Sub cli_DatosCambiados( ByVal nuevo As String, _
ByVal anterior As String)

Fuente 2. Método que intercepta el evento definido
en el fuente 1

Cuando se lanza un evento, en realidad se está lla-
mando a los métodos que lo interceptan, y lo habi-
tual es que esos métodos estén en clases diferentes a
la que define el evento. Para .NET los métodos
“receptores” de los eventos son funciones que no
devuelven ningún valor, y cuando el evento se pro-
duce, el CLR llama (o ejecuta) dichos métodos. Pero
el CLR tiene que asegurarse de que el método recep-
tor del evento cumple con la condición de que tenga
la misma firma que el evento, es decir, tenga el mis-
mo número y tipo de parámetros. Y la forma de ase-
gurarlo es por medio de los delegados, que como sabe-
mos, en el fondo son “punteros administrados” a fun-
ciones. Pero los programadores de Visual Basic no
tienen porqué saber nada de punteros, ya sean admi-
nistrados o no. Por eso es el propio compilador de
Visual Basic el que se encarga de esos “detalles”. Y
sin que nosotros lo sepamos, cuando definimos un
evento, en realidad el compilador define también un
delegado, el cual asocia con dicho evento.

Guillermo “Guille” Som
Es Microsoft MVP de Visual Basic
desde 1997.Es redactor de
dotNetManía,miembro de Ineta
Speakers Bureau Latin America,
mentor de Solid Quality
Iberoamericana y autor de
los libros “Manual Imprescindible
de Visual Basic .NET” y
“Visual Basic 2005”.
http://www.elguille.info

Cuando definimos un evento en Visual Basic,solo tenemos
que preocuparnos del nombre que tendrá dicho evento y

de los parámetros (si tiene) que usará

Los programadores de Visual Basic no tienen por
qué saber nada de esa relación evento-delegado, o
al menos así era hasta la llegada de Visual Basic 2005,
y en realidad ni tan siquiera en esa versión tienen
que saber nada de dicha relación, salvo porque aho-
ra el lenguaje incluye una nueva instrucción que per-
mite controlar al dedillo todo lo relacionado con los
eventos: Custom Event. Con esa instrucción pode-
mos controlar todo lo que atañe al uso de los even-
tos: cuándo se asocia un evento con un método, cuán-
do se quita esa relación y cuándo se produce el even-
to. Pero antes de entrar en detalles, veamos qué es
lo que tenemos que hacer para definir, lanzar e inter-
ceptar eventos desde Visual Basic. Empezaremos
viendo cómo hacer todo eso de la forma tradicional
y sencilla, para después ver cómo definir eventos al
estilo .NET, es decir, relacionando los eventos con
delegados.

Definir eventos en Visual Basic

La definición de un evento en Visual Basic la
haremos por medio de la instrucción Event. Los
eventos, al igual que el resto de miembros de una
clase o tipo, deben tener un nombre y opcional-
mente parámetros. Usando el código del fuente 1
tendremos definido un evento que nos puede ser-
vir para indicar que el valor de una propiedad ha
cambiado; ese evento informará al método que lo
intercepte de cuál es el nuevo valor que se ha asig-
nado a la propiedad, así como cuál era el valor que
tenía antes de esa asignación.

Figura 1. IntelliSense nos muestra los
eventos que tenemos definidos en la clase

En el código del fuente 3 se muestra cómo defi-
nir y lanzar un evento. Tal como vemos, ese evento
sirve para notificar el cambio en la propiedad Nombre
de la clase Cliente.

Public Class Cliente

Public Event DatosCambiados(ByVal nuevo As String, _
ByVal anterior As String)

Private m_Nombre As String
Public Property Nombre() As String

Get

Return m_Nombre

End Get
Set(ByVal value As String)

If value <> m_Nombre Then

RaiseEvent DatosCambiados(value, m_Nombre)

End If
m_Nombre = value

End Set

End Property

End Class

Fuente 3. Ejemplo de una clase que define y lanza un evento

Lanzar (o producir) un evento

Interceptar eventos

Para producir un evento, lo haremos por medio
de la instrucción RaiseEvent. A dicha instrucción
le tenemos que indicar el nombre del evento que
queremos producir y los valores a usar en los pará-
metros que tenga el evento. Cuando trabajamos
con el entorno de desarrollo de Visual Basic, al
escribir esa instrucción, éste nos mostrará los even-
tos que tenemos definidos, y al seleccionarlo vere-
mos qué parámetros tenemos que indicar, tal como
muestra la figura 1.

Para recibir la notificación de que un evento se
ha producido, debemos definir un método que ten-
ga la misma firma que el evento, es decir, que tenga
el mismo número y tipo de parámetros. En nuestro
ejemplo, podría ser como el mostrado en el código
del fuente 2.

Cuando el evento se produce en la clase que lo
define (por medio de RaiseEvent), cada método que
esté asociado con ese evento recibirá la notificación
de que el evento se ha producido, pero para poder

<<

dnm.inicio.fundamentos

a
í
n
a
M
t
e
N
t
o
d
<
<

41

<<

dnm.inicio.fundamentos

da la versión Express). Para añadir el
método solo tendremos que mostrar la
ventana de código y seleccionar la varia-
ble definida con WithEvents de la lista
despegable de la izquierda y el evento a
interceptar de la lista despegable de la
derecha (ver figura 2). De esta forma, el
editor de Visual Basic se encargará de
crear el método con los parámetros ade-
cuados y asociarlo al evento por medio
de la instrucción Handles.

Figura 2. El editor de Visual Basic permite
crear automáticamente los métodos
asociados a los eventos

Debemos aclarar que el uso de la ins-
trucción WithEvents solo se permite a nivel
de módulo; es decir, no podemos usar esa
instrucción para declarar una variable den-
tro de un método o propiedad (no puede
ser local), y tampoco podemos usarla para
definir arrays. Aunque sí podemos usar
cualquier modificador de ámbito como
Public, etc.

recibir ese aviso, antes debemos asociar
dicho método con el evento que quere-
mos interceptar.

Asociar un método con un
evento

Para que un evento pueda avisar a
todos los métodos que esperan el aviso,
hay que asociar ese evento con cada
método que recibirá la notificación. En
Visual Basic podemos hacerlo de dos
formas:

Asociar un método con evento auto-
máticamente

La forma más simple es declarando
la variable de la clase que define el even-
to con WithEvents. De esa forma, pode-
mos definir el método de la misma for-
ma que lo hacemos con los controles de
los formularios, es decir, usando la ins-
trucción Handles, después de la defini-
ción del método, seguida de la variable
y el nombre del evento a interceptar. En
el código del fuente 4 podemos ver
cómo definir una variable de tipo
Cliente y el método que recibirá la noti-
ficación.

Private WithEvents cli As Cliente

Sub Main()

cli = New Cliente
cli.Nombre = “Pepe”

End Sub

Private Sub cli_DatosCambiados( ByVal nuevo As String, ByVal anterior As String) _

Handles cli.DatosCambiados

Console.WriteLine(“Han cambiado los datos:{2}” & “Anterior: {0}{2}Nuevo: {1}”, _

anterior, nuevo, vbCrLf)

End Sub

Fuente 4. Las variables definidas con WithEvents permiten asociar un método
a un evento por medio de Handles

Asociar un método con evento de for-
ma manual

La otra forma de asociar un even-
to con un método es por medio de la
instrucción AddHandler. En este caso,
la declaración de la variable la pode-
mos hacer en cualquier parte del
código, incluso de forma local (den-
tro de un método), y usando cual-
quiera de los modificadores permiti-
dos, además de que esa variable pue-
de ser un elemento de un array. Una
vez que tenemos definida e instancia-
da la variable, usaremos la instruc-
ción AddHandler tal como se muestra
en el siguiente código:

AddHandler cli.DatosCambiados, _

AddressOf cli_DatosCambiados

En el primero de los dos argumen-
tos indicamos la variable y el evento
que queremos interceptar; en el
segundo tenemos que indicar la dire
  • Links de descarga
http://lwp-l.com/pdf687

Comentarios de: Delegados y eventos en Visual Basic 2005 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad