Curso Básico de Programación
en Visual Basic

 

Entrega Treinta y ocho: 01/Jun/2001
por Guillermo "guille" Som

Si quieres linkar con las otras entregas, desde el índice lo puedes hacer

 

Espero que la entrega anterior no te "desclasificara" y te dieran ganas de dejar esto de la programación... Se supone que sigues interesándote esto de programar con el Visual Basic, sino, no estarías aquí... Así que, sigue con la mente abierta e intenta asimilar todo esto, ya que, sólo es el principio... dentro de poco se complicará más.

En esta entrega vamos a ver un objeto del Visual Basic que nos permitirá agrupar otros objetos, me refiero al objeto Collection.
Con ese objeto podremos crear colecciones de clases, (o de cualquier tipo de dato que queramos, incluso datos de diferente tipo mezclados).

¿Qué es una colección de clases?
Para simplificarlo, te diré que una colección es casi como un array. Las colecciones las usaremos cuando necesitemos almacenar varios objetos individuales, para poder acceder a cualquiera de ellos cuando lo necesitemos.
En el ejemplo de la entrega anterior, si quisiéramos tener los datos de varios colegas, podríamos usar una colección, aunque también podríamos hacerlo con un array. La ventaja que tiene una colección frente a un array es que no tenemos que preocuparnos de redimensionarla cada vez que queramos añadir un nuevo objeto a dicha colección. Las colecciones se adaptan de forma automática a la cantidad de datos que contenga dicha colección.

¿Un ejemplo?
Sí, creo que es lo mejor, ya que así lo comprenderás mejor.
Y para que veas la diferencia, vamos a ver también un ejemplo usando un array.

Crea un nuevo proyecto de tipo EXE, se añade un formulario, asígnale a la propiedad Name el nombre fEntrega38.
Añade cuatro etiquetas, a la última cámbiale el nombre y haz que se llame lblInfo.
Añade tres cajas de texto, formando un array: Text1(0), Text1(1) y Text1(2).
Añade tres commandButtons con estos nombres: cmdAsignar, cmdMostrar y cmdMostrarArray y con los siguientes captions: Asignar, Mostrar y Mostrar array.
Por último añade un ListBox, deja el nombre por defecto (List1)

Nota:
Para crear el array de tres TextBoxes, añade un TextBox, asígnale 0 (cero) a la propiedad Index. Cópialo y pégalo, cuando te pregunte si quieres crear un array, dile que si. Vuelve a pegar de nuevo para tener tres cajas de textos.

Añade la clase cColega que se usó en la entrega anterior: Proyecto/Añadir módulo de clase... y selecciona en la solapa "existente" el módulo de clase cColega.cls

Este es el aspecto del formulario en tiempo de diseño:

Añade el siguiente código y pulsa F5 para probarlo. Después te explico un poco...
Escribe varios datos y pulsa en Añadir. Para mostrar los datos, pulsa en el botón Mostrar o en el botón Mostrar Array.


