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 SubUsando 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 SubEn 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 1Fijate 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) NextEste 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.