Página 1 de 1

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

Publicado: 26 Nov 2015, 03:41
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.

Re: Ejecutar accion de varios botones creados dinámicamente

Publicado: 27 Nov 2015, 02:23
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:)

Re: Ejecutar accion de varios botones creados dinámicamente

Publicado: 28 Nov 2015, 14:21
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.

Re: Ejecutar accion de varios botones creados dinámicamente

Publicado: 10 Dic 2015, 16:47
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