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