|
Curso básico
de programación en Visual Basic
Lección
14
Solución,
listbox y arrays
|
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.
|
Estos eran los ejercicios:
1.- Modifica el ejemplo para que en
lugar de guardar los ficheros hallados en un listbox, lo haga en un
array.
2.- Una vez hecho esto, añade al listbox todos los ficheros
hallados... mejor dicho, para que no hagas trampas, añade al
listbox el contenido del array, es decir todos y cada uno de los
ficheros previamente asignados.
3.- Añade otro botón al form y al pulsar en él, que guarde en un
fichero, (por ejemplo: hallados.txt), todos los ficheros hallados,
es decir los que estén en el array.
Vamos a ver la solución al primero
de los ejercicios de las dos formas que propuse, es decir usando un
número fijo de ficheros y uno variable.
En el caso del número fijo, he
asignado un valor de 50, como ese valor está en una constante,
sólo tendrás que cambiar el valor de la constante para cambiar el
número de ficheros, veamos el listado:
Private Sub Command1_Click()
Dim sTmp As String
Const MaxFicheros = 50
Dim sFicheros(1 To MaxFicheros) As String
Dim nFic As Integer
On Local Error Resume Next
sTmp = Dir$(Text1.Text)
nFic = 0
If Err = 0 Then
Do While Len(sTmp) 'Repetir mientras haya ficheros
'sólo asignarlo si tenemos espacio reservado
If nFic < MaxFicheros Then
nFic = nFic + 1
'Lo añadimos al array
sFicheros(nFic) = sTmp
End If
sTmp = Dir$ 'Asignar el siguiente fichero
Loop
End If
Err = 0
End Sub
Usando un número variable de
ficheros.
En esta ocasión usaremos el Redim Preserve para hacer hueco en el
array que guardará los nombres de los archivos.
Private Sub Command1_Click()
Dim sTmp As String
Dim sFicheros() As String
Dim nFic As Integer
On Local Error Resume Next
sTmp = Dir$(Text1.Text)
nFic = 0
If Err = 0 Then
Do While Len(sTmp) 'Repetir mientras haya ficheros
nFic = nFic + 1
'Adecuar el tamaño del array a los ficheros leidos
ReDim Preserve sFicheros(nFic)
'Lo añadimos al array
sFicheros(nFic) = sTmp
sTmp = Dir$ 'Asignar el siguiente fichero
Loop
End If
Err = 0
End Sub
En el segundo ejercicio, hay que
guardar el contenido del array, en este caso, el array debe estar
declarado a nivel de módulo, ya que un array declarado dentro de un
procedimiento es local a ese procedimiento y por tanto no estará
disponible fuera de el.
Si no lo haces así cada uno de los arrays que uses (y dimensiones)
en cada SUB será sólo visible en ese procedimiento...
Por tanto el Dim sFicheros() As String debes
ponerlo en la parte de las declaraciones del form.
Este código deberás agregarlo después de asignar todos los
ficheros al array, justo después del Loop, para que esté dentro
del IF que comprueba que no se haya producido error..
Dim i As Integer
'Guardar el contenido del array
Open "prueba.txt" For Output As 1
For i = 1 To nFic
Print #1, sFicheros(i)
Next
Close 1
Fijate que no he usado el Freefile
para "buscar" un canal libre. En lugar de eso he usado el
número 1. Te lo digo por dos razones, la primera es para que no lo
confundas con la letra L minúscula y la segunda es para que sepas
que se pueden usar constantes, aunque no te lo recomiendo, pero como
en este caso, se con toda seguridad de que mi aplicación no tiene
abierto ningún otro fichero, puedo permitirme el lujo de hacerlo
así, de forma directa.
El tercer ejercicio, no debería
tener mayor problema, todo lo que hay que hacer es un bucle que
asigne al listbox cada uno de los ficheros del array:
'Borrar el contenido del listbox
List1.Clear
'Agregarle cada uno de los ficheros del array
For i = 1 To nFic
List1.AddItem sFicheros(i)
Next
Este código añadelo justo después
de guardar los datos en el disco, aunque también puedes ponerlo
después, siempre que esté después del Loop, cualquier sitio es
bueno.
Fijate que a pesar de que selecciones
distintos tipos de ficheros, sin cerrar el programa, por supuesto,
estos no se incrementan en la lista, no sólo por el List1.Clear,
sino porque al hacer Redim Preserve el número de elementos del
array se adapta al valor de nFic y este valor empieza siempre por
cero, así que siempre se tendrá en el array el número correcto de
ficheros.
La asignación que hago para ponerlo a cero, no es necesaria, ya que
cuando se dimensiona una varible numérica, ésta variable contiene
inicialmente un valor cero.
Pero imaginate que no haces esa asignación o que quieres asegurarte
que el contenido del array se "libere" antes de empezar a
asignarle datos... para ello tendrías que usar: ERASE sFicheros,
con esta instrucción borramos el contenido del array. En el caso de
que el número de elementos del array fuese fijo, a lo que se llama
un array estático, simplemente se borraría el contenido del array,
pero seguiría existiendo el array con las 50
"dimensiones" creadas. Si, por el contrario, el array es
dinámico, es decir que podemos cambiar el tamaño del mismo, lo que
hacemos es "eliminarlo" de la memoria, por tanto
necesitaremos dimensionarlo (o REdimensionarlo) para poder usarlo
nuevamente.
Bueno, ahora a esperar a la siguiente
entrega... hasta entonces... un saludo.
|