[Sol]Ejecutar accion de varios botones creados dinámicamente

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

[Sol]Ejecutar accion de varios botones creados dinámicamente

Mensaje por chekok »

Hola amigos, hace mucho que no paro por aquí y necesito de vuestra ayuda.
El tema es el siguiente:
La finalidad es crear una ventana de herramientas con botones que llamen a distintos ejecutables del sistema, pero dichos botones no existen en la GUI, se crean dinámicamente leyendo los datos de un .INI donde está la información de cada botón a crear. La idea es que con un exe compilado, poder cambiar el número de botones y sus propiedades cambiando solamente el fichero .INI evitando tener que recompilar de nuevo el script. Esa parte la tengo funcionando sin problemas, el problema lo encuentro a la hora de llamar a la acción de cada botón que he creado, sencillamente no encuentro la manera de hacerlo y me estoy volviendo loco.
El código del script sería más o menos este:

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$sFilePath = "configuracion.ini"
$botones = IniReadSectionNames($sFilePath)
$Form1 = GUICreate("Mi Menú", @DesktopWidth, 75, -4, 0,Default, $WS_EX_TOOLWINDOW)
GUISetBkColor(0xBFCDDB)
For $i = 1 To $botones[0]
	$boton = GUICtrlCreateButton(IniRead($sFilePath, $botones[$i], "Caption", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_x", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_y", "Default Value"), IniRead($sFilePath, $botones[$i], "ancho", "Default Value"), IniRead($sFilePath, $botones[$i], "alto", "Default Value"), $BS_FLAT)
	GUICtrlSetFont(-1, IniRead($sFilePath, $botones[$i], "fontsize", "Default Value"), 800, 2, IniRead($sFilePath, $botones[$i], "font", "Default Value"))
	GUICtrlSetColor(-1, IniRead($sFilePath, $botones[$i], "fontcolor", "Default Value"))
	GUICtrlSetBkColor(-1, IniRead($sFilePath, $botones[$i], "color", "Default Value"))
	$accion = IniRead($sFilePath, $botones[$i], "ruta", "Default Value")
Next
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $boton
			;Run($accion)
	EndSwitch
WEnd

Y el código del correspondiente archivo "configuracion.ini sería tal que así:

Código: Seleccionar todo

[Boton1]
Caption=Explorador
Ruta=C:\Windows\explorer.exe
Color=0x000080
Font=Arial
FontColor=0XFFFFFF
FontSize=10
Alto=50
Ancho=200
Posicion_x=8
Posicion_y=8
Visible=1

[Boton2]
Caption=CMD
Ruta=C:\windows\system32\cmd.exe
Color=0xff0000
Font=Arial
FontColor=0XFFFFFF
FontSize=10
Alto=50
Ancho=200
Posicion_x=210
Posicion_y=8
Visible=1
No consigo hacerle funcionar a la parte de asignar una acción al clic del botón, lo único que he conseguido es que se ejecute en bucle infinito la acción que lee del .INI de la clave "ruta". Por eso he comentado la función "RUN" del case de $botón, así si lo probáis no os revienta el PC (literalmente).

Espero vuestros consejos, a mi me sale ya humo de la cabeza y no doy con el asunto, gracias.
Última edición por chekok el 10 Dic 2015, 16:49, editado 1 vez en total.
La vida es larga y dura.
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2083
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Ejecutar accion de varios botones creados dinámicamente

Mensaje por BasicOs »

Hola, gracias por el aporte del programa este. La idea está muy bien para tener menus automáticos.

Estabas sobreescribiendo los valores a usar en el bucle, aquí tienes un código funcionando:

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$sFilePath = "configuracion.ini"
$botones = IniReadSectionNames($sFilePath)
$botones0= IniReadSectionNames($sFilePath)
$acciones= IniReadSectionNames($sFilePath)
$Form1 = GUICreate("Mi Menú", @DesktopWidth, 75, -4, 0,Default, $WS_EX_TOOLWINDOW)
GUISetBkColor(0xBFCDDB)
For $i = 1 To $botones[0]
   $botones0[$i]= GUICtrlCreateButton(IniRead($sFilePath, $botones[$i], "Caption", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_x", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_y", "Default Value"), IniRead($sFilePath, $botones[$i], "ancho", "Default Value"), IniRead($sFilePath, $botones[$i], "alto", "Default Value"), $BS_FLAT)
   GUICtrlSetFont(-1, IniRead($sFilePath, $botones[$i], "fontsize", "Default Value"), 800, 2, IniRead($sFilePath, $botones[$i], "font", "Default Value"))
   GUICtrlSetColor(-1, IniRead($sFilePath, $botones[$i], "fontcolor", "Default Value"))
   GUICtrlSetBkColor(-1, IniRead($sFilePath, $botones[$i], "color", "Default Value"))
   $acciones[$i] = IniRead($sFilePath, $botones[$i], "ruta", "Default Value")
Next
GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $botones0[1]
         Run($acciones[1])
	      Case $botones0[2]
         Run($acciones[2])
   EndSwitch
WEnd
Salu22:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ejecutar accion de varios botones creados dinámicamente

Mensaje por Chefito »

Con este código puedes añadir todos los botones que quieras sin preocuparte de la ejecución de acciones.
Analiza el código y si no comprendes algo pregunta :smt024 :smt002 .

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Dim $boton[1]

$sFilePath = "configuracion.ini"
$botones = IniReadSectionNames($sFilePath)
ReDim $boton[$botones[0]]
$Form1 = GUICreate("Mi Menú", @DesktopWidth, 75, -4, 0,Default, $WS_EX_TOOLWINDOW)
GUISetBkColor(0xBFCDDB)
For $i = 1 To $botones[0]
   $boton[$i-1] = GUICtrlCreateButton(IniRead($sFilePath, $botones[$i], "Caption", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_x", "Default Value"), IniRead($sFilePath, $botones[$i], "posicion_y", "Default Value"), IniRead($sFilePath, $botones[$i], "ancho", "Default Value"), IniRead($sFilePath, $botones[$i], "alto", "Default Value"), $BS_FLAT)
   GUICtrlSetFont(-1, IniRead($sFilePath, $botones[$i], "fontsize", "Default Value"), 800, 2, IniRead($sFilePath, $botones[$i], "font", "Default Value"))
   GUICtrlSetColor(-1, IniRead($sFilePath, $botones[$i], "fontcolor", "Default Value"))
   GUICtrlSetBkColor(-1, IniRead($sFilePath, $botones[$i], "color", "Default Value"))
   $accion = IniRead($sFilePath, $botones[$i], "ruta", "Default Value")
Next
GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
	EndSwitch

	For $n=1 To $botones[0]
		If $nMsg=$boton[$n-1] Then Run($accion)
	Next
WEnd
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 ;).
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Ejecutar accion de varios botones creados dinámicamente

Mensaje por chekok »

Gracias amigos por vuestra ayuda. Me ha sido muy útil vuestro código. He conseguido lo que buscaba gracias a vosotros.

Como siempre BasicOS y Chefito, tan rápidos en contestar. En este foro la solución llega y muy rápidamente.

Gracias. :smt023
La vida es larga y dura.
Responder