Jump to content

Load GUI from OnEventFunction


Recommended Posts

#include <GUIConstantsEx.au3>

Global $iExitLoop = 0, $hGUIParent1, $hGUIParent2, $iLoadGuiTwo = 0
Example1()
;~ Example2() ; not an example but a GUI ?
Func Example1($iParent = 0)
    Opt("GUIOnEventMode", 1)
    $hGUIParent1 = GUICreate("Parent", 400, 300, -1, -1, -1, -1, $iParent)
    GUISetOnEvent($GUI_EVENT_CLOSE, "OnEvent_CLOSE_ONE", $hGUIParent1)
    GUICtrlCreateButton("load GUI TWO", 8, 8, 100)
    GUICtrlSetOnEvent(-1, "LoadGuiTwoFromGuiOne")
    GUISetState(@SW_SHOW)

    While 1 ; Loop until the user exits.
        Sleep(100)
;~      If $iLoadGuiTwo Then ; .......... solution 1
;~          Example2($hGUIParent1) ; ....
;~          $iLoadGuiTwo = 0 ; ..........
;~      EndIf ; .........................
        If $iExitLoop Then ExitLoop
    WEnd
    $iExitLoop = 0
    GUIDelete($hGUIParent1)
EndFunc   ;==>Example1

Func Example2($iParent = 0)
    Opt("GUIOnEventMode", 1)
    $hGUIParent2 = GUICreate("Child", 300, 400, -1, -1, -1, -1, $iParent)
    GUISetOnEvent($GUI_EVENT_CLOSE, "OnEvent_CLOSE_TWO", $hGUIParent2)
    GUICtrlCreateButton("say hi", 8, 8)
    GUICtrlSetOnEvent(-1, "GuiTwoSayHi")
    GUISetState(@SW_SHOW)

    While 1 ; Loop until the user exits.
        Sleep(100)
        If $iExitLoop Then ExitLoop
    WEnd
    $iExitLoop = 0
    GUIDelete($hGUIParent2)
EndFunc   ;==>Example2


Func OnEvent_CLOSE_ONE()
    ConsoleWrite('- Func OnEvent_CLOSE_ONE()' & @CRLF)
    $iExitLoop = 1
EndFunc   ;==>OnEvent_CLOSE_ONE

Func OnEvent_CLOSE_TWO()
    ConsoleWrite('- Func OnEvent_CLOSE_TWO()' & @CRLF)
    $iExitLoop = 1
EndFunc   ;==>OnEvent_CLOSE_TWO

Func LoadGuiTwoFromGuiOne()
    Example2($hGUIParent1) ; no solution.
;~  $iLoadGuiTwo = 1 ; solution 1
;~  AdlibRegister("LoadGuiTwoRunner", 10) ; solution 2
EndFunc   ;==>LoadGuiTwoFromGuiOne

Func LoadGuiTwoRunner()
    AdlibUnRegister("LoadGuiTwoRunner")
    Example2($hGUIParent1)
EndFunc   ;==>LoadGuiTwoRunner

Func GuiTwoSayHi()
    ConsoleWrite('--- HI' & @CRLF)
EndFunc   ;==>GuiTwoSayHi

..I was using map[] and beta and is this a bug ?. But I coded this sampler and is not a beta thing, is an production thing too.
Is the code as presented supposed to fail ? ( found viable solutions, so this is not an OMG! kind of thing )
I believe that the logic would work if not GuiOnEvent mode.

Edit: Tried in v3.2.12.x and v3.3.8.1 and is a design thing. Not new. I just never noticed it.

Edited by argumentum
oops
Link to post
Share on other sites

I've used OnEventMode with multiple GUIs before (for example my PlasmaKit script).

Perhaps, something like this?

#include <GUIConstantsEx.au3>

Global $iExitLoop = 0, $hGUIParent1, $hGUIParent2, $iLoadGuiTwo = 0
Example1()
;~ Example2() ; not an example but a GUI ?
Func Example1($iParent = 0)
    Opt("GUIOnEventMode", 1)
    $hGUIParent1 = GUICreate("Parent", 400, 300, -1, -1, -1, -1, $iParent)
    GUISetOnEvent($GUI_EVENT_CLOSE, "OnEvent_CLOSE_ONE", $hGUIParent1)
    GUICtrlCreateButton("load GUI TWO", 8, 8, 100)
    GUICtrlSetOnEvent(-1, "LoadGuiTwoFromGuiOne")
    GUISetState(@SW_SHOW)

    While 1 ; Loop until the user exits.
        Sleep(100)
        If $iExitLoop Then ExitLoop
    WEnd
    $iExitLoop = 0
    GUIDelete($hGUIParent1)
