ejecutar programas desde GUICtrlCreateList

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

ejecutar programas desde GUICtrlCreateList

Mensaje por adrianodj »

hola amigos
tengo una duda: quiero ejecutar unas aplicaciones que las tengo en una carpeta del ordenador
tengo creado un GUICtrlCreateEdit y quiero que en el GUICtrlCreateEdit me salga la lista de las programas que tengo en la carpeta y haciendo doble clik o pulsar el boton Ejecutar que se inicie
el codigo es el siguiente

Código: Seleccionar todo

#include <GUIConstants.au3>
#Include <GuiEdit.au3>
$GUI = GUICreate ("Run Output", 400, 200)
$Btn_Run = GUICtrlCreateButton ("Run Program", 300, 0, 100, 27)
$txt_edit = GUICtrlCreateEdit ("", 0, 0, 300, 200)
GUISetState (@SW_SHOW)

While 1
    $msg = GUIGetMsg ()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
        Case $msg = $Btn_Run

    EndSelect
WEnd

Func _RunFile ($file)

EndFunc
si me podeis echar una mano os agradesco mucho
gracias
Última edición por adrianodj el 26 May 2011, 15:21, editado 3 veces en total.
Avatar de Usuario
ms999
Hacker del Foro
Mensajes: 116
Registrado: 26 Ene 2011, 06:13

Re: ejecutar programas desde GUICtrlCreateInput

Mensaje por ms999 »

no veo el input en el code.. pero igualmente lo que necesitas es un combo aca te dejo el ejemplo de combobox de la ayuda editado por mi para que veas que luego con GuiCtrlRead() lees el elemento que seleccionaste de ahi

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

Example()

Func Example()

	GUICreate("My GUI combo")  ; will create a dialog box that when displayed is centered

	$combo = GUICtrlCreateCombo("item1", 10, 10) ; create first item
	GUICtrlSetData(-1, "item2|item3", "item3") ; add other item snd set a new default
	$button = Guictrlcreatebutton("test",100,100,100,100)
	GUISetState()

	; Run the GUI until the dialog is closed
	While 1
		$msg = GUIGetMsg()

		If $msg = $GUI_EVENT_CLOSE Then ExitLoop
		If $msg = $button then
			msgbox(0,"","El item del combo seleccionado es... "&Guictrlread($combo))
		Endif
	WEnd
EndFunc   ;==>Example
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: ejecutar programas desde GUICtrlCreateEdit

Mensaje por adrianodj »

era desde GUICtrlCreateEdit gracias de todas maneras pero no es lo que queria :)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ejecutar programas desde GUICtrlCreateEdit

Mensaje por Chefito »

Pues yo pienso que te estás equivocando. Hacer lo que tu dices con un control edit??? Un edit es para escribir y mostrar textos (trabajar con textos) no para eso.

Para eso te recomiendo que utilices o un control list o un control listview. Mira en la ayuda las funciones guictrlcreatelist o guictrlcreatelistview. También está relacionada con esta última guictrlcreatelistviewitem. Mira también las funciones guictrlread para recuperar el contenido, y guictrlsetdata para dárselo. Otra: controllistview, para realizar varias acciones con el listview.

Luego tienes las udfs de estos dos controles, las cuales tiene muchísimas funciones para hacer casi cualquier cosa. Busca en la ayuda las funciones que empiezan por _guictrllistbox_....... y _guictrllistview_...... para según que control utilices.

Para ver los ficheros que tienes en una cierta ubicación, por ejemplo tienes las funciones filefindfirstfile y filefindnextfile. Mira sus ejemplos en la ayuda.
También puedes utilizar _filelisttoarray de la udf file, entre otras.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: ejecutar programas desde GUICtrlCreateEdit

Mensaje por adrianodj »

hola
pues he seguido tus indicaciones y he conseguido leer una carpeta pero lo que pasa que no me la escribe en el GUICtrlCreateList he intentado un monton de cosas pero no he conseguido nada :)
si me podias mirar el codigo y decirme lo que hago mal te lo agradesco
gracias

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>
#include <Array.au3>
$GUI = GUICreate("Run Output", 400, 200)
$Btn_Run = GUICtrlCreateButton("Run Program", 300, 0, 100, 27)
$listview = GUICtrlCreateList("123", 0, 0, 300, 200)
$FileList = _FileListToArray("C:", "*", 1)

