Você está na página 1de 11

Creando Controles en Tiempo de

Ejecucin
Por John Smiley
Saba usted que es posible crear controles en tiempo de ejecucin?
Es cierto. Si lo desea, puede aadir controles adicionales a su formulario en tiempo
de ejecucin. Esta capacidad le da a su programa de Visual Basic una gran
flexibilidad, permitiendo que usted controle la apariencia de su Formulario en
tiempo de ejecucin, no solamente en lo que se refiere a la colocacin de los
controles, sino tambin al tipo y nmero de controles que aparecern sobre el
Formulario.
Muchos programadores de Visual Basic saben que es posible crear controles en
tiempo de ejecucin creando primero una Matriz de Controles, y despus ir
aadiendo miembros adicionales a la Matriz de Controles durante el tiempo de
ejecucin por medio de la instruccin Load. Este es el primer mtodo que se va a
examinar en este artculo. Adems, le voy a ensear como crear controles en
tiempo de ejecucin partiendo desde cero, sin la necesidad de crear una Matriz de
Controles.

Mtodo 1 - Usar una Matriz de Controles para crear nuevos


controles
Para crear un control en tiempo de ejecucin usando este mtodo, debe usted
primero crear una Matriz de Controles para el control que usted quiere crear
dinmicamente. En otras palabras, si usted quiere crear controles CheckBox en
tiempo de ejecucin, primero debe crear una Matriz de Controles del tipo CheckBox.
Para aquellos que no estn familiarizados con el tema, una Matriz de Controles es
una coleccin de controles sobre un Formulario, todos tienen el mismo nombre,
pero poseen valores nicos en su propiedad Index. Es posible crear una Matriz de
Controles que posea un solo miembro. Y eso es lo que vamos a hacer ahora.
Empezar por colocar una CheckBox y un botn sobre un Formulario.

1 de 11

En el botn Command1 ir colocando cdigo para crear dinmicamente, en tiempo


de ejecucin, un control CheckBox sobre el Formulario. Hablar ms sobre este
tema un poco ms adelante. Primero, necesito decirle al Visual Basic que esa
CheckBox es un miembro de una Matriz de Controles, y para ello basta con cambiar
su propiedad Index, que por defecto est en blanco, por un nmero. En este caso
por un 0.

Una vez que la propiedad Index se ha establecido a 0, esa CheckBox ser un


miembro de la Matriz de Controles CheckBox denominada Check1, lo cual hace que
la creacin de una nueva CheckBox en tiempo de ejecucin sea muy fcil.
Todo lo que necesitamos hacer es decirle al Visual Basic que queremos crear una
nueva CheckBox, utilizando para ello la CheckBox ya existente como patrn. Eso lo
hacemos ejecutando la instruccin Load de Visual Basic en el Procedimiento del
Evento Click del botn Command1, de esta forma:
Private Sub Command1_Click()
Load Check1(1)
Check1(1).Caption = "New Checkbox"
End Sub
La instruccin Load
Load Check1(1)
le dice al Visual Basic que cree un nuevo miembro Check1 en la Matriz CheckBox, y
que lo cree con su propiedad Index puesta a 1.

2 de 11

Esta instruccin
Check1(1).Caption = "New Checkbox"
da a la CheckBox, cuya propiedad Index es igual a 1, un nombre especfico que
permitir diferenciarla de la CheckBox original que se cre en tiempo de diseo.
Si ahora ejecutamos el programa, y a continuacin hacemos un clic sobre el botn
Command1, veremos esta ventana:

Uffff. Algo anda mal.


Lo que yo an no he dicho, es que cuando usted crea un control en tiempo de
ejecucin, por defecto, la propiedad Visible del nuevo control est puesta a False.
Para ver el nuevo control necesitamos poner explcitamente su propiedad Visible en
True. Vamos a modificar el cdigo del procedimiento del Evento Click para que
quede como sigue...
Private Sub Command1_Click()
Load Check1(1)
Check1(1).Caption = "New Checkbox"
Check1(1).Visible = True
End Sub

Ahora vamos a ejecutar el programa de nuevo, y haremos un clic sobre el botn


Command1 una vez ms....

3 de 11

Algo sigue estando mal sigue habiendo una sola CheckBox!


