|
Curso básico
de programación en Visual Basic
Lección
38
Las
colecciones
|
Realizamos
programas para la gestión de empresas. Empresas medianas y
pequeñas. Programas de contabilidad, cartera de pedidos
clientes proveedores, facturación control de albaranes,
tesorería cartera de cobros y pagos y estadísticas.
Nuestro
agradecimiento a todos los que por unas causas o por otras
visitan nuestra web. Gestión de empresas PYMES. Curso de
programación de Visual Basic.
|
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)
'
' ©Guillermo 'guille' Som, 2003
'---------------------------------------------------------------------------
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 = "guille@costasol.net"
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

|