Psychoman Posted June 15, 2011 Share Posted June 15, 2011 (edited) Here is a little something I'm unable to understand.I have a simple window with a button on it.When the button is pressed, the window is destroyed and a second window opens.The second windows also contains a button.When the button on the second window is pressed, the second window is destroyed and the first is created again.The problem is that once the second window is created, the events of are not catched.Could someone please tell me why following code is not working?I could really use some help on this.expandcollapse popup; -------- ; Includes ; -------- #include <GuiCOnstants.au3> ; ------- ; Options ; ------- AutoItSetOption("GUIOnEventMode", 1) ; --------- ; Variables ; --------- Global $window1 Global $window1events Global $window2 Global $window2events Global $button1 Global $button2 ; --------- ; Functions ; --------- ; window 1 Func _CreateWindow1() $window1 = GuiCreate("window 1", 180, 45) GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Window1_Close", $window1) $button1 = GUICtrlCreateButton("button 1", 60, 10, 60, 25) GUICtrlSetOnEvent($button1, "_Event_Window1_Button1") GUISetState(@SW_SHOW, $window1) GUISwitch($window1) $window1events = True While $window1events Sleep(1000) WEnd EndFunc Func _DestroyWindow1() $window1events = False GUISetState(@SW_HIDE, $window1) GuiDelete($window1) EndFunc Func _Event_Window1_Close() _DestroyWindow1() EndFunc Func _Event_Window1_Button1() _DestroyWindow1() _CreateWindow2() EndFunc ; window 2 Func _CreateWindow2() $window2 = GuiCreate("window 2", 180, 45) GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Window2_Close", $window2) $button2 = GUICtrlCreateButton("button 2", 60, 10, 60, 25) GUICtrlSetOnEvent($button2, "_Event_Window2_Button2") GUISetState(@SW_SHOW, $window2) GUISwitch($window2) $window2events = True While $window2events Sleep(1000) WEnd EndFunc Func _DestroyWindow2() $window2events = False GUISetState(@SW_HIDE, $window2) GuiDelete($window2) EndFunc Func _Event_Window2_Close() _DestroyWindow2() EndFunc Func _Event_Window2_Button2() _DestroyWindow2() _CreateWindow1() EndFunc ; ------- ; Runtime ; ------- _CreateWindow1() Edited June 17, 2011 by Psychoman Link to comment Share on other sites More sharing options...
guinness Posted June 15, 2011 Share Posted June 15, 2011 Have a look at the Wiki about Multiple GUI's >> http://www.autoitscript.com/wiki/Managing_Multiple_GUIs UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
Psychoman Posted June 16, 2011 Author Share Posted June 16, 2011 Thank for the tutorial. Although I have read it I still don't understand why my script isn't working. These are the differences I see: - The tutorial contains only 1 main loop In my script I have 2, one for handling the incoming events of each window - The tutorial always keeps 1 window active In my script only 1 window exists at the same time I'm sorry but I still don't understand why my script isn't working. Link to comment Share on other sites More sharing options...
BrewManNH Posted June 16, 2011 Share Posted June 16, 2011 Give this a try expandcollapse popup; -------- ; Includes ; -------- #include <GuiCOnstants.au3> ; ------- ; Options ; ------- AutoItSetOption("GUIOnEventMode", 1) ; --------- ; Variables ; --------- Global $window1 Global $window1events Global $window2 Global $window2events Global $button1 Global $button2 ; ------- ; Runtime ; ------- _CreateWindow1() While 1 Sleep(10) WEnd ; --------- ; Functions ; --------- ; window 1 Func _CreateWindow1() $window1 = GUICreate("window 1", 180, 45) GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Window1_Close", $window1) $button1 = GUICtrlCreateButton("button 1", 60, 10, 60, 25) GUICtrlSetOnEvent($button1, "_Event_Window1_Button1") GUISetState(@SW_SHOW, $window1) GUISwitch($window1) $window1events = True EndFunc ;==>_CreateWindow1 ; window 2 Func _CreateWindow2() $window2 = GUICreate("window 2", 180, 45) GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Window2_Close", $window2) $button2 = GUICtrlCreateButton("button 2", 60, 10, 60, 25) GUICtrlSetOnEvent($button2, "_Event_Window2_Button2") GUISetState(@SW_SHOW, $window2) GUISwitch($window2) $window2events = True EndFunc ;==>_CreateWindow2 Func _DestroyWindow1() $window1events = False GUISetState(@SW_HIDE, $window1) GUIDelete($window1) EndFunc ;==>_DestroyWindow1 Func _DestroyWindow2() $window2events = False GUISetState(@SW_HIDE, $window2) GUIDelete($window2) EndFunc ;==>_DestroyWindow2 Func _Event_Window1_Close() _DestroyWindow1() EndFunc ;==>_Event_Window1_Close Func _Event_Window1_Button1() _DestroyWindow1() _CreateWindow2() EndFunc ;==>_Event_Window1_Button1 Func _Event_Window2_Close() _DestroyWindow2() EndFunc ;==>_Event_Window2_Close Func _Event_Window2_Button2() _DestroyWindow2() _CreateWindow1() EndFunc ;==>_Event_Window2_Button2 If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Psychoman Posted June 16, 2011 Author Share Posted June 16, 2011 BrewManNH, your version works. Thanks a lot. Could you also tell me why? I'm unable to understand the mechanisms behind AutoIt. Link to comment Share on other sites More sharing options...
BrewManNH Posted June 16, 2011 Share Posted June 16, 2011 Your script was stuck in the second window's While loop so it wasn't looking for any key strokes, I got rid of the While loops inside the functions, and moved it to a common location, so both functions properly exit after they've created the GUI, and sit inside that external While loop waiting for you to hit a key. Because the second function never exits, the script is waiting before it activates the function 1. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Psychoman Posted June 16, 2011 Author Share Posted June 16, 2011 Your script was stuck in the second window's While loop so it wasn't looking for any key strokes OK, I can even confirm this. But why can Autoit handle looking for keystrokes in the first loop and not in the second? Actually it get's even stranger when I add loops to the first loop. It's possible to open the second window when I replace following code While $window1events Sleep(1000) WEnd with this code While $window1events Sleep(1000) While $window1events Sleep(1000) While $window1events Sleep(1000) WEnd WEnd WEnd This seem to indicate that Autoit can handle nested loops. Sorry but I'm a bit confused about the internal mechanisms of Autoit. Link to comment Share on other sites More sharing options...
BrewManNH Posted June 16, 2011 Share Posted June 16, 2011 Reread the tutorial on using multiple GUIs If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Psychoman Posted June 16, 2011 Author Share Posted June 16, 2011 Thank you for your patience BrewManNH. I read the tutorial again and had to study it before really understanding the content. Thanks again for putting an emphasis on the tutorial. Could you tell me if following summary is correct? When using the OnEventMode we can register controls (like buttons) with OnEventCalls (a function to be executed when the button is pressed) To do this we use the function GUICtrlSetOnEvent($controlId, "_OnEventExecuteThisFunction") A normal function can be interrupted by an OnEventCall. The normal function is paused and the OnEventCall (defined in _OnEventExecuteThisFunction) is executed. Once the OnEventCall has been executed, the normal function continues it's work. OnEventCalls can not be interrupted by other OnEventCalls. The idea is that OnEventCalls are queued by Autoit. An OnEventCall has to be completely executed before the next OnEventCall is executed. By consequence, the execution of an OnEventCall will stop controls from interacting with the code executed in the OnEventCall The previous quote is also applicable on the MessageLoopMode. In this case, an OnEventCall is a function call which resides in the same environment as the GUIGetMsg() statement. In following example While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $hButton_1 _Func_1() Case $hButton_2 _Func_2() EndSwitch WEndthe environment of the GUIGetMsg() statement starts at the Switch statement and ends at the WEnd statement. This means we have 2 OnEventCalls: - _Func_1() - _Func_2() Link to comment Share on other sites More sharing options...
BrewManNH Posted June 17, 2011 Share Posted June 17, 2011 The first quote is an expansion on what I was saying in my post. Once you got into the second function, it wasn't going to execute the onevent button push from the first function, because it's already in an onevent function that hasn't ended yet. You had to let the functions return before going into idle mode by the While loop, otherwise they get stuck like that. It's a very common mistake that gets made all the time, thinking you need a While loop in each function to keep that GUI running, instead of just using a common one to do it instead. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Psychoman Posted June 17, 2011 Author Share Posted June 17, 2011 Many more thanks to you BrewManNH for confirming the quotes. It took a while but I believe I'm starting to get a grip on this. Once again I got the opportunity to learn a lot from this great community. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now