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 SubPulsa 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