Crear controles en tiempo de ejecución

usando array de controles (todas las versiones de VB) y creándolos dinámicamente (sólo VB6)

Publicado: 31/May/2001
Actualizado: 31/May/2001


Creía que esto ya estaba... es una pregunta que muchos han preguntado y "daba por echo" de que ya estaba publicado... en fin... con tantas cosas como hay en mi web... hasta a mi se me escapan algunas cosas...

Aquí te voy a explicar cómo crear controles en tiempo de ejecución, es decir añadir nuevos controles al formulario. Las dos formas que existen (al menos si tienes el Visual Basic 6), son:

1.) Creando un array de controles (o una matriz, como prefieras llamarlo), esta es la forma clásica de hacerlo (y la más recomendable para la mayoría de los casos). Lo único que hay que hacer es añadir un control de cada uno de los que queramos "crear" en tiempo de ejecución, y asignarle el valor CERO a la propiedad Index.  Ésto último es importante hacerlo ya que los nuevos controles se manejan mediante un array de controles.

2.) Usando el método Add de la colección Controls. Aunque esto último sólo es posible hacerlo con la versión 6 del Visual Basic. El inconveniente de esta otra forma de crear controles en tiempo de ejecución es que no podemos crear un array de controles (al menos que queramos interceptar los eventos que se produzcan).

En el código de ejemplo que te muestro a continuación veremos cómo usar las dos formas.

Empecemos con la forma válida para todas las versiones de Visual Basic.

Para crear este ejemplo, crea un nuevo proyecto, añade un CommandButton (Command1), una etiqueta (Label1) y un TextBox (Text1), a estos dos últimos controles asignale el valor CERO a la propiedad Index para que tengamos un array de cada uno de estos controles.
Añade el siguiente código:


'------------------------------------------------------------------------------
' Ejemplo de crear array de controles en tiempo de ejecución        (31/May/01)
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit

Private Sub Command1_Click()
    ' Crear un nuevo control Label y un Textbox
    Dim i As Long
    '
    ' Los array de controles son "en el fondo" colecciones de base cero,
    ' el número actual de controles nos dará el índice del siguiente índice
    ' (siempre que se hayan añadido de forma correlativa)
    i = Label1.Count
    ' cargamos el control
    Load Label1(i)
    ' le asignamos la posición, el caption y lo hacemos visible,
    ' ya que por defecto no está visible
    With Label1(i)
        .Top = Label1(i - 1).Top + 390
        .Caption = "Label1(" & i & ")"
        .Visible = True
    End With
    ' idem con los textboxes
    i = Text1.Count
    Load Text1(i)
    With Text1(i)
        .Top = Text1(i - 1).Top + 390
        .Visible = True
    End With
End Sub

Pulsa F5 para ejecutar la aplicación y pulsa en el command1, verás que se añaden dos nuevos controles: una etiqueta y un textbox.

Para eliminar controles creados en tiempo de ejecución, tendrás que usar: Unload Label1(indice), al hacer esto tendrás que tener en cuenta que esos índices "descargados" ya no están en el array de controles...

 

Veamos ahora la forma de crear controles con el método ADD de la colección controls.

Añade una etiqueta (Label1) y un TextBox (Text1) y asignales el valor CERO a la propiedad Index, (no es que sea necesario hacer esto para crear controles dinámicamente, pero se usa Label1(0) y Text1(0) para posicionar los controles añadidos), añade un botón (Command1) y el siguiente código:


'------------------------------------------------------------------------------
' Ejemplo de creación dinámica de controles en tiempo de ejecución  (31/May/01)
' usando Add de la colección controls, sólo VB6
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit

' Para que produzca eventos, haya que declararla con WithEvents
Private WithEvents lblDinamic As Label
Private nlblDinamic As Long
' Un array para contener los TextBoxes dinámicos
' (estos textboxes no producen eventos)
Private txtDinamic() As TextBox
Private ntxtDinamic As Long

Private Sub Command1_Click()
    ' Se pueden añadir cuantas etiquetas queramos,
    ' pero el evento sólo se producirá en la última añadida,
    ' ya que WithEvents no permite crear arrays
    nlblDinamic = nlblDinamic + 1
    Set lblDinamic = Controls.Add("VB.Label", "lblDinamic" & CStr(nlblDinamic))
    With lblDinamic
        .Visible = True
        .Top = nlblDinamic * 390 + Label1(0).Top
        .Left = Label1(0).Left
        .Caption = .Name
        .Height = 255
    End With
    '
    ' Creamos un nuevo TextBox
    ntxtDinamic = ntxtDinamic + 1
    ReDim Preserve txtDinamic(ntxtDinamic)
    Set txtDinamic(ntxtDinamic) = Controls.Add("VB.TextBox", "txtDinamic" & CStr(ntxtDinamic))
    With txtDinamic(ntxtDinamic)
        .Visible = True
        .Top = lblDinamic.Top - 30
        .Left = Text1(0).Left
        .Text = .Name
        .Height = 315
    End With
    
End Sub

Private Sub Form_Load()
    '
    ' Para crear un control (no se pueden crear arrays, creo)
    ' se añade a la colección de controles
    nlblDinamic = 1
    Set lblDinamic = Controls.Add("VB.Label", "lblDinamic")
    With lblDinamic
        .Visible = True
        .Top = Label1(0).Top + 390
        .Left = Label1(0).Left
        .Caption = .Name
        .Height = 255
    End With
    '
    ntxtDinamic = -1
End Sub

Private Sub lblDinamic_Click()
    ' sólo se producirá el evento en la última creada
    lblStatus = "Has pulsado en: " & lblDinamic.Name
End Sub


Como notarás es que hay que usar el "ClassID" del control añadir y un nombre "único" para que cuando queramos podamos eliminarlo de la colección, usando: Controls.Remove "nombre".

Es cuestión de que te leas la ayuda de Visual Basic para otros controles, ya que en algunos de ellos necesitas indicar la "licencia" para poder usarlo.

Espero que te sea de utilidad, aunque haya sido algo breve.

Nos vemos.
Guillermo


ir al índice