'------------------------------------------------------------------------------
' Entrega 38 (colecciones)                                          (01/Jun/01)
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit
' Colección para almacenar los datos de los colegas
Private mColegas As Collection
' Array para almacenar los datos de los colegas
Private maColegas() As cColega
Private Sub cmdAsignar_Click()
    ' Dimensionamos una variable del tipo del objeto (clase)
    Dim oColega As cColega
    ' Creamos un nuevo objeto y lo asignamos a la variable
    Set oColega = New cColega
    '
    ' Detectamos los errores que se produzcan
    On Error Resume Next
    '
    ' Asignamos a la propiedad Nombre el contenido de Text1(0)
    oColega.Nombre = Text1(0).Text
    ' Asignamos a la propiedad email el contenido de Text1(1)
    oColega.email = Text1(1).Text
    ' Si se produce un error
    If Err Then
        ' Mostrar el mensaje de aviso
        MsgBox "Se ha producido un error en: " & Err.Source & vbCrLf & Err.Description
        ' Posicionar el cursor en la caja de textos del email
        Text1(1).SetFocus
        ' Limpiamos el error
        Err = 0
        ' Salimos de este procedimiento
        Exit Sub
    End If
    '
    ' Asignamos la fecha de nacimiento
    oColega.FechaNacimiento = Text1(2).Text
    If Err Then
        ' Mostrar el mensaje de aviso
        MsgBox Err.Number & ", se ha producido un error en: " & Err.Source & vbCrLf & Err.Description
        ' Posicionar el cursor en la caja de textos del email
        Text1(2).SetFocus
        ' Limpiamos el error
        Err = 0
        ' Salimos de este procedimiento
        Exit Sub
    End If
    '
    ' Añadimos el colega a la colección
    ' (no se comprueba que ya exista ese dato en la colección)
    mColegas.Add oColega
    ' Mostrar el número de colegas que hay en la colección
    lblInfo.Caption = "Hay " & mColegas.Count & " colegas en la colección"
    '
    ' Para añadirlo en el array, debemos saber cuantos datos hay
    ' para poder crear un nuevo elemento en el array y añadirlo
    Dim i As Long
    ' Averiguamos cuantos datos hay (el cero no lo tenemos en cuenta)
    i = UBound(maColegas)
    ' incrementamos el número en uno
    i = i + 1
    ' redimensionamos el array para poder almacenar los datos del nuevo colega
    ' (usamos Preserve para mantener los datos anteriores)
    ReDim Preserve maColegas(i)
    ' Añadimos el nuevo colega al array
    ' (como asignamos un objeto, hay que usar Set)
    Set maColegas(i) = oColega
End Sub

Private Sub cmdMostrar_Click()
    ' Mostrar el contenido de la colección en el List1
    '
    ' una variable temporal para acceder a cada uno de los colegas
    Dim oColega As cColega
    '
    List1.Clear
    ' Recorremos todos los colegas que haya en la colección
    For Each oColega In mColegas
        List1.AddItem oColega.Nombre & " - " & oColega.FechaNacimiento
    Next
    '
'    ' También se puede hacer de esta otra forma:
'    Dim i As Long
'    '
'    For i = 1 To mColegas.Count
'        List1.AddItem mColegas(i).Nombre & " - " & mColegas(i).FechaNacimiento
'    Next
End Sub

Private Sub cmdMostrarArray_Click()
    ' Mostrar el contenido del array en el List1
    '
    Dim i As Long
    '
    List1.Clear
    ' Recorremos todos los colegas que haya en el array
    ' (el índice cero no lo tenemos en cuenta)
    For i = 1 To UBound(maColegas)
        List1.AddItem maColegas(i).Nombre & " - " & maColegas(i).FechaNacimiento
    Next
End Sub

Private Sub Form_Load()
    ' Datos de prueba
    Text1(0).Text = "Guillermo"
    Text1(1).Text = "[email protected]"
    Text1(2).Text = "7.6.57"
    '
    ' Creamos el objeto colección
    Set mColegas = New Collection
    '
    lblInfo = ""
    '
    ' Creamos un array vacio
    ReDim maColegas(0)
End Sub

Private Sub Text1_GotFocus(Index As Integer)
    ' Seleccionar el texto al entrar
    With Text1(Index)
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

La explicación:
Básicamente el código es parecido en la entrega anterior, lo único que ahora hacemos es añadir cada dato de los colegas al array y después, pulsando en Mostrar o en Mostrar Array, se mostrarán los datos en el ListBox.

Veamos cada cosa por separado, en primer lugar te explicaré lo de la colección.

Private mColegas As Collection
Esta línea crea una variable del tipo Collection.

En el Form_Load se crea el objeto (¿recuerdas que no basta con declarar las variables?)
Set mColegas = New Collection

Para añadir nuevos elementos a la colección se usa el método Add
mColegas.Add oColega

Ahora que sabemos cómo añadir datos a la colección, vamos a ver cómo mostrar los datos de esa colección.
Podemos hacerlo de dos formas, una de la forma clásica, recorriendo cada uno de los elementos de la colección mediante un bucle FOR con una variable índice, para saber cuantos elementos hay en la colección usamos la propiedad Count:
For i = 1 To mColegas.Count

