gsBuscar revisión 1:
No te voy a explicar "todo" lo que hace esta utilidad ni la historia del
porqué existe... eso lo puedes ver en la
página original de esta utilidad de buscar ficheros.
Aquí te contaré los cambios que he hecho.
Pero antes de contarte nada, quiero agradecer a Antonio
Calle por las sugerencias que han hecho que me decida a hacer los cambios y
publicarlos. Gracias.
¿Qué hay de nuevo viejo?
Pues eso, de esta forma te diré las cosas que hay nuevas, con respecto a la
que publiqué el pasado día 29.
En el código que puse para bajar en la versión original ya tenía algunos
cambios "no documentados" como es que al cerrarse el formulario se guardaban los
valores del tamaño y posición del formulario, puede parecer una tontería, pero
así el usuario no se sentirá "frustrado" al ver que cambió el tamaño o posición
de la utilidad y esos valores no se "recuerdan".
Pero los cambios principales son estos:
1- El botón de Buscar ahora es el predeterminado, de esa forma, al pulsar la
tecla INTRO se iniciará la búsqueda.
2- He añadido dos botones nuevos, uno de ellos servirá para abrir el fichero que
esté seleccionado y el otro abrirá la carpeta en la que está ese fichero.
3- Al pulsar (doble clic) en un fichero de la lista, se abrirá el fichero o el
directorio, según se pulse en el nombre del fichero (que está en la primera
columna) o en el nombre del directorio (que está en la segunda columna).
En la figura 1 tienes el aspecto del formulario de la rev. 1 de gsBuscar en
modo de diseño:
Figura 1. Aspecto del formulario en modo de diseño (rev 1)
El primer cambio es bien sencillo, lo único que tenemos que hacer es asignar
a la propiedad AcceptButton del formulario el botón que
queramos que sea el predeterminado, en este caso es el botón de buscar (btnBuscar).
En el botón de Abrir fichero (btnAbrirFic)
lo que hacemos es
llamar al
método Start de la clase Process para que lo
abra con el programa
que tenga
asociado, por ejemplo, si el fichero es de tipo .doc se abrirá con Word o el
programa que tengamos asociado para ese tipo de fichero.
Este es el código del evento Click del botón de
Abrir fichero:
Private Sub btnAbrirFic_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnAbrirFic.Click
With lvFics
If .SelectedIndices.Count = 0 Then
Exit Sub
End If
' Abrir el fichero indicado
' Combinar los paths para que se agregue el separador de directorio
' si así hiciera falta
Dim fic As String = Path.Combine(.SelectedItems(0).SubItems(1).Text, _
.SelectedItems(0).SubItems(0).Text)
Process.Start(fic)
End With
End Sub
De este código solo quiero destacar el uso de Path.Combine
para crear el
nombre del fichero, ya que en la primera columna del ListView
se muestra el
nombre del fichero y en la segunda el directorio, pero ese nombre de directorio
no termina con el símbolo de separación de directorios, (salvo que sea en en el
directorio raíz donde está el fichero), por tanto con el método Combine
de la
clase Path nos aseguramos de que se añadirá ese separador de
directorio si no
está.
El código del botón Abrir directorio (btnAbrirDir)
es como el
que
teníamos antes en el evento DoubleClick del ListView:
Private Sub btnAbrirDir_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnAbrirDir.Click
With lvFics
If .SelectedIndices.Count = 0 Then
Exit Sub
End If
' Abrir la ventana con el directorio del fichero indicado
Dim dir As String = .SelectedItems(0).SubItems(1).Text
Process.Start("explorer.exe", dir)
End With
End Sub
Para poder detectar en que parte del elemento seleccionado del
ListView se ha
hecho doble clic, he tenido que cambiar de evento la detección de esa pulsación,
ya que el evento DoubleClick del ListView no
me dice en qué
columna se ha hecho
esa pulsación.
Así que... para saber en que parte del nombre del fichero
seleccionado se ha pulsado, lo que he hecho es usar el evento
MouseDoubleClick
del ListView, que es "casi" igual que el evento
DoubleClick, pero con la ventaja de que el segundo parámetro del evento
es del tipo MouseEventArgs y en ese parámetro tenemos la
posición del cursor del ratón en el que se ha hecho esa doble pulsación.
Y como la posición del ratón siempre es relativa al control en el que se
comprueba, lo que hago es comprobar si la posición "X" del puntero del ratón es
menor que el ancho de la primera columna, de ser así, quiere decir que estamos
pulsando en la parte que está en esa primera columna (el nombre del fichero), si
no se cumple esa condición quiere decir que estamos pulsando en la parte del
elemento seleccionado que está bajo la segunda columna, por tanto estamos
pulsando en el nombre del directorio.
Puede que parezca una chapuza, pero funciona... y eso es lo que a mi me importa,
je, je.
Aquí tienes el código del evento MouseDoubleClick del
ListView en el que se abre el fichero con el programa que tenga
asociado o se abre la carpeta que lo contiene según donde se pulse:
Private Sub lvFics_MouseDoubleClick(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles lvFics.MouseDoubleClick
With lvFics
If .SelectedIndices.Count = 0 Then
Exit Sub
End If
' Comprobar en que columna se ha hecho doble clic
' El valor de e.X es relativo al control,
' por tanto, no hace falta añadir nada más.
If e.X < .Columns(0).Width Then
' El nombre
' Abrir el fichero indicado
' Combinar los paths para que se agregue el separador de directorio
' si así hiciera falta
Dim fic As String = Path.Combine(.SelectedItems(0).SubItems(1).Text, _
.SelectedItems(0).SubItems(0).Text)
Process.Start(fic)
Else
' El directorio
' Abrir la ventana con el directorio del fichero indicado
Dim dir As String = .SelectedItems(0).SubItems(1).Text
Process.Start("explorer.exe", dir)
End If
End With
End Sub
También he quitado un "refresco" al añadir los elementos al ListView
con idea de que el parpadeo sea menor, pero sigue habiendo parpadeo... no se si
había alguna propiedad del ListView que "aliviaba" ese
parpadeo, pero no he dado con ella.
Lo que si he encontrado es otra propiedad que cambia el elemento por el que
pasa el ratón y se muestra como un link: HotTracking. Asignando
un valor True a esa propiedad conseguimos ese efecto. También
se asigna un valor True a HoverSelection que
debe tener ese valor verdadero cuando la otra propiedad lo tiene.
Si te decides a usar esa característica debes cambiar el código de
MouseDoubleClick al evento MouseClick para que el
usuario no tenga que hacer doble clic para abrir el fichero o el directorio.
Y esto es todo por ahora, lo siguiente que tengo pensado es que se pueda usar
para buscar dentro de los ficheros, que ya tengo ganas de cambiar mi "vieja"
aplicación de VB6 que tengo para hacer esas búsquedas, aunque sabiendo cómo
trata .NET las cadenas, no se si será buena idea... de todas formas, lo
comprobaré a ver que tal.
En cualquier caso, espero que lo que hay hasta ahora te sea de tanta utilidad
como lo es para mi.
Nos vemos.
Guillermo