Introducción:
Desde la primera versión de Visual Studio .NET, el entorno integrado (IDE)
nos permite crear herencia visual por medio de la creación de un proyecto de
tipo Librería de clases (ensamblado DLL) que expone como clase uno o más
formularios, esos formularios después los podemos usar en otros proyectos,
de forma que toda la funcionalidad que tengan las "heredemos" en el nuevo
proyecto aprovechando una de las características de la programación
orientada a objetos: la herencia, pero aplicada a los formularios, que en el
fondo también son clases.
Dos formas de usar formularios heredados
Para usar la herencia de formularios, podemos hacerlo de dos formas
distintas:
1- Creando una librería de clases con los formularios que queramos usar como
base de otros formularios.
2- Creando los formularios base en un proyecto y después indicar que se usen
esos formularios como base de otros.
En el primer caso, tendremos que crear un proyecto del tipo Windows Forms
y compilarlo como una DLL, es decir, cambiando el tipo de proyecto de
Windows Application (aplicación para Windows) a Biblioteca de clases (Class
Library), ya que es un requisito que el tipo de ensamblado sea DLL.
En el segundo caso no hay que hacer nada especial, simplemente crear
formularios que después usaremos como base de otros formularios y no es
necesario que ese proyecto sea una DLL.
Crear un proyecto con formularios heredados
Para ver cómo podemos crear y usar los formularios heredados, vamos a
crear un proyecto de prueba, este proyecto lo puedes crear tanto en Visual
Studio 2005 como en Visual Studio .NET 2003, aunque yo voy a usar el Visual
Studio 2005 y las capturas serán de esa versión, pero los pasos comentados
son válidos para cualquier versión de Visual Studio para .NET.
Nota:
En las versiones express de Visual Basic 2005 y Visual C# 2005 también se
pueden crear este tipo de formularios heredados, pero no hay un "tipo" de
fichero de esta clase que lance el asistente, por tanto, habrá que indicar
de forma manual el formulario que va a heredar de otro.
- Crea un nuevo proyecto de tipo aplicación de Windows con el nombre
HerenciaVisual2005.
- En mi caso, crearé dos proyectos, el de Visual Basic se llamará
HerenciaVisual2005_vb y el de Visual C# se llamará
HerenciaVisual2005_cs.
- Si estás usando el Visual Studio .NET 2003, cambia 2005 por
2003.
- Se creará un formulario llamado Form1, cámbiale el nombre a
FormBase.
- En Visual Studio .NET 2003 tendrás que cambiar manualmente el
nombre.
- Agrega una etiqueta y dos botones (déjale los nombres que le asigna
el diseñador).
- Los dos botones posiciónalos en la parte de abajo a la derecha y
"ánclalos" abajo y a la derecha.
- La etiqueta estará en la parte superior, en la versión 2005 tendrás
que asignarle la propiedad AutoSize a False, de forma que tenga un
tamaño fijo, que será todo el ancho del formulario. Asígnale un alto de
16. También debes anclarlo, pero para que se fije a todo el ancho del
formulario y en la parte superior.
- El aspecto del formulario en modo de diseño es el mostrado en la
figura 1.
- Compila el proyecto, ya que uno de los requisitos es que el
ensamblado esté creado para poder usar la herencia visual.
Figura 1. El formulario base en modo de diseño
Nota:
En Visual Studio .NET 2003 seguramente te dará un error en los proyectos de
Visual Basic indicando que no existe el método Sub Main, pero si seleccionas
el error, puedes indicar el "objeto" de inicio para que sea el formulario
FormBase.
- Vamos a agregar un formulario, pero el tipo será
Formulario Heredado (Inherited Form).
- Recuerda que en las versiones Express ese tipo de formulario no
existe. Después te explico cómo crear este tipo de formularios con
las versiones Express.
- Indica el nombre del formulario, que será Form1 (es decir, el nombre
que indicará el Visual Studio).
- Al pulsar en Aceptar, te mostrará un cuadro de diálogo para que
elijas el formulario en el que te quieres basar, si no has añadido más
formularios, te mostrará el formulario FormBase, tal como puedes ver en
la figura 2.
- Si no te muestra nada, tendrás un aviso indicando que el
proyecto debe estar compilado, por tanto, pulsa en cancelar hasta
que desaparezcan las pantallas y compila el proyecto y vuelve al
paso 8.
Figura 2. Asistente de formulario heredado
- Una vez creado el formulario, éste mostrará los controles
que tiene FormBase con unos candados, tal como puedes ver en la figura
3.
Figura 3. El formulario derivado de FormBase
Acceder a los controles heredados
- El problema es que si intentas cambiar las propiedades de
cualquiera de esos tres controles o quieres añadir eventos a los dos
botones, no te lo permitirá. Y no lo permite, porque esos controles "son
privado" del formulario base, por tanto no podremos escribir código que
interactúe con ellos.
- Para poder usar y personalizar esos controles, tendremos que modificar
"la visibilidad" de los mismos.
- En el caso de Visual Basic, la visibilidad (propiedad Modifiers)
será Friend, mientras que en C#, será private.
- Para cambiar la visibilidad de los dos botones, muestra el formulario
base (FormBase) y selecciona los dos botones, y en la ventana de propiedades
cambia la propiedad Modifiers de forma que el valor sea
Protected, tal como
te muestro en la figura 4.
- Después de hacer ese cambio, seguramente verás una advertencia
indicando de que el proyecto se debe compilar para que esos cambios
surtan efecto.
Figura 4. Cambiar la visibilidad de los controles a Protected
- Una vez compilado el proyecto, verás que al mostrar el
formulario Form1 y seleccionar cualquiera de los botones, en la ventana
de propiedades se verán los valores de forma que se puedan modificar,
salvo unas cuantas de las propiedades que solo se pueden cambiar en el
formulario (o clase) base.
- Ahora puedes hacer doble clic en cualquiera de los botones y se mostrará
el código del evento Click. También puedes cambiar el texto mostrado o
cualquiera de las otras propiedades del botón.
Añadir propiedades al formulario base
- Tal como tenemos actualmente el código, no podemos
cambiar la etiqueta Label1 del formulario base.
- Una solución sería definirla como Protected, pero como seguramente
lo único que necesitaremos hacer con esa etiqueta es cambiarle el texto,
vamos a agregar una propiedad al formulario base para que nos permita
cambiar el texto de la etiqueta.
- Muestra el código del formulario FormBase y añade el siguiente
código al principio del mismo:
- En C# no hará falta que lo añadas, ya que esa importación ya
estará.
Para Visual Basic:
Imports System.ComponentModel
Para C#:
using System.ComponentModel;
- Esta importación nos permitirá usar atributos para
aplicar a las propiedades del formulario base, de forma que se muestre
la descripción de las propiedades en la ventana de propiedades y para
que se muestren esas propiedades.
- Añade el siguiente código en la clase FormBase.
Para Visual Basic:
<Description("Texto de la etiqueta superior"), Browsable(True)> _
Public Property TextoEtiqueta() As String
Get
Return Me.Label1.Text
End Get
Set(ByVal value As String)
Me.Label1.Text = value
End Set
End Property
Para C#:
[Description("Texto de la etiqueta superior"), Browsable(true)]
public string TextoEtiqueta
{
get
{
return this.label1.Text;
}
set
{
this.label1.Text = value;
}
}
- Este código mostrará una propiedad en el formulario
derivado, y al asignarle un valor veremos que se cambia el texto de la
etiqueta. Por supuesto, para que esa propiedad se muestre en la ventana
de propiedades de Form1, (ver la figura 5), antes debes compilar el
proyecto.
Figura 5. La propiedad de FormBase en las propiedades de Form1
- Como seguramente te imaginarás, el atributo Description
sirve para indicar el texto que se mostrará en el panel inferior de la
ventana de propiedades, y el atributo Browsable con un valor verdadero
indica que queremos que la propiedad se muestre en la ventana de
propiedades.
- En realidad no hace falta indicar Browsable(True), ya que ese es
el valor predeterminado, pero de esa forma queda "constancia" de que
nuestra intención es hacer que se muestre la propiedad en la ventana
de propiedades.
- También hay que tener en cuenta que en realidad, al indicar un valor
verdadero al atributo Browsable, lo que hacemos es asignar el valor
BrowsableAttribute.Yes, mientras que al asignar un valor falso, el valor
asignado es BrowsableAttribute.No.
Crear formularios heredados con las versiones Express
- Como te dije antes, en Visual Basic 2005 Express y en
Visual C# 2005 Express no existe la plantilla para los formularios
heredados, por tanto, debemos crearlos de forma manual.
- Si sigues los pasos anteriores, en el paso 8 tendrás que añadir un
formulario normal.
- En Visual Basic, abre el fichero Form1.Designer.vb y cambia el
código que hay en Inherits por el que te muestro abajo.
- En Visual Basic, para ver ese fichero tendrás que pulsar en el
botón "Mostrar todos los archivos" (Show All Files), que está en la
ventana del Explorador de Soluciones, y es el segundo botón.
Inherits FormBase
- En C# muestra el código de Form1 y cambia la declaración
del formulario para que sea esta:
public partial class Form1 : FormBase
- De esta forma, al mostrar el formulario Form1,
verás que se usa el formulario base.
- El resto de pasos (desde el paso 11) son los mismos, tanto para Visual
Studio "normal" (cualquiera de las versiones) como para las versiones
Express.
Y esto es todo, más abajo tienes los proyectos de prueba,
hay 3 ficheros ZIP en total, uno de ellos es para Visual Studio .NET 2003,
otro para la versión normal de Visual Studio 2005 y el otro ZIPl incluye los
proyectos para Visual Basic 2005 Express y Visual C# 2005 Express, que
aunque estén en el mismo fichero, tendrás que abrir cada uno con la versión
Express correspondiente.
Espero que te sea de utilidad y en muestra de agradecimiento... espero
que sepas lo que tienes que hacer, je, je.
Nos vemos.
Guillermo
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms
System.ComponentModel