Compartiendo código entre controles

Compartiendo código entre controles

===

Compartiendo código entre controles

En versiones anteriores de Visual Basic, podíamos crear un array de controles estableciendo en la propiedad Index del control, el número correspondiente a la posición de dicho control dentro del array. Como restricción, el array debía estar compuesto por controles del mismo tipo.

Una característica de los arrays de controles era que el código de los eventos era compartido entre todos los controles. El procedimiento de evento correspondiente, recibía un número que identificaba el control del array que había provocado dicho evento. De esta forma, podíamos tener código común para ejecutar sobre cualquiera de los controles del array, y código particular, sólo para ciertos controles.

El Código fuente 459 muestra el evento Click de un array de controles CommandButton en VB6.

' código VB6 ' ========== Private Sub cmdPulsar_Click(Index As Integer)

' utilizamos una estructura Select Case para comprobar qué ' control ha provocado el evento

Select Case Index Case 0

Programación con Visual Basic .NET © Grupo EIDOS

' código que se ejecutará cuando ' pulsemos el control de la posición 0 ' del array '....

Case 1 ' código que se ejecutará cuando ' pulsemos el control de la posición 1 ' del array '....

'.... End Select

' código general que se ejecutará sobre cualquier control del array '.... '....

End Sub

Código fuente 459

Los arrays de controles no están soportados por VB.NET, ya que existe un medio mucho más potente y flexible de escribir código común para un conjunto de controles: la creación de manejadores de evento comunes.

En versiones anteriores de VB, el nombre del procedimiento que manipulaba un determinado evento

de un control era algo riguroso que no podía ser cambiado. Pero como hemos visto anteriormente, VB.NET supera esta limitación, permitiéndonos dar el nombre

que queramos a un procedimiento manipulador del evento de un control, y asociando dicho procedimiento al evento mediante la palabra clave Handles.

Handles encierra una potencia mayor de la que en un principio pudiera parecer, ya que si disponemos

de un formulario con varios controles, y escribimos un procedimiento manipulador de evento, podemos asociar dicho procedimiento a los eventos de más de un control del formulario al mismo tiempo, basta con escribir a continuación de Handles, los nombres de objeto-evento separados por comas. El resultado será que cada vez que se produzca en esos controles el evento en cuestión, se llamará al mismo procedimiento de evento; y dentro de ese código, deberemos discernir cuál control originó el evento.

Para demostrar cómo enfocar desde VB.NET, el escenario descrito al comienzo de este apartado, que estaba escrito en VB6, crearemos un proyecto con el nombre CompartirEventos (hacer clic aquí para acceder a este ejemplo), y en su formulario, insertaremos tres Button. Ver Figura 256.

El trabajo a desempeñar consiste en que al pulsar cualquiera de los botones, la cadena de caracteres de su propiedad Text sea convertida a mayúscula.

Podríamos hacer doble clic en cada uno de estos controles y realizar dicha operación. Sin embargo, en esta ocasión, escribiremos un único procedimiento manipulador para el evento Click de estos controles, ya que como la acción a realizar es idéntica para todos los controles, ahorraremos una importante cantidad de tiempo y código. Ver el Código fuente 460.

© Grupo EIDOS 30. Codificación avanzada de controles y herencia visual

Figura 256. Formulario con controles que tendrán un manipulador de evento común.

Private Sub Pulsar(ByVal sender As Object, ByVal e As EventArgs) Handles btnUno.Click, btnDos.Click, btnTres.Click

' antes de convertir a mayúsculas, debemos realizar ' un moldeado de tipo con CType() del parámetro que contiene ' el objeto que provocó el evento CType(sender, Button).Text = CType(sender, Button).Text.ToUpper()

End Sub

Código fuente 460

Complicando un poco más la situación, puede ocurrir que para este evento, tengamos que realizar tareas comunes y otras particulares para cada control; por ejemplo, poner a cada botón un color de fondo diferente. Pues no existe problema en ese sentido, ya que el parámetro sender del manipulador

de evento, nos va a informar de cuál de los controles ha sido pulsado. El Código fuente 461 muestra, en ese sentido, una ampliación del código del evento.

Private Sub Pulsar(ByVal sender As Object, ByVal e As EventArgs) Handles btnUno.Click, btnDos.Click, btnTres.Click

' antes de convertir a mayúsculas, debemos realizar ' un moldeado de tipo con CType() del parámetro que contiene ' el objeto que provocó el evento CType(sender, Button).Text = CType(sender, Button).Text.ToUpper() ' comprobar cuál botón ha sido pulsado, ' y en función de esto, dar un color ' distinto a cada control If sender Is Me.btnUno Then

Me.btnUno.BackColor = Color.BurlyWood End If If sender Is Me.btnDos Then

Me.btnDos.BackColor = Color.Cornsilk End If If sender Is Me.btnTres Then

Me.btnTres.BackColor = Color.HotPink End If End Sub

Código fuente 461

Programación con Visual Basic .NET © Grupo EIDOS

La Figura 257 muestra la ejecución del formulario tras estos cambios.

Figura 257. Controles con manipulador de evento Clic único.

No sólo es posible escribir un manipulador de evento para varios controles del mismo tipo, sino que también podemos establecer esta asociación entre controles de distinto tipo, naturalmente, siempre y cuando todos esos controles dispongan de dicho evento común.

En el siguiente ejemplo, EventoVariosCtl (hacer clic aquí para acceder a este ejemplo), creamos un formulario con tres controles de diferente tipo. Seguidamente escribimos en el código de la clase del formulario, un método con el nombre ControlPulsado( ), que asociamos con Handles, al evento Click

de cada uno de estos controles, tal y como muestra el Código fuente 462.

Public Class Form1 Inherits System.Windows.Forms.Form '.... '....

' este procedimiento de evento lo asignamos al evento ' click de distintos tipos de control en el formulario ' mediante la palabra clave Handles Private Sub ControlPulsado(ByVal sender As Object, ByVal e As EventArgs)

Handles btnPulsar.Click, txtNombre.Click, lblNombre.Click ' comprobar sobre cuál control se ha hecho click

' si es el Label, cambiar estilo borde If sender Is Me.lblNombre Then

Me.lblNombre.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D End If

' si es el Button, cerrar el formulario If sender Is Me.btnPulsar Then

Me.Close() End If

' si es el TextBox, cambiar su color If sender Is Me.txtNombre Then

Me.txtNombre.BackColor = Color.LightSeaGreen End If End Sub

End Class

Código fuente 462

© Grupo EIDOS 30. Codificación avanzada de controles y herencia visual

La Figura 258 muestra la aplicación en funcionamiento

Figura 258. Controles diferentes utilizando el mismo manipulador para el evento Click.

En cualquier caso, si el programador necesita arrays de controles en sus programas, puede utilizar cualquiera de los tipos de la plataforma para esta finalidad, desde un array simple, hasta alguno de los diferentes tipos de colección que nos proporciona el entorno de ejecución de .NET Framework.