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.