Asociar controles a las acciones de un botón

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Asociar controles a las acciones de un botón

Mensaje por Jonny »

Hola

Resulta, que en la interfaz de la aplicación que estoy desarrollando, quiero que como en todos los programas al pulsar el intro sobre por ejemplo un cuadro de edición (GuiCtrlCreateInput()), se realice la acción de un botón (Normalmente siguiente, aceptar o similar).
Tengo una ventana en la que conseguí (creo que de casualidad) que ocurriera, pero al poner practicamente lo mismo en otra ventana ya no funciona...
Aquí está el código que me funciona como quiero:

Código: Seleccionar todo




Opt("GUIOnEventMode", 1)

$WindowHandler=GUICreate($FileName, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

$LoginLabel3=GUICtrlCreateLabel("Usuario", 129, 305, 580, 17, $SS_CENTER)

$LoginLabel4=GUICtrlCreateLabel("Contraseña", 129, 350, 580, 17, $SS_CENTER)

$LoginUserInput=GUICtrlCreateInput("", 214, 322, 200, 21)

$LoginPasswordInput=GUICtrlCreateInput("", 214, 367, 200, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))

$LogInLostPasswordButton=GUICtrlCreateButton("¿Has olvidado la contraseña?", 129, 395, 200, 25, 0)

$LoginRememberUserCheckBox=GUICtrlCreateCheckBox("Recordar Usuario", 214, 423)

$LoginRememberPasswordCheckBox=GUICtrlCreateCheckBox("Recordar contraseña", 214, 451)

$LogInOkButton=GUICtrlCreateButton("Siguiente", 224, 479, 80, 21, $BS_DEFPUSHBUTTON)

$LoginCancelButton=GUICtrlCreateButton("Cancelar", 314, 479, 80, 25, 0)



 
Lo único que entiendo es, que teóricamente la línea:

Opt("GUIOnEventMode", 1)

ha de estar así para poder hacer lo que necesito ¿Verdad?

También creo que la constante DEFPUSHBUTTON ha de estar en las propiedades del botón que quiero asociar a los demás controles (aunque no se que hace exactamente).
En ésta interfaz, lo que pretendo es, que al pulsar intro sobre $LoginUserInput o $LoginPasswordInput se ejecu´te el código que se ejecutaría pulsando siguiente (que no puse)
¿Con los checkbox sería lo mismo?
¿Como se ha de hacer (sin hacerlo a boleo)? ejjejeje
Gracias,

Salu2!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Asociar controles a las acciones de un botón

Mensaje por Chefito »

Te he borrado la respuesta a mi mensaje, porque me di cuenta que estaba incompleto y lo borré justo cuando tu lo estabas leyendo :smt005 .
Un plis que te respondo.
Tengo que mirar antes el evento que salta.
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
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Asociar controles a las acciones de un botón

Mensaje por Chefito »

Bueno....parece ser que si le pones a un botón el estilo $BS_DEFPUSHBUTTON, salta este botón al pulsar el enter en los controles input y checkbox :smt017 . Por eso no es producente.
He hecho un pequeño código adaptado al tuyo para que cliquee el botón "siguiente" cuando pulsas enter.
Es cortito, pero si quieres saber algo de el preguntame.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

#include <WindowsConstants.au3>

#include <EditConstants.au3>

#include <GuiButton.au3>

#include <StaticConstants.au3>

$WindowHandler=GUICreate("Ventana", 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

$LoginLabel3=GUICtrlCreateLabel("Usuario", 129, 305, 580, 17, $SS_CENTER)

$LoginLabel4=GUICtrlCreateLabel("Contraseña", 129, 350, 580, 17, $SS_CENTER)

$LoginUserInput=GUICtrlCreateInput("", 214, 322, 200, 21)

$LoginPasswordInput=GUICtrlCreateInput("", 214, 367, 200, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))

$LogInLostPasswordButton=GUICtrlCreateButton("¿Has olvidado la contraseña?", 129, 395, 200, 25, 0)

$LoginRememberUserCheckBox=GUICtrlCreateCheckBox("Recordar Usuario", 214, 423)

$LoginRememberPasswordCheckBox=GUICtrlCreateCheckBox("Recordar contraseña", 214, 451)

$LogInOkButton=GUICtrlCreateButton("Siguiente", 224, 479, 80, 21)

$LoginCancelButton=GUICtrlCreateButton("Cancelar", 314, 479, 80, 25, 0)

$handleInput=GUICtrlGetHandle($LoginPasswordInput)

GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1

    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

    if $msg = $LogInOkButton Then 

    MsgBox(0,"", "has pulsado el botón 'Siguiente'")

    EndIf

WEnd

