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.


 

Ir al índice principal del Guille