A Toda Máquina Con Herencia Visual .NET
|
Introducción
Cuando decidí escribir este artículo acerca de Herencia Visual .NET, estaba trabajando una aplicación en la cual utilice gran parte herencia de formularios, y fue con el propósito en dar a conocer una forma más practica en simplificar horas de trabajo en el diseño de formularios y porque no decirlo en la escritura de código.
Si no me falla la memoria en la versión empresarial de Microsoft Visual Basic 6.0, Microsoft presento en los complementos de esta herramienta una forma de reutilizar los formularios a partir de diseños personalizados por el desarrollador o por plantillas que la misma herramienta traía consigo. De tal forma que podíamos reutilizar formularios y código sin afectar el original y los mismos podíamos convertirlos en plantillas de diseño. Aunque este tipo de implementación esta muy lejos de ser el concepto de Herencia Visual .NET, proporciono en su época los mecanismos para que esta misma fuese implementada en versiones futuras de Visual Studio y totalmente mejorada hasta llegar a lo que hoy en día conocemos como Herencia Visual de Formularios Windows.
Este artículo esta orientado a lo que es Herencia Visual .NET, como trabaja, como se comportan los formularios heredados con respecto a los formularios bases, como se comportan los métodos y/o eventos en su ejecución y en como estos elementos pueden ejecutar código desde una clase base a una clase derivada.
Qué es la Herencia Visual de Formularios
La Herencia Visual de Formularios podría definirse como el duplicado de un formulario a partir de otro, denominado original o formulario base o clase base, de otra forma dicha, podría también ser definido como una clase derivada de formulario por una clase base de formulario. El formulario base o clase base, seria de donde se deriva el formulario heredado o clase heredada a la cual se le denomina clase derivada. Por lo tanto el formulario base hereda sus características de la clase base System.Windows.Forms.Form, mientras que el formulario derivado, sus características son heredadas directamente del formulario base.
A continuación muestro un ejemplo de lo anteriormente expuesto:
La figura 1.0 Muestra la clase base.
La figura 2.0 Muestra la clase derivada.
Recordemos que los formularios en VB.NET no son mas que una clase que pueden heredar un nuevo formulario a partir de técnicas estándares de herencia visual. Por lo tanto unas de las funcionalidades de la herencia visual es por ejemplo que a partir de un formulario base se puede representar un tamaño estandar de objetos, como lo son botones, cajas de texto y otros controles contenido dentro del mismo. Por el cual cualquier formulario derivado de esa base, tendrá las misma formas de controles y tamaños y posición.
Herencia Visual en Microsoft Visual Basic .NET
Los diseñadores de formularios Windows soportan herencia de formularios. En el diseñador, aparece un el menú de proyectos la opción herencia de formularios. Se ejecuta esta opción y a continuación se visualiza una pantalla el cual solicita el nombre del nuevo formulario heredado. A continuación muestro el menú para ejecutar la opción :
La figura 3.0 Muestra la opción que permite crear un formulario heredado.
La figura 4.0 Muestra las plantilla para herencia de formularios.
Todos los eventos manejados que se especifican en el formulario base, automáticamente trabajan de la misma forma que en los formularios heredados. Por ejemplo, si un botón en un formulario base especifica un evento manejado, dicha de otra forma esta programado. En el formulario heredado los botones llaman a los eventos manejados de la clase base. Por lo tanto, si se agrega un evento manejado en la clase heredada para un componente en la clase base, ambos eventos son ejecutados, con la diferencia que el evento de la clase base se dispara primero, seguido del evento manejado de la clase heredada.
Otro comportamiento interesante es que los eventos manejados del formulario base pueden sobrescribirse, sin embargo para poder cumplir esto, será necesario utilizar la palabra reservada Overridable en la definición de los eventos manejados de la clase base y entonces se crea un nuevo método en la clase heredada con la misma lista de parámetros.
No se debe utilizar la palabra reservada Handles en los métodos sobrescritos en los formularios heredados. Por lo tanto si se quiere llamar a eventos manejados de un formulario base dentro de un método Overridden se requiere utilizar el objeto MyBase para acceder al formulario base.
Hay que recordar también que la herencia de formularios no es una operación en línea. Por ejemplo, si se actualiza el formulario base con el objetivo en reemplazar objetos, se tendrá que ejecutar el depurador con el propósito de actualizar todos los formularios heredados que provienen del formulario base modificado, dicho de otra forma, recompilar la aplicación nuevamente. Tomando en cuenta que el formulario heredado tiene que estar cerrado.
Por último, las propiedades de los formularios heredados pueden ser programados y personalizados como las de cualquier otro formulario, todo es que la propiedad Modifiers de los controles del formulario base sea cambiada a Protected la cual seria el alcance que tendrían las propiedades del formulario base. Modifiers predeterminadamente se encuentra como Friend el cual especifica que su alcance es solo para la clase base.
Implementando una solución con Visual Basic .NET
A continuación muestro un ejemplo muy sencillo utilizando herencia visual de formularios. Los siguientes requisitos serán necesarios:
- Microsoft Visual Basic .NET 2003
- Microsoft SQL Server 2000
- Microsoft Windows XP o superior
- Computador Pentium o superior
- Memória RAM 128 o superior
- Monitor VGA de ‘’15 o superior
A continuación muestro el siguiente formulario el cual estará definido como el formulario base de la aplicación, así como el código dentro del mismo:
Const SQL_INFOCONNECTION As String = _Protected
"Server=localhost;" & _
"DataBase=Northwind;" & _
"Integrated Security=SSPI"
Protected Connect As Boolean = False Protected connectionString As String = SQL_INFOCONNECTIONProtected
Function GetDataSource() As DataSetStatic ConnectionString As String = SQL_INFOCONNECTION Static Connect As Boolean = False '--Crear instancia al formulario del status de conexión. Dim frmStatusMessage As New frmStatus '--Primera vez que se conecta. If Not Connect Then'--Mensaje al usuario de intento de conexión.frmStatusMessage.Show("Conectando con el servidor de datos...")
End If
'--Inicializar el intento de conexión para entrar al ciclo. Dim IsConnecting As Boolean = True While IsConnecting Try'--Inicializar conexión a la base de datos. Dim cnNorthwind As New SqlConnection(ConnectionString) '--Ejecutar adaptador con la tabla productos. Dim da As New SqlDataAdapter( _
"SELECT ProductID, ProductName, UnitPrice, UnitsInStock " & _
"FROM products", cnNorthwind)
Dim dsProducts As New DataSet '--Inicializar y llenar dataset.dsProducts.Clear()
da.Fill(dsProducts, "Products")
IsConnecting =
FalseConnect =
TruefrmStatusMessage.Close()
'--Retornar conjunto de datos a su destino. Return dsProducts Catch exc As Exception'--Cerrar formulario
frmStatusMessage.Close()
'--Enviar mensaje al usuario.System.Windows.Forms.MessageBox.Show(exc.Message, "Herencia Visual .NET", _
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
End Try End While '--Cerrar formulario.frmStatusMessage.Close()
End Function Private Sub btnCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCerrar.Click'--Cerrar el form y terminar la aplicación. Me.Close() End End Sub
En el código anterior se crea una función que permite crear conexión con la base de datos de SQL Server 2000 y la cual enviara el conjunto de datos a un control enlazado. El clic del botón cerrar cierra cualquier formulario heredado, ya que primeramente se ejecuta el método clic del formulario base y luego el método clic del formulario heredado.
A continuación se muestra el formulario heredado en tiempo de diseño, así como su código :
With Me.grdProductos'--Inicializar grid y crear estilos.
End With '--Aplicar estilos al grid. Dim dgTableStyle1 As New DataGridTableStyle With dgTableStyle1.CaptionText = "Lista de productos desglosada"
.DataSource = GetDataSource().Tables(0)
New Font("Tahoma", 8.0!, FontStyle.Bold).AlternatingBackColor = Color.Red
.BackColor = Color.WhiteSmoke
.ForeColor = Color.MidnightBlue
.GridLineColor = Color.Gainsboro
.GridLineStyle = System.Windows.Forms.DataGridLineStyle.None
.HeaderBackColor = Color.MidnightBlue
.HeaderFont =
.HeaderForeColor = Color.WhiteSmoke
.LinkColor = Color.Teal
.MappingName = "Products"
.SelectionBackColor = Color.CadetBlue
.SelectionForeColor = Color.WhiteSmoke
End With Dim grdColStyle1 As New DataGridTextBoxColumn With grdColStyle1End With Dim grdColStyle2 As New DataGridTextBoxColumn With grdColStyle2.HeaderText = "ID. Producto"
.MappingName = "ProductID"
.Width = 50
End With Dim grdColStyle3 As New DataGridTextBoxColumn With grdColStyle3.HeaderText = "Descripción"
.MappingName = "ProductName"
.Width = 225
End With Dim grdColStyle4 As New DataGridTextBoxColumn With grdColStyle4.HeaderText = "Precio"
.MappingName = "UnitPrice"
.Width = 70
End With.HeaderText = "Cantidad en almacen"
.MappingName = "UnitsInStock"
.Width = 70
dgTableStyle1.GridColumnStyles.AddRange _
(
New DataGridColumnStyle() _{grdColStyle1, grdColStyle2, grdColStyle3, grdColStyle4})
Me.grdProductos.TableStyles.Add(dgTableStyle1)El código anterior tiene dos objetivos. El primero es pasar el conjunto de resultados al grid, dicha información viene desde la función diseñada del formulario base. Esta función esta declarada como Protected la cual permite un alcance único a clases derivadas de su propia clase base. La segunda parte es estilizar el grid con colores y formas más vistosas.
Como se puede apreciar, hay código dentro del formulario base que es ejecutado y hay código dentro del formulario heredado. La diferencia de ambos radica, que el código del formulario base puede ser utilizado en sus clases derivadas en este caso en el formulario heredado con la función que retorna el conjunto de resultados. En el formulario heredado hay código que solamente puede ser ejecutado en el mismo, no en clases derivadas. Ya que el formulario heredado es una clase derivada.
Para finalizar muestro el formulario heredado en tiempo de ejecución:
Conclusiones
La herencia visual .NET es un camino más en el perfeccionamiento para el desarrollo de aplicaciones Windows. Pues con algunas cuantas líneas de código es posible obtener una aplicación robusta, escalable, ágil que posea las mismas características visuales del resto de formularios utilizados. Minimizando de esta manera el tratamiento y desarrollo de formularios y controles para la misma.
Cada aplicación bien desarrollada es sinónimo de solución. Y cada solución es sinónimo de satisfacción.
Giovanni Cuadra.
Fichero con el código de ejemplo: gcuadra_HerenciaVisualNET2003.zip - Tamaño 65 KB