Crear una clase derivada de un control

Crear una clase derivada de un control

De igual modo que creamos los formularios heredando de la clase Form, podemos crear clases que hereden de las clases pertenecientes a los controles Windows, adaptando el comportamiento del control a nuestras necesidades particulares, a través de la sobrecarga y sobre-escritura de los miembros existentes, o bien por la creación de nuevos métodos y propiedades.

Supongamos como ejemplo que necesitamos un control TextBox, enfocado fundamentalmente a mostrar números. A pesar de ello, nos debe permitir la escritura en él de otro tipo de caracteres, pero en ese caso, necesitamos que el control nos avise cuando su contenido no sea numérico. Por otro lado, no debe permitir la asignación de caracteres mediante su propiedad Text.

Crearemos pues un proyecto con el nombre ClaseControl (hacer clic aquí para acceder a este ejemplo). Además del formulario por defecto, agregaremos al proyecto una nueva clase, a la que daremos el nombre TextNumeros, y en ella codificaremos el comportamiento de nuestra propia versión del TextBox. El Código fuente 475 muestra esta clase.

Public Class TextNumeros Inherits TextBox

' declaramos un evento para poder generarlo ' cuando se asigne un valor al control que ' no sea numérico Public Event AsignacionNoNum(ByVal sender As system.Object, ByVal e As

EventArgs)

Public Sub New() ' en el constructor dar un color al control Me.BackColor = Color.PaleGreen

End Sub

' implementamos nuestra propia versión ' de la propiedad Text Public Overloads Overrides Property Text() As String

Get Return MyBase.Text End Get Set(ByVal Value As String)

' eludimos la asignación por código

Programación con Visual Basic .NET © Grupo EIDOS

' de texto al control en el bloque Set del Property End Set End Property

' en este procedimiento de evento detectamos que ' cuando el contenido del control cambie... Private Sub TextNumeros_TextChanged(ByVal sender As Object, ByVal e As

System.EventArgs) Handles MyBase.TextChanged

' ...si el valor actual del control no es numérico, ' lanzar el evento If Not IsNumeric(Me.Text) Then

RaiseEvent AsignacionNoNum(Me, New EventArgs()) End If

End Sub End Class

Código fuente 475

A continuación pasaremos al formulario del proyecto, y en el código del mismo, declararemos a nivel

de clase una variable del tipo correspondiente a nuestro control. Seguidamente, insertaremos un control Button para crear en tiempo de ejecución una instancia de nuestro control y mostrarlo en el formulario; al crear nuestro control, conectaremos con AddHandler, su evento AsignacionNoNum con un procedimiento del formulario que actúe como manipulador.

Finalmente, y para demostrar cómo no podemos asignar por código, valores a la propiedad Text del control, añadiremos otro botón adicional. Veamos todo ello en el Código fuente 476.

Public Class Form1 Inherits System.Windows.Forms.Form

Private txtNum As TextNumeros '.... '.... Private Sub btnCrear_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles btnCrear.Click ' creamos un objeto de nuestra clase control Me.txtNum = New TextNumeros() Me.txtNum.Location = New Point(60, 50) Me.txtNum.Name = "txtNum" Me.txtNum.Size = New Size(100, 40) Me.txtNum.TabIndex = 1

' asociamos el evento que hemos creado en el control ' con un procedimiento manejador de evento escrito ' en esta clase AddHandler txtNum.AsignacionNoNum, AddressOf ValorIncorrecto

' añadimos el control a la colección ' de controles del formulario Me.Controls.Add(Me.txtNum)

End Sub

' procedimiento manipulador del evento AsignacionNoNum de nuestro ' control; aquí mostramos un mensaje informativo cuando ' escribamos un valor que no sea numérico Private Sub ValorIncorrecto(ByVal sender As System.Object, ByVal e As

System.EventArgs)

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

MessageBox.Show("En este control sólo se deben introducir números", "Atención")

End Sub

' al pulsar este botón intentamos asignar una cadena en la ' propiedad Text de nuestro control, pero debido al comportamiento ' programado en el control, no podremos realizar esta asignación Private Sub btnAsignar_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles btnAsignar.Click

Me.txtNum.Text = "PRUEBA"

End Sub End Class

Código fuente 476

El formulario en ejecución, con nuestro control propio ya creado, lo muestra la Figura 263.

Figura 263. Formulario con un control heredado de TextBox.