EndFunc   ;==>Example1

Func Example2($iParent = 0)
;~     Opt("GUIOnEventMode", 1)
    $hGUIParent2 = GUICreate("Child", 300, 400, -1, -1, -1, -1, $iParent)
    GUISetOnEvent($GUI_EVENT_CLOSE, "OnEvent_CLOSE_TWO", $hGUIParent2)
    GUICtrlCreateButton("say hi", 8, 8)
    GUICtrlSetOnEvent(-1, "GuiTwoSayHi")
    GUISetState(@SW_SHOW)

;~     While 1 ; Loop until the user exits.
;~         Sleep(100)
;~         If $iExitLoop Then ExitLoop
;~     WEnd
;~     $iExitLoop = 0
;~     GUIDelete($hGUIParent2)
EndFunc   ;==>Example2


Func OnEvent_CLOSE_ONE()
    ConsoleWrite('- Func OnEvent_CLOSE_ONE()' & @CRLF)
    $iExitLoop = 1
EndFunc   ;==>OnEvent_CLOSE_ONE

Func OnEvent_CLOSE_TWO()
    ConsoleWrite('- Func OnEvent_CLOSE_TWO()' & @CRLF)
    GUIDelete($hGUIParent2)
EndFunc   ;==>OnEvent_CLOSE_TWO

Func LoadGuiTwoFromGuiOne()
    Example2($hGUIParent1) ; no solution.
EndFunc   ;==>LoadGuiTwoFromGuiOne

Func GuiTwoSayHi()
    ConsoleWrite('--- HI' & @CRLF)
EndFunc   ;==>GuiTwoSayHi

Keep in mind, pressing the "load GUI TWO" button again while one is already open will overwrite the handle assigned to $hGUIParent2.  You could account for this in various ways if you intend to not allow this behavior.

Link to post
Share on other sites

thanks @spudw2k but the sample code I presented should work, but it does not. I can get around it but may be something to make the coders ( MVPs ) and scripters aware of, since within the OnEvent function, all other OnEvent functions are halted/skipped.

Link to post
Share on other sites

