Página 1 de 1

Duda con Carpetas, Input y While()

Publicado: 18 May 2010, 20:52
por Juanchi
Hola a todos...
Bueno empezamos...
La duda con las carpetas es: Como hago para detectar cuando se ejecuta esa carpeta ?... Seria solamente con WinExists ?.
_______________________________________________________________________________
La duda sobre los input es si se puede leer solo una parte, pongo un ejemplo: si en un input se escribe "C:\WINDOS\System 32" y yo solo quiero leer despues de la segunda "\" (System 32) como se puede hacer eso ?
_______________________________________________________________________________
Lo del While es como puedo hacer que cuando hay un Form creado (que usa, ahi donde se define lo que hacen los botones) como puedo usar otro While y seguir usando los botones.
Lo que me pasa es que si unso un while los botones dejan de funcionar.

Salu2! y gracias :smt003 :smt003 :smt003

Re: Duda con Carpetas, Input y While()

Publicado: 19 May 2010, 09:07
por Ximorro
Siendo 3 preguntas bien diferenciadas quizás habría sido mejor ponerlas en diferentes entradas, eso ayudaría a otros usuarios cuando busquen el mismo problema. Bueno, vamos allá:

a) ¿Ejecutar una carpeta? Las carpetas no se ejecutan exactamente, quizás te refieras a saber si está abierta en un explorador de Windows. En ese caso se puede hacer buscando la lista de ventanas de explorador (ventanas de clase ExploreWClass, al menos en mi XP) y mirando por ejemplo en la barra de título qué carpeta tiene cada una...
Para obtener la lista de ventanas de esa clase se usa WinList(("[CLASS:ExploreWClass]"), junto a los manejadores de ventana esta función te da los títulos así que los puedes mirar directamente.

Pero si por ejecutar te refieres a cualquier momento en el que un programa abre la carpeta para ver sus archivos la cosa es bastante más difícil. Seguramente a través del sistema de archivos se puede averiguar qué archivos están abiertos y por quién, pero me temo que no sé cómo se hace, habría que buscar por la MSDN porque seguro que eso se hace a base de llamadas a las API de Windows...

b) Parece que quieres extraer el último nombre de carpeta, con lo que la pregunta no es buscar la segunda barra ¡si no la última!. Si es así hay que especificar bien las cosas porque buscar la segunda es mucho más fácil que la última, pues no sabemos cuántas hay y hay que buscarlas todas.
La cosa es buscar esa barra y tomar lo que hay de string a partir de esa posición por ejemplo con StringRight, o quizás con StringMid.
Para buscar la barra yo lo haría con StringInStr , el caso es que me suena haber leído que en la nueva versión de AutoIT se puede empezar a buscar por el final. Si es ese el caso simplemente busca el primero por la derecha y con esa posición cortas el string original.
Si estoy equivocado y no se puede buscar por el final es más complicado, tienes que ir haciendo búsquedas sucesivas hasta que no encuentres más, cada búsqueda se inicia desde la posición de la última. Cuando no se encuentran más la encontrada en la búsqueda anterior es la última barra... Si tienes que hacerlo así y te hace falta ayuda lo dices.

Probablemente también se puede hacer con expresiones regulares...

Hum, mirando la ayuda me acabo de encontrar con la función _PathSplit en file.au3, quizás sirva para lo que quieres, este ejemplo te mostrará "carpeta3":

Código: Seleccionar todo

#include <file.au3>
Global $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit("C:\carpeta1\carpeta2\carpeta3", $szDrive, $szDir, $szFName, $szExt)
MsgBox(0, "Última carpeta", $szFName)
Lo que hago es mostrar el nombre de archivo encontrado en el path, aunque en este caso sea una carpeta.

c)
No puedes, no exactamente eso. O estás en un while o en el otro, pero tienes dos opciones:
1) Usar el mismo while que el que comprueba los eventos, dentro de ese while tienes un switch (o un select) que mira lo que te ha dado GuiGetMsg, pues pon tu código después del EndSwitch pero dentro del while.
2) Usar otra manera de ver los eventos que no requiere que estés mirándolos directamente dentro de un while. Se activa con Opt("GUIOnEventMode", 1), después hay que asignar a cada control o evento general una función que se activará cuando se active dicho control o evento (con GUICtrlSetOnEvent y GUISetOnEvent, respectivamente).
De esta manera cuando se produzca uno de esos eventos la ejecución normal del programa es interrumpida donde esté y salta instantáneamente a la función asignada, cuando acaba dicha función reanuda el programa donde lo había dejado.

Espero que todo esto te sirva de algo, ve probando y si tienes problemas haz consultas más concretas (¡si es con código de ejemplo mejor!)

Saludooooos

Re: Duda con Carpetas, Input y While()

Publicado: 20 May 2010, 17:28
por Juanchi
Muchas gracias Ximorro... Siempre me ayudas :smt003

1)No sabia como se decia, por eso puse ejecutar.

2)Si, quiero que el programa lea desde la ultima barra en adelante...
:smt003

Gracias :smt003 :smt003

Re: Duda con Carpetas, Input y While()

Publicado: 21 May 2010, 08:38
por Ximorro
De nada, espero que te ponga por el buen camino ;-)

Una cosa, efectivamente he encontrado que StringInStr puede buscar por el final, ¡incluso en la versión 3.3.0! Ya decía yo que lo había leído por algún lado :smt005

En el cuarto parámetro, donde dices qué ocurrencia buscar, si usas valores negativos cuenta desde el final, así que si ahí pones un -1, buscará la primera DESDE EL FINAL hacia la izquierda, con lo que te dirá dónde está la última barra.

Así es mucho más fácil.

talueeeec