Matrices de controles para usuarios de Visual Basic 6.0

Actualización: noviembre 2007

Aunque ya no se admiten matrices de controles en Visual Basic 2008, mediante el modelo de eventos puede duplicar y expandir gran parte de la funcionalidad de las matrices de controles.

Diferencias conceptuales

En Visual Basic 6.0, las matrices de controles se podían utilizar para administrar los controles de un formulario; proporcionaban funciones para compartir controladores de eventos, recorrer en iteración grupos de controles y agregar controles en tiempo de ejecución.

En Visual Basic 2008, ya no se admiten las matrices de controles. Los cambios en el modelo de eventos hacen que las matrices de controles sean innecesarias y .NET Framework proporciona las mismas funciones para trabajar con controles.

Compartir controladores de eventos

En Visual Basic 6.0, se podían usar matrices de controles para especificar un grupo de controles que compartían un conjunto de eventos. Los controles debían ser del mismo tipo y tenían que tener el mismo nombre.

Visual Basic 2008 permite que cualquier controlador de eventos controle los eventos de varios controles, incluso los controles con nombres diferentes y de tipos distintos.

Por ejemplo, es posible que quiera agregar dos controles Button (Button1 y Button2) y un control CheckBox (CheckBox1) a un formulario y, a continuación, crear un controlador de eventos a fin de controlar el evento Click para los tres controles.

Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click

Recorrer controles en iteración

Otra característica de matrices de controles de Visual Basic 6.0 era la capacidad de recorrer en iteración un grupo de controles mediante la propiedad Index. Por ejemplo, para borrar el texto de todos los controles TextBox en una matriz de control, se podía recorrer en iteración la matriz de control mediante la propiedad Index como una variable de bucle.

Los controles de Visual Basic 2008 no tienen una propiedad Index, pero puede seguir recorriendo en iteración los controles de un formulario o contenedor utilizando el elemento Control.ControlCollection de la clase Control.

En Visual Basic 6.0, los controles de una única matriz de control podían encontrarse en contenedores diferentes. Por ejemplo, los controles TextBox contenidos en dos controles Frame diferentes podían formar parte de la misma matriz de control.

En Visual Basic 2008, la colección Controls sólo devuelve controles que se encuentran en un único contenedor. Debe recorrer en iteración los controles de cada control de contenedor por separado; esto se puede hacer mediante una función recursiva.

Agregar controles en tiempo de ejecución

En Visual Basic 6.0, los controles se podía agregar a una matriz de control en tiempo de ejecución mediante la instrucción Load. Los controles tenían que ser del mismo tipo que la matriz de control y ésta se debía crear en tiempo de diseño con al menos un elemento. Después de agregar el control, la propiedad Visible debía establecerse en True.

En Visual Basic 2008, los controles se agregan en tiempo de ejecución mediante la palabra clave New de una instrucción Dim y, a continuación, se utiliza el método Add para el contenedor al que desea agregar el control.

Agregar controladores de eventos en tiempo de ejecución

En Visual Basic 6.0, cuando se agregaba un control a una matriz de control en tiempo de ejecución, los eventos de la matriz de control controlaban automáticamente los nuevos eventos de controles.

En Visual Basic 2008, debe definir controladores de eventos para los controles que se agregan en tiempo de ejecución. Esto se realiza mediante la instrucción AddHandler.

Cambios de código para matrices de control

En el código siguiente se muestran las diferencias entre las técnicas de codificación de Visual Basic 6.0 y Visual Basic 2008.

Compartir controladores de eventos

El ejemplo siguiente muestra cómo se comparte el controlador de eventos Change (TextChanged en Visual Basic 2008) en un grupo de tres controles TextBox. En Visual Basic 2008, la cláusula Handles del controlador de eventos especifica qué control controlará el evento. El controlador de eventos devuelve un Object genérico, por lo que se debe convertir en el tipo de objeto específico (en este caso, TextBox) que desea controlar mediante el método DirectCast.

' Visual Basic 6.0

Private Sub Text1_Change(Index As Integer)

Select Case Index

Case 0

MsgBox("The text in the first TextBox has changed")