GUISetState(@SW_SHOW)

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit

		Case $msg = $Btn_Run
			GUICtrlRead($FileList)
			GUICtrlSetData($listview, "hola")
			_ArrayDisplay($FileList)
	EndSelect
WEnd
 
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ejecutar programas desde GUICtrlCreateList

Mensaje por Chefito »

Tienes que leer más la ayuda que te di todos los pasos machacados :smt012 .

La función _filelisttoarray devuelve, como bien dice, un array de elementos (una matriz). Lo que tienes que hacer es recuperar todos los elementos y meterlos uno a uno en el list. Sabiendo que el elemento 0 del array tiene almacenado el número de ficheros (en este caso) encontrados, pues ya sabes cuantas veces recorrer el array para meter todos dentro del list. Esto se puede hacer con un For.....next.

Introduciendo lo que he dicho anteriormente en tu código, la cosa quedaría así:

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>
#include <Array.au3>
$GUI = GUICreate("Run Output", 400, 200)
$Btn_Run = GUICtrlCreateButton("Run Program", 300, 0, 100, 27)
$listview = GUICtrlCreateList("", 0, 0, 300, 200)
$FileList = _FileListToArray("C:", "*", 1)
For $n=1 To $FileList[0]
	GUICtrlSetData($listview, $FileList[$n])
Next
GUISetState(@SW_SHOW)

While 1
   $msg = GUIGetMsg()
   Select
      Case $msg = $GUI_EVENT_CLOSE
         Exit

      Case $msg = $Btn_Run
         GUICtrlRead($FileList)
         GUICtrlSetData($listview, "hola")
         _ArrayDisplay($FileList)
   EndSelect
WEnd
Bueno, ya puedes seguir trabajando y mejorando el código :smt002 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: ejecutar programas desde GUICtrlCreateListview

Mensaje por adrianodj »

hola
pues he avanzado bastante os pongo el codigo y luego hago unas cuantas preguntas

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>
#include <GuiListView.au3>
#include <Constants.au3>
#include <Misc.au3>
#include <GuiToolTip.au3>
#include <Array.au3>

Global $ITEMID, $Lista1
Global $CABECERA = "Archivo                 |Ruta                     "   ; <----------?????????????????????????????????'No quiero que me salga Ruta pero si lo elimino no me funcciona el boton ejecutar

$Ancho = 333
$Alto = 300
#Region ### START Koda GUI section ###
$Form1 = GUICreate("Aplicacion", $Ancho, $Alto, 318, 184, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_WINDOWEDGE))
;;;; LISTA
$Lista1 = GUICtrlCreateListView($CABECERA, 0, 0, $Ancho, 257)
GUICtrlSetState($Lista1, $GUI_DROPACCEPTED)
_GUICtrlListView_SetExtendedListViewStyle($Lista1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_INFOTIP))

;;;; BOTONES
$BTNAGREGAR = GUICtrlCreateButton("Agregar archivos", 15, 265, 90, 25)
GUICtrlSetTip(-1, 'Añadir archivos ')
$BTNEMPEZAR = GUICtrlCreateButton("Ejecutar", 123, 265, 90, 25)
GUICtrlSetTip(-1, 'Ejecutar')
$BTNBORARSELECT = GUICtrlCreateButton("Borrar", 230, 265, 90, 25)
GUICtrlSetTip(-1, 'Borrar')

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $BTNAGREGAR
			_Agregararchivo()
		Case $BTNEMPEZAR
			_SelectArchivo()
		Case $BTNBORARSELECT
			_BorrarSeleccionado()
	EndSwitch
WEnd