GUIDelete()

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

    ;if ControlgetFocus($WindowHandler)="Edit2" And $iwParam=1 Then ControlClick($WindowHandler,"","Button4")   ;con esta linea solo funciona el enter con el input password.

    if (ControlgetFocus($WindowHandler)="Edit1" Or ControlgetFocus($WindowHandler)="Edit2") And $iwParam=1 Then ControlClick($WindowHandler,"","Button4")   ;funciona el enter con los dos inputs

EndFunc   ;==>WM_COMMAND

 
Por cierto, te comento en mi opinión. Ya has dejado muchos post con código que no son totalmente funcionales (tienes que añadirles cosas para que funcionen). Casi siempre te faltan los includes y cosas así. Eso es bastante molesto. Pierdes tiempo en hacerlo funcionar y se te quitan un poco las ganas de arreglarlo.
Te recomiendo que en algunos casos procures hacer que funcionen.

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 ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Asociar controles a las acciones de un botón

Mensaje por Jonny »

Hola

Gracias, lo adaptaré al programa que estoy haciendo. La verdad, que en el código que lo ví no estaba hecho así, por eso no entendía muy bien como funcionaba.
Ahora lo entiendo un poco mejor.

De acuerdo, perdona, pondré los códigos más completos. a veces no lo hago, porque para que funcione debería de poner mucho código, ya que aveces son programas muy largos y si hay mucho código tampoco entran ganas de arreglarlo. Es cierto, que en esta ocasión con unas pocas líneas más hubiera funcionado.

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Asociar controles a las acciones de un botón

Mensaje por Jonny »

Hola

Como suponía, lo he entendido a medias...

Lo he probado y efectivamente funciona. El problema, ha estado a la hora de adaptarlo al programa que estoy haciendo, que el código tiene una estructura diferente a la que hiciste y claro, no funciona.

Este es el código (Funcional) jajaja:

Código: Seleccionar todo




#include <Constants.au3>

#Include <EditConstants.au3>

#include <GUIConstants.au3>

#include <GUIConstantsEx.au3>

#include <ButtonConstants.au3>

#Include <Sound.au3>

#include <StaticConstants.au3>

#Include <WindowsConstants.au3>

#include <Array.au3>

#include <File.au3>

#include <String.au3>

#include <Misc.au3>

#Include <Timers.au3>

#Include <Ie.au3>

#Include <Inet.au3>

#Include <Word.au3>

#Include <WinAPI.au3>

Opt("MustDeclareVars", 0)

Opt("TrayAutoPause", 1)

Opt("TrayOnEventMode", 1)

Opt("TrayIconHide", 1)

Opt("TrayMenuMode", 1)

Opt("GUIOnEventMode", 1)

Opt("OnExitFunc", "ExitFile")

Opt("GUIResizeMode", $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKLEFT)

If _Singleton(@ScriptDir&"\"&@ScriptName, 1)=0 Then

Exit

EndIf

Global $FileName="SMS Lyte"

Global $WindowHandler

Global $WindowName

Global $BuffWindow

Global $CtrlWindowThread

Global $CtrlLoginThread

Global $MainLabel1

Global $MainLabel2

Global $LoginLabel1

Global $LoginLabel2

Global $LoginLabel3

Global $LoginLabel4

Global $LoginUserInput

Global $LoginPasswordInput

Global $LoginRememberUserCheckBox

Global $LoginRememberPasswordCheckBox

Global $LoginOkButton

Global $LoginCancelButton

Global $LoginBackButton

Global $LoginLostPasswordButton

Global $HandleLoginInput

LoginWindow()

CreateThread("all")

While 1

_ReduceMemory()

Wend

Func _ReduceMemory()

DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)

EndFunc

Func ExitFile()

Exit

EndFunc

Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

If ((ControlGetFocus($WindowHandler)=="Edit1" Or ControlGetFocus($WindowHandler)=="Edit2") And ($iwParam==1)) Then

ControlClick($WindowHandler, "", "Button4")

EndIf

EndFunc   ;==>WM_COMMAND

Func LoginOkButton()

If $WindowName=="LoginWindow" Then

DropThread("all")

MainWindow()

CreateThread("all")

EndIf

EndFunc

Func LoginCancelButton()

Msgbox(0, "", "Has pulsado ""Cancelar!""")

Exit

EndFunc

Func GuiMaximize()

$WinMaximize=@SW_MAXIMIZE

EndFunc

Func GuiMinimize()

$WinMinimize=@SW_MINIMIZE

EndFunc

Func GuiRestore()

$WinRestore=@SW_RESTORE

EndFunc

Func LoginWindow()

GUIDelete()

