Explorador de windows en VB

maria
07 de Febrero del 2005
Hola a todos,
necesito poder seleccionar varios archivos a la vez, o sea, algo similar al explorador de windows, pero nos se si se puede hacer un common dialog, o tengo que hacerlo con un treeview. Y si es con un treeview, ¿hay alguna forma sencilla de que coja por defecto la estructura de directorios, o hay que manejar el treeview por codigo?

muchas gracias, un saludo

gucesoft
07 de Febrero del 2005
Creo que con un CommonDialog no puedes hacer selecciones multiples. Lo mas sencillo es que combines el control DirListBox con un FileListBox, este ultimo te permitira la seleccion multiple si estableces su propiedad MultiSelect al valor (2-Extended).
El control DirListBox te permitira seleccionar carpetas. Para mostrar el contenido de la carpeta seleccionada en el FileListBox utiliza su evento Change combinado con las propiedades Path de ambos controles...
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub

Utiliza un control CommandButton y su evento Click para indicar que la seleccion esta hecha. Para obtener los nombres de los archivos seleccionados, no tienes mas que recorrer la lista de elementos del FileListBox, obteniendo solo los que su propiedad Selected sea verdadera...

Private Sub Command1_Click()
Dim i As Long
dim vListaArchivos as variant

Label1.Caption = ""
For i = 0 To File1.ListCount - 1
If File1.Selected(i) Then
vListaArchivos = ListaArchivos & File1.List(i) & "#"
End If
Next

End Sub

En el ejemplo utilizo una variable que recoge los nombres de los archivos seleccionados separados por el caracter #, la declaro como variant para prevenir el error que ocurriria si la declarara cadena y la longitud de la misma superara los 255 caracteres, al seleccionar muchos archivos.

Espero que te sea de ayuda.

en?
07 de Febrero del 2005
maria y gucesoft, el CommonDialog sí permite la selección múltiple.
Esta se consigue con la constante «cdlOFNAllowMultiselect» para la propiedad «Flags» del control.
La propiedad «FileName» te devolverá un String con los nombres de los ficheros seleccionados, separados por un espacio en blanco (el primer elemento es la ruta).

Podrías hacer:

Dim Ficheros() As String
Dim Fichero As Variant

...
Ficheros = Split(CommonDialog1.FileName)
For Each Fichero In Ficheros
List1.AddItem Fichero
Next
...


Pero tiene un feo inconveniente, y es que utiliza la regla 8+3 para rutas y ficheros, y además la interfaz es penosa.

Puedes probarlo si te interesa, lo único que deberías agregarle la función de la API de Windows «GetLongPathName» para convertir las rutas devueltas en formato corto.

Yo me construiría un Explorador de ficheros personalizado, tal como te comenta 'gucesoft', para mí es la mejor opción.

__
Un saludo.