Func _Agregararchivo()
	$Carpeta = FileOpenDialog('Añadir archivos', '', 'Todo (*)', 5, '', $Form1)  ;<-------------???????????????? Quiero poner que me muestre siempre el contenido de una carpeta sin selectionarla por ejemplo C:\Pruebas\   dentro hai aplicaciones .exe

	$Filediv = StringSplit($Carpeta, '|') ;Divido en variables la ruta anteriormente dada por $Music dependiendo de '|'
	If $Filediv[0] <> 1 Then ;Si el valor es diferente a 1 entonces
		For $N = 2 To $Filediv[0] ;Añadir varios archivos
			$ITEMID = _GUICtrlListView_AddItem($Lista1, StringTrimRight($Filediv[$N], 4))
			_GUICtrlListView_AddSubItem($Lista1, $ITEMID, $Filediv[1] & '\' & $Filediv[$N], 1)
		Next
	Else
		$Filediv = StringSplit($Carpeta, '\') ;Añadir un archivo
		$ITEMID = _GUICtrlListView_AddItem($Lista1, StringTrimRight($Filediv[$Filediv[0]], 4))
		_GUICtrlListView_AddSubItem($Lista1, $ITEMID, $Carpeta, 1)
	EndIf
EndFunc   ;==>_Agregararchivo


Func _SelectArchivo()
	If _GUICtrlListView_GetItemCount($Lista1) <> 0 Then
		$A = 0
		Do
			$A = $A + 1
			If _GUICtrlListView_GetItemSelected($Lista1, $A) = True Then
				$Archivo = $A
				_Aplicar(_GUICtrlListView_GetItemText($Lista1, $A, 1))
				$A = _GUICtrlListView_GetItemCount($Lista1)
				$Selection = 0
			Else
				$Selection = 1
			EndIf
		Until $A = _GUICtrlListView_GetItemCount($Lista1)
		If $Selection = 1 Then
			$Archivo = 0
			_Aplicar(_GUICtrlListView_GetItemText($Lista1, 0, 1))
			_GUICtrlListView_SetItemSelected($Lista1, 0)
		EndIf
	EndIf
EndFunc   ;==>_SelectArchivo


Func _Aplicar($RUTAF)
	$Aplicar = ShellExecute($RUTAF)
EndFunc   ;==>_Aplicar

Func _BorrarSeleccionado()
	$var = MsgBox("1", "Atencion", "Estas seguro que quieres Borarlo?")
	If $var = 1 then
	$ELIMINADO = _GUICtrlListView_GetSelectedCount($Lista1)
	_GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($Lista1))

	FileDelete($ELIMINADO)    ;  <--------------------???????????????????????????????????????????????????????? quiero que elimine tambien el archivo

	$ITEMID = $ITEMID - $ELIMINADO

Else
	EndIf
EndFunc   ;==>_BorrarSeleccionado
pues os comento tengo un listwiev y 3 botones
agregar archivo ,ejecutar y borrar
quiero que en el listview me muestra el contenido de una carpeta en cocncreto sin tener que darle al boton agregar por ejemplo C:\pruebas
tambien que en la lista no me salga la ruta del archivo pero que funcione el boton ejecutar :P
gracias
un saludo
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ejecutar programas desde GUICtrlCreateList

Mensaje por Chefito »

adrianodj escribió:quiero que en el listview me muestra el contenido de una carpeta en cocncreto sin tener que darle al boton agregar por ejemplo C:\pruebas
Tendrías que mostrar los ficheros de esa carpeta como te puse en el post anterior, variando el path de los ficheros que quieres mostrar:

Código: Seleccionar todo

 $FileList = _FileListToArray("C:\pruebas", "*", 1)
adrianodj escribió:tambien que en la lista no me salga la ruta del archivo pero que funcione el boton ejecutar :P
Pues eso se puede hacer de muchas formas. Una muy facil, y aprovechando lo que tienes hecho, puede ser dejándo la lista y el código como está, pero ocultando la columna "ruta".
Otra forma podría ser teniendo almacenados los archivos con sus path en una variable array (practicamente como el resultado que te devuelve la función _filelisttoarray). Una vez que los tienes almacenados, tendrías que extraer solamente el nombre del archivo. Para esto puedes hacer tu mismo una función utilizando por ejemplo las funciones de tratamiento de cadenas que empiezan por string.... . Si no te quieres complicar puedes utilizar la función _PathSplit para descomponer la cadena en unidad, path, fichero y extensión.
Una vez que tengas el path por un lado y el fichero por otro ya puedes hacer lo que tu quieres.

Puedes meter el path separado del nombre del fichero en dos matrices en el que coincidan sus índices, para que el path y el fichero se correspondan. También puedes intentar meterlos en un array bidimensional (dos dimensiones). La primera dimensión indicaría el número de ficheros que hay, y la segunda tendría dos elementos, uno que contiene el path y el otro el nombre del fichero.

Si el path es siempre el mismo es más facil de hacer, ya que solamente necesitas almacenar el nombre del fichero.

Al final tendrías que llamar al shellexecute de una forma similar a esta:
shellexecute($path & $nombre_fichero)
siendo el $path el path completo del fichero, y el $nombre_fichero el nombre con su extensión.

A ver que se te ocurre :smt002 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
adrianodj
Mensajes: 13
Registrado: 18 May 2011, 22:42

Re: ejecutar programas desde GUICtrlCreateList

Mensaje por adrianodj »

Chefito escribió:
adrianodj escribió:quiero que en el listview me muestra el contenido de una carpeta en cocncreto sin tener que darle al boton agregar por ejemplo C:\pruebas
Tendrías que mostrar los ficheros de esa carpeta como te puse en el post anterior, variando el path de los ficheros que quieres mostrar:

Código: Seleccionar todo

 $FileList = _FileListToArray("C:\pruebas", "*", 1)
adrianodj escribió:tambien que en la lista no me salga la ruta del archivo pero que funcione el boton ejecutar :P
Pues eso se puede hacer de muchas formas. Una muy facil, y aprovechando lo que tienes hecho, puede ser dejándo la lista y el código como está, pero ocultando la columna "ruta".
Otra forma podría ser teniendo almacenados los archivos con sus path en una variable array (practicamente como el resultado que te devuelve la función _filelisttoarray). Una vez que los tienes almacenados, tendrías que extraer solamente el nombre del archivo. Para esto puedes hacer tu mismo una función utilizando por ejemplo las funciones de tratamiento de cadenas que empiezan por string.... . Si no te quieres complicar puedes utilizar la función _PathSplit para descomponer la cadena en unidad, path, fichero y extensión.
Una vez que tengas el path por un lado y el fichero por otro ya puedes hacer lo que tu quieres.

Puedes meter el path separado del nombre del fichero en dos matrices en el que coincidan sus índices, para que el path y el fichero se correspondan. También puedes intentar meterlos en un array bidimensional (dos dimensiones). La primera dimensión indicaría el número de ficheros que hay, y la segunda tendría dos elementos, uno que contiene el path y el otro el nombre del fichero.

Si el path es siempre el mismo es más facil de hacer, ya que solamente necesitas almacenar el nombre del fichero.

Al final tendrías que llamar al shellexecute de una forma similar a esta:
shellexecute($path & $nombre_fichero)
siendo el $path el path completo del fichero, y el $nombre_fichero el nombre con su extensión.

A ver que se te ocurre :smt002 .

Saludos.
hola
gracias he conseguido
pero tengo una cosa que no acabo de entender del todo bien no se si me la puedes explicar un poco
que significa y porque se utiliza en general
$A = $A + 1
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ejecutar programas desde GUICtrlCreateList

Mensaje por Chefito »

adrianodj escribió:pero tengo una cosa que no acabo de entender del todo bien no se si me la puedes explicar un pocoque significa y porque se utiliza en general $A = $A + 1
Eso es algo básico en la programación. Simplemente le sumas 1 al valor de la variable $A. Ejemplo: Si $A=0 inicialmente, después de $A=$A+1 valdra $A=1. Si se lo aplicamos de nuevo, valdrá 2.
Cual suele ser su uso en muchas ocasiones? Pues utilizar esta variable como un contador. Por eso muchas veces verás llamarse $cont o $c o $n. Para saber cuantas veces se ha ejecutado un código dentro de un bucle while se puede utilizar esta técnica. También para limitar el número de ocasiones que quiere que se ejecute. Y muchas muchas cosas más.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Responder