$WindowHandler=GUICreate($FileName, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

$BuffWindow="LoginWindow"

$WindowName="LoginWindow"

$LoginLabel1=GUICtrlCreateLabel("Iniciar sesión.", 129, 137, 580, 17, $SS_CENTER)

$LoginLabel2=GUICtrlCreateLabel("Introduce tus datos de acceso al servicio:", 129, 221, 580, 17, $SS_CENTER)

$LoginLabel3=GUICtrlCreateLabel("Usuario", 129, 305, 580, 17, $SS_CENTER)

$LoginLabel4=GUICtrlCreateLabel("Contraseña", 129, 350, 580, 17, $SS_CENTER)

$LoginUserInput=GUICtrlCreateInput("", 214, 322, 200, 21)

$LoginPasswordInput=GUICtrlCreateInput("", 214, 367, 200, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))

$LogInLostPasswordButton=GUICtrlCreateButton("¿Has olvidado la contraseña?", 129, 395, 200, 25, 0)

$LoginRememberUserCheckBox=GUICtrlCreateCheckBox("Recordar Usuario", 214, 423)

$LoginRememberPasswordCheckBox=GUICtrlCreateCheckBox("Recordar contraseña", 214, 451)

$LogInOkButton=GUICtrlCreateButton("Siguiente", 224, 479, 80, 21)

$LoginCancelButton=GUICtrlCreateButton("Cancelar", 314, 479, 80, 25, 0)

GuiCtrlSetState($LoginUserInput, $GUI_Focus)

$HandleLoginInput=GUICtrlGetHandle($LoginPasswordInput)

GUISetState()

GuiRegisterMsg($WM_COMMAND, "LoginWM_COMMAND")

EndFunc

Func MainWindow()

GUIDelete()

