Colección Controls para usuarios de Visual Basic 6.0
Actualización: noviembre 2007
La colección Controls de Visual Basic 6.0 se ha reemplazado por la clase Control.ControlCollection en Visual Basic 2008.
Diferencias conceptuales
En Visual Basic 6.0, la colección Controls es una colección cuyos elementos representan los controles de un formulario o de un control contenedor.
En Visual Basic 2008, la clase Control.ControlCollection reemplaza a la colección Controls. Los formularios tienen una clase Control.ControlCollection predeterminada, a la que se puede tener acceso por medio de la sintaxis Me.Controls.
Add (Método)
En Visual Basic 6.0, el método Add de la colección Controls se enlaza en tiempo de ejecución; en el método Add, los controles se crean al especificar la clase Control como un argumento.
En Visual Basic 2008, el método Add de la clase Control.ControlCollection requiere que los controles se creen usando la palabra clave New antes de que se agreguen a la colección.
Remove (Método)
El método Remove de la colección Controls de Visual Basic 6.0 únicamente se puede usar en los controles que se agreguen mediante el método Add; la clase Control.ControlCollection de Visual Basic 2008 no presenta esta restricción.
Timer and Menu (Controles)
En Visual Basic 6.0, los controles Timer y Menu son miembros de la colección Controls. En Visual Basic 2008, estos controles se han reemplazado por los componentes Timer y MainMenu o ContextMenu; los componentes no son miembros de la clase Control.ControlCollection.
Controles contenedores
La colección Controls de Visual Basic 6.0 incluye controles que se derivan de un control contenedor (por ejemplo, los controles situados en un control Frame); la clase Control.ControlCollection de Visual Basic 2008 no los incluye. Para recorrer en iteración todos los controles de un formulario, debe recorrer en iteración de forma recursiva la clase Controls de cada control contenedor.
Cambios de código para la colección Controls
Los siguientes ejemplos muestran las diferencias en las técnicas de codificación entre Visual Basic 6.0 y Visual Basic 2008.
El código se modifica para agregar y eliminar controles
El código siguiente ilustra las diferencias que existen entre la colección Controls de Visual Basic 6.0 y la clase Control.ControlCollection de Visual Basic 2008.
' Visual Basic 6.0
Private Sub Command1_Click()
' Declare a new Control variable.
Dim c As Control
' Create and add the new control.
Set c = Controls.Add("VB.TextBox", "Text1")
' Make the new control visible.
c.Visible = True
' Set the initial text.
c.Text = "Hello"
' Retrieve the text from the new TextBox.
If Controls.Count > 1 Then
MsgBox (Controls("Text1").Text)
End If
' Remove the new control.
Controls.Remove (Text1)
' The following line causes a compilation error.
' You cannot remove controls added at design time.
Controls.Remove (Command1)
End Sub
' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Create a new TextBox control.
Dim TextBox1 As New System.Windows.Forms.TextBox
TextBox1.Name = "TextBox1"
' Add the new control to the form's Controls collection.
Me.Controls.Add(TextBox1)
' No need to set Visible property.
' Set the initial text.
TextBox1.Text = "Hello"
' Retrieve the text from the new TextBox.
If Me.Controls.Count > 1 Then
MsgBox(Me.Controls("TextBox1").Text)
End If
' Remove the new control.
Me.Controls.Remove(TextBox1)
' Remove the control added at design time.
Me.Controls.Remove(Button1)
End Sub
El código se modifica para recorrer en iteración la colección de controles
El código siguiente ilustra una función diseñada para recorrer en iteración todos los controles de un formulario y para borrar, a continuación, todos los controles CheckBox. Este ejemplo presupone que los controles CheckBox están situados en los controles GroupBox o Panel en lugar de en el formulario. En el ejemplo de Visual Basic 2008, como la colección Controls del formulario únicamente incluye controles que están situados directamente en el formulario, la función se llama de forma recursiva a sí misma para cualquier control con controles secundarios.
' Visual Basic 6.0
Private Sub ClearChecks()
For Each Control in Me.Controls
If TypeOf Control Is CheckBox Then
Control.Value = vbUnchecked
End If
Next
End Sub
' Visual Basic
Private Sub ClearChecks(ByVal Container As Control)
Dim ctl As Control
Dim chk As CheckBox
For Each ctl In Container.Controls
If TypeOf ctl Is CheckBox Then
chk = ctl
chk.Checked = False
End If
' Recursively call this function for any container controls.
If ctl.HasChildren Then
ClearChecks(ctl)
End If
Next
End Sub
Notas de actualización
Debido a las diferencias que existen entre Visual Basic 6.0 y las colecciones Controls de Visual Basic 2008, no se actualizan las llamadas al método Add. Debe agregar código para recrear el comportamiento de la aplicación mediante el nuevo método Add.