Case 1

MsgBox("The text in the second TextBox has changed")

Case 2

MsgBox("The text in the third TextBox has changed")

End Select

End Sub

' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
    Select Case DirectCast(sender, TextBox).Name
        Case TextBox1.Name
            MsgBox("The text in the first TextBox has changed")
        Case TextBox2.Name
            MsgBox("The text in the second TextBox has changed")
        Case TextBox3.Name
            MsgBox("The text in the third TextBox has changed")
    End Select
End Sub
Nota:

El comportamiento del evento es ligeramente distinto en Visual Basic 2008. El evento TextChanged se produce cuando se inicializa un control (por ejemplo, en el evento Form_Load) así como cuando se cambia texto en tiempo de ejecución. En Visual Basic 6.0, el evento Change sólo se producía cuando se cambiaba texto.

Recorrer controles en iteración

El ejemplo siguiente muestra una función para recorrer en iteración un grupo de controles de cuadro de texto y borrar su texto. En el ejemplo de Visual Basic 6.0, la propiedad Index de una matriz de control se utiliza como una variable de bucle.

En Visual Basic 2008, un objeto Control se pasa como un argumento; tiene una colección Control.ControlCollection que incluye todos los controles que se encuentran en ese control. El operador Typeof se utiliza para determinar si cada control es de tipo TextBox.

Nota:

Un objeto Form es de tipo Control; también puede pasar un objeto Form como un argumento.

Como no se incluyen controles anidados en la colección Control.ControlCollection, el método HasChildren se utiliza para determinar si un control contiene otros controles, en ese caso, se llama a la función ClearText de forma recursiva.

' Visual Basic 6.0

Private Sub ClearText()

For i = 0 To Text1().UBound

Text1(i).Text = ""

Next

End Sub

' Visual Basic
Private Sub ClearText(ByVal container As Control)
    Dim ctrl As Control
    For Each ctrl In container.Controls
        If TypeOf (ctrl) Is TextBox Then
            ctrl.Text = ""
        End If
        If ctrl.HasChildren Then
             ClearText(ctrl)
        End If
    Next
End Sub

Agregar controles en tiempo de ejecución

El ejemplo siguiente muestra cómo se agrega un control de cuadro de texto a un formulario en tiempo de ejecución. En Visual Basic 6.0, el control se agrega a una matriz de control. En Visual Basic 2008, el control se agrega a la colección Control.ControlCollection. En Visual Basic 6.0, los eventos para el nuevo TextBox se controlaban automáticamente mediante la matriz de control. En Visual Basic 2008, debe enlazar el control de eventos mediante la instrucción AddHandler.

En los dos ejemplos se supone que se agrega un control de cuadro de texto a un formulario en tiempo de ejecución y en el ejemplo de Visual Basic 6.0, que se ha creado una matriz de control con un único elemento. En el ejemplo de Visual Basic 2008 también se supone que existe un controlador de eventos denominado TextChangedHandler para el primer control TextBox.

' Visual Basic 6.0

Private Sub AddControl()

' Add a TextBox as the second element of a control array.

Load Text1(1)

' Set the location below the first TextBox.

Text1(1).Move Text1(0).Left, Text1(0).Top + 500

' Make the new TextBox visible

Text1(1).Visible = True

' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler

Notas de actualización

Cuando una aplicación creada con Visual Basic 6.0 se actualiza a Visual Basic 2008, las matrices de controles se actualizan a clases de matrices de controles específicas de control especiales. Estas clases están contenidas en el espacio de nombres Microsoft.VisualBasic.Compatibility.VB6 y las utilizan las herramientas de actualización para emular el comportamiento de las matrices de controles de Visual Basic 6.0.

Aunque es posible utilizar estas clases de matrices de controles en el nuevo desarrollo de Visual Basic 2008, se recomienda utilizar el modelo de eventos y las funciones de .NET Framework en su lugar.

Vea también

Conceptos

Eventos y control de eventos para usuarios de Visual Basic 6.0

Otros recursos

Controles de formularios Windows Forms para usuarios de Visual Basic 6.0