Curso Básico de Programación
en Visual Basic
Soluciones
de la entrega Catorce.
Fecha: 7/Mar/98
![]()
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.
![]()