$WindowHandler=GUICreate($FileName, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

$BuffWindow="MainWindow"

$WindowName="MainWindow"

$MainLabel1=GUICtrlCreateLabel("Bienvenido a "&$FileName, 129, 137, 580, 17, $SS_CENTER)

$MainLabel2=GUICtrlCreateLabel(Chr(169)&"(C) 2009 Ivermedia", 129, 165, 580, 17, $SS_CENTER)

GUISetState()

EndFunc

Func CreateThread($XThread)

Switch($XThread)

Case "all"

$CtrlWindowThread=_Timer_SetTimer($WindowHandler, 0, "CtrlWindowThread")

$CtrlLoginThread=_Timer_SetTimer($WindowHandler, 0, "CtrlLoginThread")

Case "CtrlWindow"

$CtrlWindowThread=_Timer_SetTimer($WindowHandler, 0, "CtrlWindowThread")

Case "CtrlLogin"

$CtrlLoginThread=_Timer_SetTimer($WindowHandler, 0, "CtrlLoginThread")

EndSwitch

EndFunc

Func DropThread($XThread)

Switch($XThread)

Case "all"

_timer_KillTimer($WindowHandler, $CtrlWindowThread)

_timer_KillTimer($WindowHandler, $CtrlLoginThread)

Case "CtrlWindow"

_timer_KillTimer($WindowHandler, $CtrlWindowThread)

Case "CtrlLogin"

_timer_KillTimer($WindowHandler, $CtrlLoginThread)

EndSwitch

EndFunc

Func CtrlWindowThread($hWnd, $Msg, $iIDTimer, $dwTime)

GuiSetOnEvent($GUI_EVENT_CLOSE, "ExitFile")

GuiSetOnEvent($GUI_EVENT_MAXIMIZE, "GuiMaximize")

GuiSetOnEvent($GUI_EVENT_MINIMIZE, "GuiMinimize")

GuiSetOnEvent($GUI_EVENT_RESTORE, "GuiRestore")

GuiCtrlSetOnEvent($LoginCancelButton, "LoginCancelButton")

GuiCtrlSetOnEvent($LoginOkButton, "LoginOkButton")

EndFunc

Func CtrlLoginThread($hWnd, $Msg, $iIDTimer, $dwTime)

If WinActive($FileName) Then

If (GuiCtrlRead($LoginUserInput)=="" Or GuiCtrlRead($LoginPasswordInput)=="") Then

GuiCtrlSetState($LoginOkButton, $GUI_Disable)

Else

GuiCtrlSetState($LoginOkButton, $GUI_Enable)

EndIf

If GuiCtrlRead($LoginUserInput)=="" Then

GuiCtrlSetState($LoginLostPasswordButton, $Gui_Disable)

Else

GuiCtrlSetState($LoginLostPasswordButton, $Gui_Enable)

EndIf

EndIf

EndFunc



 
Como ves, he hecho en mi código por un lado las interfaces en funciones y por otro en vez de un while he optado por timers, para simular el multihilo (Me gustan más las aplicaciones multihilo (AUNQUE DEN MÁS PROBLEMAS)).

Quizá te parezca un caos de código jejjejje...

¿Porqué no funcionará?

Hay algunas cosas qe no entendí del código que hiciste:

Haciendo el programa como está en el código que he puesto (con cada ventana en una función, o en cualquier caso, creando barias ventanas en el programa) ¿He de crear la función

Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
If ((ControlGetFocus($WindowHandler)=="Edit1" Or ControlGetFocus($WindowHandler)=="Edit2") And ($iwParam==1)) Then
ControlClick($WindowHandler, "", "Button4")
EndIf
EndFunc


para tantos botones como quiera asociar a controles?
¿Como sabes que el Button "Siguiente es "Button4"? ¿Siempre obtendrá ese nombre?...
esque, los edits ("Edit1" y "Edit2") sí entiendo que tengan esos nombres para la función controlgetfocus() pero "Button4" no comprendo el porqué...

Por últomo:
¿Por qué la línea:

$HandleLoginInput=GUICtrlGetHandle($LoginPasswordInput)?

No debería ponerse también:


$HandleLoginInput=GUICtrlGetHandle($LoginUserInput)?

Bueno... creo que esto es todo, que menudo aluvión de preguntas jajaja.
gracias,

Salu2!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Asociar controles a las acciones de un botón

Mensaje por Chefito »

Anda queee.....menos mal que son unas pocas líneas de código :smt005 .
A ver...antes de ver tu código, te voy a responder a las preguntas y explicar un poco como va el código, para ver si lo puedes solucionar tu mismo :smt004 .
Jonny escribió:Haciendo el programa como está en el código que he puesto (con cada ventana en una función, o en cualquier caso, creando barias ventanas en el programa) ¿He de crear la función

Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
If ((ControlGetFocus($WindowHandler)=="Edit1" Or ControlGetFocus($WindowHandler)=="Edit2") And ($iwParam==1)) Then
ControlClick($WindowHandler, "", "Button4")
EndIf
EndFunc


para tantos botones como quiera asociar a controles?
Haber.......la funcion Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) solo se crea una vez. Lo que tienes que cambiar es el código de dentro. Esta función se va a encargar de recoger los eventos de la/s ventana/s (supongo que de todas. Solamente he trabajado con una).
Lo que tienes que hacer es cambiar y añadir las condiciones.
Te destripo un poco la condición:
ControlGetFocus($WindowHandler) esto está claro que devuelve el control (la clase y la instancia) de la ventana $windowhandler (tu ventana) que tiene el foco cuando es llamada.
$iwParam, con este parámetro consigo el código que devuelve la acción del usuario, el que nos interesa es pulsar enter, y al hacer eso nos da 1.
ControlClick está claro no????.
En conjunto: Si al pulsar enter ($iwParam=1) tiene el foco el Edit1 (usuario) o el Edit2 (password) entonces cliquea el botón siguiente.
Está claro no? :smt020 .
Jonny escribió:¿Como sabes que el Button "Siguiente es "Button4"?
Te mato :smt027 . Pues como crees que lo he obtenido??? Pues con el AutoIt Window Info que me dice la clase e instancia de todos los controles. Ejecuta tu script y mira los controles.
Jonny escribió:¿Siempre obtendrá ese nombre?...
En un principio sí. A no ser que empieces a eliminar los controles y los vuelvas a crear y cosas de esas, no debe cambiar. Pero lo dicho anteriormente. Coge el AutoIt Window Info y ves comprobandolos.
Jonny escribió:esque, los edits ("Edit1" y "Edit2") sí entiendo que tengan esos nombres para la función controlgetfocus() pero "Button4" no comprendo el porqué...
Es Button4 porque tiene ese orden de creación en tu código. Los checkboxes tienen también Clase Button, por eso seguramente no te salen las cuentas..jajajaja :smt002 .
Jonny escribió:¿Por qué la línea:
$HandleLoginInput=GUICtrlGetHandle($LoginPasswordInput)?
Jajajaja....se me coló en el código. No se necesita para nada. Si observas el código nunca la llego a utilizar.
Está ahí porque en un principio lo hice de otra forma, la cual no hacía falta ver las clases de los controles, las sacaba con un par de funciones. Pero decidí hacerlo directo y con menos código.

A ver si con estas explicaciones puedes hacer algo en tu código.

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 ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Asociar controles a las acciones de un botón

Mensaje por Jonny »

Hola

a ver, si hago que vaya, pero ... aunque ahora lo he entendido algo más....

No veo otra forma de hacerlo, qe la que puse arriba.

Salu2!
Responder