I think the issue ultimately has to do with your second while loop when the 2nd GUI function runs.  That seems to be what is causing the events to not fire from what I can tell.  I'm not sure why it does, but it does.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By jiaojiaodubai
      I plan to write an Au3 script to automatically install a PPT plug-in.
      Because the button on the installation wizard of the PPT plug-in is not a standard control, I consider writing a while loop to constantly judge the color of a specific location on the installation wizard. When the plug-in is successfully installed, a blue "Start Software" button will appear at this location, so that I can let the script close the installation wizard window.
      But when I used the PixelGetColor function, the script did not get the color of the button on the installation wizard. On the contrary, it went through this foreground window and got the color of my desktop background! However, Au3's window information tool can correctly return the color of this position.
      The following is my script code (due to different configurations, some coordinates may need to be changed when testing on other devices):
      ;~ Run plug-in installation package #RequireAdmin run(@ScriptDir & "\FocoSlide.exe") ;~ In each installation, the number behind this class is different, so you need to use wildcards to match the window. $tittle = "[REGEXPCLASS:HwndWrapper*]" WinWait($tittle) ;~ Change the installation path WinActivate($tittle) Send("+{TAB}") Send("+{TAB}") Send("+{END}") Send("{DELETE}") ControlSend($tittle, "", "", "C:\Program Files (x86)\OfficePlugins\Foco") ;~ Switch focus to "Install" button and enter to confirm Send("+{TAB}") Send("{ENTER}") $wh = WinGetHandle($tittle) ;~ Wait for the "Start Software" button to appear (installation is complete) ;~ Activate the window before each color acquisition to avoid potential errors. WinActivate($tittle) $s = PixelGetColor(763, 533, $wh) ConsoleWrite("color is " & Hex($s, 6) & @CR) While Hex($s) <> "0267EC" Sleep(3000) $s = PixelGetColor(763, 533, $wh) ConsoleWrite("color is " & Hex($s, 6) & @CR) WinActivate($tittle) WEnd ;~ When the blue Start Software button is detected, the installation is completed and the installation wizard is closed. MouseClick("left", 1043, 350) Exit Au3 version: 3.3.16.1
      Operating system: Win11
    • By argumentum
      #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) Global $edit, $GuiChild = 0 GuiExample() Func GuiExample() ; https://www.autoitscript.com/forum/topic/202986-parent-child-guis-and-input-control-fails/ Local $GuiMain = GUICreate("GuiExample w/child (parent)", 350, 300) GUISetOnEvent($GUI_EVENT_CLOSE, "GuiOnEvent_CLOSE", $GuiMain) GUISetState(@SW_SHOW, $GuiMain) $edit = GUICtrlCreateEdit("", 10, 70, 300, 200) ; It does not matter what GUI is on, GUICtrlSetData($edit, "play around with the inputs" & _ ; the parent's controls will @CRLF & "and press enter." & _ ; bleed through a $WS_CHILD gui. @CRLF & @CRLF & "It should trigger the" & _ @CRLF & " GUICtrlSetOnEvent()") GUICtrlCreateButton("reload alt.", 225, 40, 120, 25) ; run alternate versions, GUICtrlSetOnEvent(-1, "OnBttnRunAlt") ; with and without child GUI. GUICtrlSetTip(-1, "run alternate versions," & @LF & "with and without child GUI.") ;I need this child(s), but with it, it does not behave as expected. ;..for this test you can comment it out, to see that it should work. ;..but with the child, instead it executes after clicking another control. If Not StringInStr($CmdLineRaw, "/ExampleOnlyParent") Then $GuiChild = GUICreate("GuiExample w/child (child)", 320, 280, 5, 5, $WS_CHILD, $WS_TABSTOP, $GuiMain) EndIf If $GuiChild Then GUISetBkColor(0x888888, $GuiChild) ; for the dramatic effect :) If $GuiChild Then GUISwitch($GuiChild) ; ..just in case.. tho should not matter. GUICtrlCreateInput("This text 1", 5, 10, 200, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_WANTRETURN)) GUICtrlSetOnEvent(-1, "OnInputEnterKeyOne") GUICtrlCreateInput("This text 2", 5, 35, 200, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_WANTRETURN)) GUICtrlSetOnEvent(-1, "OnInputEnterKeyTwo") If $GuiChild Then GUICtrlCreateButton("flash child", 220, 8, 120, 25) GUICtrlSetOnEvent(-1, "OnFlashBttn") GUISetState(@SW_SHOW, $GuiChild) OnFlashBttn() EndIf MainLoopExample() EndFunc Func MainLoopExample() While 1 Sleep(100) WEnd EndFunc Func OnInputEnterKeyOne() GUICtrlSetData($edit, @SEC &'.' & @MSEC& ' - Func OnInputEnterKey One ()' & @CRLF) EndFunc Func OnInputEnterKeyTwo() GUICtrlSetData($edit, @SEC &'.' & @MSEC& ' - Func OnInputEnterKey Two ()' & @CRLF) EndFunc Func OnFlashBttn() WinSetTrans($GuiChild, "", 50) Sleep(300) WinSetTrans($GuiChild, "", 255) EndFunc Func OnBttnRunAlt() If StringInStr($CmdLineRaw, "/ExampleOnlyParent") Then ShellExecute(@ScriptFullPath, "") Else ShellExecute(@ScriptFullPath, "/ExampleOnlyParent") EndIf GuiOnEvent_CLOSE() EndFunc Func GuiOnEvent_CLOSE() GUIDelete() Exit EndFunc I need this child(s), but with it, it does not behave as expected.
      ..for this test you can comment the child GUI out, to see that it should work.
      With the child, instead it executes after clicking another control.
      Thanks
      Edit: Modified the example for dramatic effect  
      Edit 2: Solved my problems at a post somewhere down this thread.
    • By EmilyLove
      What is Rollbar?
      Rollbar provides real-time error alerting & debugging tools for developers. Learn more about it at https://rollbar.com/product/
      Demo: https://rollbar.com/demo/demo/
      Screenshot:
      Instructions: (RollbarTest.au3)
      ; Include RollbarSDK #include "RollbarSDK.au3" ;Turns on ConsoleWrite debugging override. ;Global $Rollbar_Debug=False ; Initialize RollbarSDK with the project's API key. ; Parameters ....: $__Rollbar_sToken - [Required] Go to https://rollbar.com/<User>/<ProjectName>/settings/access_tokens/ for your project. Use the token for post_server_item. _Rollbar_Init("eaa8464a4082eeabd9454465b8f0c0af") ; Write code that causes an error you want to catch, then call ; _Rollbar_Send ; Parameters ....: $__Rollbar_sErrorLevel - [Required] Must be one of the following values: Debug, Info, Warning, Error, Critical. ; $__Rollbar_sMessage - [Required] The message to be sent. This should contain any useful debugging info that will help you debug. ; $__Rollbar_sMessageSummary - [Optional] A string that will be used as the title of the Item occurrences will be grouped into. Max length 255 characters. If omitted, Rollbar will determine this on the backend. _Rollbar_Send("Debug", "This is an debug message. If you received this, you were successful!", "Debug Message") _Rollbar_Send("Info", "This is a test message. If you received this, you were successful!", "Info Message") _Rollbar_Send("Warning", "This is an warning message. If you received this, you were successful!", "Warning Message") _Rollbar_Send("Error", "This is an error message. If you received this, you were successful!", "Error Message") _Rollbar_Send("Critical", "This is an critical message. If you received this, you were successful!", "Critical Message") _Rollbar_Send("Info", "This is a test message. If you received this, you were successful!") ;No Message ; Rollbar_Send's helper functions ; Parameters ....: $__Rollbar_sMessage - [Required] The message to be sent. This should contain any useful debugging info that will help you debug. ; $__Rollbar_sMessageSummary - [Optional] A string that will be used as the title of the Item occurrences will be grouped into. Max length 255 characters. If omitted, Rollbar will determine this on the backend. _Rollbar_SendDebug("This is an debug message. If you received this, you were successful!", "Debug Message") _Rollbar_SendInfo("This is a test message. If you received this, you were successful!", "Info Message") _Rollbar_SendWarning("This is an warning message. If you received this, you were successful!", "Warning Message") _Rollbar_SendError("This is an error message. If you received this, you were successful!", "Error Message") _Rollbar_SendCritical("This is an critical message. If you received this, you were successful!", "Critical Message") ; Usable Example Local $sImportantFile = "C:\NOTAREALFILE_1234554321.txt" Switch FileExists($sImportantFile) Case True MsgBox(0, "Example Script", "An important file was found. Continuing...") Case Else _Rollbar_SendCritical('An important file was missing. Halting... File: "' & $sImportantFile & '"', 'Important file "' & $sImportantFile & '" is missing.') EndSwitch Notes: Please comment your feedback, advice, & suggestions below. While this is only a proof of concept, I will expand its feature set for everyone to use. 
      Right now, it is fully functional but not tested in production.
       
       
      Changelog:
      RollbarSDK.au3
      RollbarTest.au3
      v0.2
       
      v0.1.1
       
    • By qsek
      Im not sure if this is intended but normally Autoit variables are always passed as copies (except objects i think).
      But below i observed an unconsistency when copying maps with nested maps inside.
      Issue:
      If you create a nested map1 and copy it to a new map2, changing a nested value in map2 will also change the nested value in map1
      Dim $player[] Dim $sub[] $player.test1 = 1 $player.test2 = $sub $player.test2.child1 = "org" $player.test2.childext = $sub $player.test2.childext.child1 = "org2" $playerold = $player ; make a copy of the whole map ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF); original nested value in $player $playerold.test2.child1 = "changed" ; edit a nested value in $playerold ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF) ; original nested value in $player changed ConsoleWrite("---------------------" & @CRLF) ConsoleWrite("player.test2.childext.child1 : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player $playerold.test2.childext.child1 = "changed2" ; edit a level2 nested value in $playerold ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF); original level1 nested value in $player stayed the same ConsoleWrite("player.test2.childext.child1 : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player changed  
    • By EmilyLove
      As the title says, when a script that is stored on a Google Drive File Stream drive is ran or compiled, it fails to work at all.
      Basically, Google Drive File Stream creates a G:\ drive where you can access all your files. The difference between this and Google Backup and Sync is your files are downloaded as needed rather than they always be downloaded and taking up storage. 
      How to Reproduce Bug
      1. Download and Install Google Drive File Stream
      2. Sign into Google Drive File Stream with a G Suite account. 
      3. Create a AutoIt Script and save it to Google Drive File Stream. (See attached file)
      4. Attempt to run or compile this AutoIt Script. 
       
      AutoIt appears to act like the script is (incorrectly) empty and ends immediately. (You can kind of tell based on file sizes from a successful and failed compile).
      I've also attached a Process Monitor log file. Hopefully someone can figure this out, because having to move the script out of the drive just to run or compile it is super annoying and I lose version revisioning Google Drive provides me.
      test.au3
      Logfile.PML
×
×
  • Create New...