El problema es este: Cuando se crea un control nuevo, las propiedades del nuevo
control son idnticas a las propiedades del control patrn utilizado para crearlo,
con la excepcin de la propiedad Index, que es la que nosotros hemos definido en
la instruccin Load, y la propiedad Visible que, como hemos visto, es inicializada al
valor de False. La nueva CheckBox s est sobre el Formulario, lo que pasa es que
est situada justo debajo del primer control, ya que sus propiedades Top, Left,
Height y Width son idnticas.
Todo lo que necesitamos hacer para ver el nuevo control es moverlo fuera del
primer control, y eso lo podemos hacer aadiendo una nueva lnea de cdigo en el
procedimiento del Evento Click, que cambie la propiedad Top del nuevo control.
Como sta...
Private Sub Command1_Click()
Load Check1(1)
Check1(1).Caption = "New Checkbox"
Check1(1).Visible = True
Check1(1).Top = Check1(0).Top + Check1(0).Height
End Sub
Esta lnea de cdigo
Check1(1).Top = Check1(0).Top + Check1(0).Height
Le dice al Visual Basic que tome el valor actual de la porpiedad Top del CheckBox
ya existente y le aada el valor de la propiedad Height (recuerde que el primer
control tiene un 0 en la propiedad Index. El resultado de esta suma es el valor de la
propiedad Top para el nuevo control, que es justamente la parte inferior del primer
control.

4 de 11

Si ahora ejecutamos el programa, y hacemos un clic sobre el boton Command1,


veremos la siguiente ventana

Funciona como por arte de magia!


Debo decir tambin que si usted quiere dar al usuario la impresin de que estamos
creando controles totalmente desde cero, podemos situar el control patron en el
Formulario y despus poner su propiedad Visible a False. De esta forma, en tiempo
de ejecucin, los controles se van creando, dando la impresin de que aparecen
desde la nada.
Dando un repaso, he aqu un sumario de los pasos necesarios para crear un nuevo
control utilizando el mtodo de la Matriz de Controles.
1. Crear una matriz del tipo de control que usted desee crear en tiempo de
ejecucin. Si usted quiere crear una TextBox en tiempo de ejecucin, cree una
matriz de controles Textbox. Si quiere crear un Command Button, cree una
matriz de controles Command Button. Recuerde, para crear una matriz de
controles, todo lo que necesita es cambiar la propiedad Index del control a
algo distinto al valor por defecto de vaco.
2. Utilizar la instruccin Load, con la propiedad Index a un valor nico para crear
el nuevo control.
3. Cambiar la propiedad Visible del nuevo control a True, a fin de hacerlo visible.
4. Cambiar las propiedades de sus coordenadas (Left o Top) para sacar el nuevo
control de su posicin original.

5 de 11

Mtodo 2 Crear controles desde cero utilizando la


Coleccin Controls
Hay un segundo mtodo para crear controles en tiempo de ejecucin, y es usando
el Mtodo Add de la coleccin Controls. Est mtodo es mas fcil de usar que el
mtodo de la Matriz de Controles, pero ms difcil de entender, ya que requiere
estar familiarizado con la Coleccin Controls del Visual Basic.
Para abreviar, cada control que se coloca sobre un Formulario, tanto si se hace en
tiempo de diseo como si se hace en tiempo de ejecucin, es un miembro de la
Coleccin intrnseca de Visual Basic, llamada Controls Collection (Coleccin de
Controles). Para aquellos que no estn familiarizados con las Colecciones de Visual
Basic, una Coleccin es similar a una matriz unidimensional. Cada control del
Formulario tiene una referencia asignada en la coleccin Controls cuando se le sita
en tiempo de diseo. De la misma forma, un control que se coloque en tiempo de
ejecucin tambin tendr una referencia asignada en la coleccin Controls.
Tambin es posible crear un control en tiempo de ejecucin, aadiendo una
referencia a un control directamente en la coleccin Controls. Hacindolo as se
evita el tener que crear primero un control patrn sobre el Formulario en tiempo
de diseo. La razn por la cual se puede hacer esto es que Visual Basic tiene
patrones para todos los controles, en el Visual Basic Global Object (Objeto Global
de Visual Basic), denominado VB.
Ser suficiente decir que todo lo que se requiere para crear un control en tiempo de
ejecucin, usando este mtodo, es ejecutar cuatro lneas de cdigo, de esta
forma...
Private Sub Command1_Click()
Dim ctlName As Control
Set ctlName = Form1.Controls.Add("VB.TextBox", "Text1", Form1)
ctlName.Visible = True
ctlName.Top = Check1(0).Top + Check1(0).Height
End Sub
Esta lnea de cdigo
Dim ctlName As Control
Declara algo conocido como una Variable Objeto, que no es ms que una variable
que contiene, como valor, la referencia a un Objeto (en este caso una TextBox).
Usted puede declarar una variable Objeto como un tipo de control especfico (como
una TextBox) o elegir declararla del tipo ms genrico de Control, que es lo que
vamos a hacer aqu.

6 de 11

Esta lnea de cdigo


Set ctlName = Form1.Controls.Add("VB.TextBox", "Text1", Form1)
Le dice al Visual Basic que aada un control TextBox, llamado Text1, a la Coleccin
de Controles del Form1, y que utilice la Variable Objeto ctlname para que apunte
a dicho control. Una vez que el control se ha aadido a la Coleccin de Controles,
en cualquier parte en que queramos hacer una referencia al mismo, deberemos
hacerlo por medio del nombre de la Variable Objeto. Por esa razn, cuando
pongamos la propiedad Visible de la nueva TextBox a True, y ajustemos su
propiedad Top, usaremos el nombre de la Variable Objeto.
ctlName.Visible = True
ctlName.Top = Check1(0).Top + Check1(0).Height

7 de 11

Ms sobre el Mtodo Add.


El Mtodo Add tiene tres argumentos, el primero es el nombre del patrn para el
control que est usted creando, el segundo es el nombre del control que figurar en
la Coleccin de Controles, y el tercer argumento es el control contenedor del
nuevo control (generalmente ser el Formulario, pero podra ser un control Frame
si es que usted quiere que se coloque dentro de un Frame que est sobre el
Formulario).
El control TextBox se llama TetxBox, el control Command Button es llamado
CommandButton. Si usted abre el Examinador de Objetos del Visual Basic (Ver ->
Examinador de Objetos, desde la barra de mens del Visual Basic).

y selecciona VB en la ListBox de las libreras....

8 de 11

en la ventana Classes podr ver los nombres de los controles que usted puede
crear en tiempo de ejecucin...

9 de 11

Si ahora ejecutamos el programa, y hacemos un clic sobre el botn Command1,


veremos la siguiente ventana...

Como podr ver, el nuevo control TextBox ha sido colocado sobre el Formulario.

Sumario
La posibilidad de aadir controles a un formulario, en tiempo de ejecucin, puede
producir Formularios increblemente dinmicos.

10 de 11

Notas del Traductor


Todo los comentarios que siguen hacen referencia a la creacin de nuevas
instancias de controles empleando el Mtodo 2 expuesto ms arriba.
Si bien es cierto que a la hora de crear la Variable de Objeto para el nuevo Control,
se puede utilizar como tipo genrico la palabra Control, es preferible utilizar en esa
definicin el Tipo de control que queramos crear, por ejemplo una TextBox.
La lnea de cdigo quedara as...
Dim ctlName as TextBox
Esta declaracin es mejor hacerla a nivel de Formulario, por la razn que expongo a
continuacin, adems de que vamos a aadirle algo que nos va a proporcionar un
control ms efectivo sobre el Control que vamos a crear.
Lo ms normal es que no nos baste con crear el Control, sino que queramos
disponer de los Eventos que le sean propios, segn el tipo de Control a crear. Para
ello modificaremos la lnea de cdigo anterior para que quede as...
Dim WithEvents ctlName as TextBox
Al hacer esta declaracin a nivel de Formulario, el nombre de nuestro futuro nuevo
Control aparecer en la lista desplegable del Formulario donde estn relacionados
los nombres de los Controles que hayamos ido colocando sobre dicho Formulario,
como si fuera uno ms de ellos.
Si ahora seleccionamos en esa lista el nombre de nuestro nuevo Control, podremos
desplegar la ventana de Eventos y all veremos todos los Eventos que podremos
interceptar, segn el tipo de Control a crear.
Ahora ya podemos seguir con la creacin del nuevo Control, escribiendo las
correspondientes lneas de cdigo en el Evento Load del Formulario, tal y como
queda explicado en el texto del autor (con la salvedad de usar el Evento Load del
Formulario en vez de utilizar el Evento Click de un botn), o sea....
Private Sub Form_Load()
Set ctlName = Form1.Controls.Add("VB.TextBox", "Text1", Form1)
ctlName.Visible = True
ctlName.Top = Check1(0).Top + Check1(0).Height
End Sub
Se pueden definir tantos nuevos Controles como se desee, que si se sigue el
procedimiento expuesto, tendremos a nuestra disposicin todos los Eventos
relacionados con dichos Controles.

11 de 11

Você também pode gostar