Para acceder a cada uno de los elementos de la colección, sabiendo el índice, usaremos la propiedad Item, ésta al ser la propiedad por defecto, no es necesario especificarla:
mColegas(i).Nombre
Sería lo mismo que:
mColegas.Item(i).Nombre

La otra forma de recorrer todos los elementos de una colección es usando FOR EACH, para ello necesitamos un objeto del tipo contenido en la colección, para que devuelva el contenido de cada uno de los elementos:
For Each oColega In mColegas

Para mostrar los datos de cada uno de los elementos, haremos esto:
oColega.Nombre
Ya que en cada iteración del bucle, se devuelve uno de los objetos contenidos en la colección.

Ahora veamos la explicación para almacenar los datos de los colegas en un array:

Empezamos por declarar un array del tipo cColega, ya que lo que queremos almacenar en dicho array son datos del tipo cColega, (en el caso de la colección, no era necesario, ya que el tipo Collection puede almacenar cualquier tipo de datos, siempre usa el tipo Variant y un Variant, como ya deberías saber, permite contener cualquier tipo de objeto):
Private maColegas() As cColega

Iniciamos el array con cero elementos (realmente uno, pero de índice cero):
ReDim maColegas(0)

Cuando asignamos un nuevo colega, tenemos que ampliar el array para que pueda almacenar el nuevo dato, para ello tenemos que saber cuantos elementos tiene el array, incrementarlo en uno y redimensionar el array para que pueda contenerlo, pero sin que pierda los datos que ya tuviera:
i = UBound(maColegas)
' incrementamos el número en uno
i = i + 1
' redimensionamos el array para poder almacenar los datos del nuevo colega
' (usamos Preserve para mantener los datos anteriores)
ReDim Preserve maColegas(i)

Por último asignamos al nuevo elemento el dato en cuestión:
Set maColegas(i) = oColega
Hay que usar SET porque lo que estamos asignando es un objeto, no un valor.

Para recorrer los elementos del array, tenemos que usar el sistema clásico, es decir hacer un bucle FOR con una variable índice que recorra todos los elementos del array, (el elemento cero no lo tenemos en cuenta):
For i = 1 To UBound(maColegas)

Para mostrar cada uno de los datos, lo haremos de la siguiente forma:
maColegas(i).Nombre

Fíjate que la forma de mostrar los datos de un array es casi igual que cuando se usaba FOR i = en el ejemplo de la colección.

Como habrás notado, es más fácil usar el objeto Collection que manejar un array, entre otras cosas, porque no tenemos que preocuparnos de redimensionar nada ni de saber cuantos elementos tiene ni nada de eso... (siempre y cuando usemos FOR EACH)

El objeto Collection no sólo sirve para almacenar objetos, también se puede usar para almacenar datos "normales" como Integer, Strings, etc.

Otra de las ventajas del objeto Collection es cuando queremos eliminar un dato:
mColegas.Remove Index
Simplemente se le indica que índice queremos eliminar y ya está.
Esto mismo sería un poco más complicado con un array.
Si no te lo crees, prueba a eliminar el elemento número x del array, (la solución te la daré en la próxima entrega).

Además de lo visto, con las colecciones podemos impedir que se añadan elementos que ya existan, para ello se puede indicar una Clave junto con el elemento que se añade, (un ejemplo lo tendremos en la próxima entrega):
mColegas.Add Objeto, Clave

E incluso en que posición queremos añadirlo: Antes o detrás de un elemento dado:
mColegas.Add Objeto, Clave, AntesDe, DespuesDe

Por ejemplo, si queremos añadir un objeto después del tercer elemento:
mColegas.Add oColega, , 3

Te recomiendo que hagas tus propias pruebas y así verás cómo funciona.

Y esto es todo por ahora.
En la próxima entrega veremos cómo crear nuestra propias colecciones a las que podremos añadir opciones de guardar los datos en el disco, poder recuperarlos y cualquier cosa que se nos ocurra... la cuestión será añadir los métodos que necesitemos... así que, estate pendiente y paciencia...

Nos vemos
Guillermo


 
entrega anterior ir al índice siguiente entrega

Ir al índice principal del Guille