Valnurat Posted March 1, 2017 Posted March 1, 2017 I have a mainform with a listview and a button. If I press the button a childform is showed. If I press the [X] in the childform, childform is deleted, but the mainform set to "BringsToBack" or is getting "hide" back of the other applications that's running on my computer. I hope you understand what I mean. How can I avoid that for happing? expandcollapse popup#include <GuiListView.au3> #include <GUIConstantsEx.au3> Global $idListview, $idOKay, $hMainForm, $idNewEntry, $idEditEntry, $aMsg, $hNewEntry, $idNewOKay, $idNewCancel _MainFormCreate() _Main() Func _MainFormCreate() ; Create GUI $hMainForm = GUICreate("Computer Asset", 1027, 400) $idListview = GUICtrlCreateListView("", 2, 2, 1024, 268,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT)) ; Add columns _GUICtrlListView_AddColumn($idListview, "Computername", 100,2) _GUICtrlListView_AddColumn($idListview, "Tkt No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Req No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Order Date", 100,2) _GUICtrlListView_AddColumn($idListview, "Costcenter", 100,2) _GUICtrlListView_AddColumn($idListview, "Username", 100,2) _GUICtrlListView_AddColumn($idListview, "Model", 100,2) _GUICtrlListView_AddColumn($idListview, "Current Location", 100,2) _GUICtrlListView_AddColumn($idListview, "Option", 100,2) _GUICtrlListView_AddColumn($idListview, "Shipdate", 100,2) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) GUISetState() EndFunc Func _NewFormCreate() $hNewEntry = GUICreate("Create New", 500, 500, -1, -1,-1,-1,$hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) GUISetState() EndFunc Func _Main() While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hMainForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop Case $idNewEntry _NewFormCreate() GUISetState(@SW_DISABLE,$hMainForm) Case $idListview MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2) EndSwitch Case $hNewEntry Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hNewEntry) GUISetState(@SW_ENABLE, $hMainForm) EndSwitch EndSwitch WEnd GUIDelete() EndFunc Yours sincerely Kenneth.
benners Posted March 1, 2017 Posted March 1, 2017 Change this portion of the code to activate the gui Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hNewEntry) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) ; activates the window EndSwitch
Valnurat Posted March 1, 2017 Author Posted March 1, 2017 I did think about that too, but is it necessary to use that kind of trix? Yours sincerely Kenneth.
benners Posted March 1, 2017 Posted March 1, 2017 (edited) 1 hour ago, Valnurat said: I did think about that too, but is it necessary to use that kind of trix? It's one way to do it, give the window focus. Another way would be instead if disabling the mainform, you could hide it then show it after. You can just change the GUISetState parameters you already use expandcollapse popup#include <GuiListView.au3> #include <GUIConstantsEx.au3> Global $idListview, $idOKay, $hMainForm, $idNewEntry, $idEditEntry, $aMsg, $hNewEntry, $idNewOKay, $idNewCancel _MainFormCreate() _Main() Func _MainFormCreate() ; Create GUI $hMainForm = GUICreate("Computer Asset", 1027, 400) $idListview = GUICtrlCreateListView("", 2, 2, 1024, 268,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT)) ; Add columns _GUICtrlListView_AddColumn($idListview, "Computername", 100,2) _GUICtrlListView_AddColumn($idListview, "Tkt No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Req No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Order Date", 100,2) _GUICtrlListView_AddColumn($idListview, "Costcenter", 100,2) _GUICtrlListView_AddColumn($idListview, "Username", 100,2) _GUICtrlListView_AddColumn($idListview, "Model", 100,2) _GUICtrlListView_AddColumn($idListview, "Current Location", 100,2) _GUICtrlListView_AddColumn($idListview, "Option", 100,2) _GUICtrlListView_AddColumn($idListview, "Shipdate", 100,2) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) GUISetState() EndFunc Func _NewFormCreate() $hNewEntry = GUICreate("Create New", 500, 500, -1, -1,-1,-1,$hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) GUISetState() EndFunc Func _Main() While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hMainForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop Case $idNewEntry _NewFormCreate() ;~ GUISetState(@SW_DISABLE,$hMainForm) GUISetState(@SW_HIDE,$hMainForm) Case $idListview MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2) EndSwitch Case $hNewEntry Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hNewEntry) ;~ GUISetState(@SW_ENABLE, $hMainForm) GUISetState(@SW_SHOW, $hMainForm) EndSwitch EndSwitch WEnd GUIDelete() EndFunc Edited March 1, 2017 by benners
Valnurat Posted March 1, 2017 Author Posted March 1, 2017 (edited) Ok. I see your point. Thank you. I hope I can ask another question that's off topic. If I add this: Func _MainFormCreate() ; Create GUI $hMainForm = GUICreate("Computer Asset", 1027, 400) $idListview = GUICtrlCreateListView("", 2, 2, 1024, 268,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT)) ; Add columns _GUICtrlListView_AddColumn($idListview, "Computername", 100,2) _GUICtrlListView_AddColumn($idListview, "Tkt No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Req No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Order Date", 100,2) _GUICtrlListView_AddColumn($idListview, "Costcenter", 100,2) _GUICtrlListView_AddColumn($idListview, "Username", 100,2) _GUICtrlListView_AddColumn($idListview, "Model", 100,2) _GUICtrlListView_AddColumn($idListview, "Current Location", 100,2) _GUICtrlListView_AddColumn($idListview, "Option", 100,2) _GUICtrlListView_AddColumn($idListview, "Shipdate", 100,2) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) $idEditEntry = GUICtrlCreateButton("Edit", 410, 290, 85, 25) ;<------- This GUISetState(@SW_SHOW,$hMainForm) EndFunc Case $hNewEntry Switch $aMsg[0] Case $GUI_EVENT_CLOSE GUIDelete($hNewEntry) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idNewCancel ;<----------------------- And this msgbox(0,"","test") ;<----------------------- and this EndSwitch Func _NewFormCreate() $hNewEntry = GUICreate("Create New", 500, 500, -1, -1,-1,-1,$hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) ;<--- and this GUISetState(@SW_SHOW, $hNewEntry) EndFunc and I run it. It shows me the msgbox as the 1st thing on top of my mainform. No matter if a press the ok button on the msgbox it still show me the msgbox. How can that be? Edited March 1, 2017 by Valnurat Yours sincerely Kenneth.
benners Posted March 1, 2017 Posted March 1, 2017 During the while loop, GUIGetMsg is polled to see if any actions have happened. The values in aMsg do change (not sure why, maybe in built sleep returns something?) and one of the changes is the window handle the event is from returns 0, this triggers the switch case to check for controls matching that value. When you initialize the Global variables there are no values for the variables. The default it used, which is 0. As $hNewEntry is 0, it matches in the loop and fires events based on the control. The buttons are also 0 which then fires the msgbox. If you add a msgbox to the $idNewOKay button this will fire before the test msgbox. To stop this from happening set $hNewEntry to non zero, like 999 this will stop the event firing, when the gui is created in _NewFormCreate a handle will be returned which will replaced the 999. Global $idListview, $idOKay, $hMainForm, $idNewEntry, $idEditEntry, $aMsg, $hNewEntry = 999, $idNewOKay, $idNewCancel
Valnurat Posted March 2, 2017 Author Posted March 2, 2017 So you are telling me that this is a commen and known error? Yours sincerely Kenneth.
benners Posted March 2, 2017 Posted March 2, 2017 (edited) No it's not an error. Looking at the help file if no event has occurred GUIGetMsg returns $GUI_EVENT_NONE whose value is 0, (all the values in the array are 0). As your second GUI hasn't been created and you don't assign it a value it is given one ($hNewEntry = 0). The switch value is then 0 which matches Case $hNewEntry. The next Switch value is 0 so matches the first control who's value is 0 expandcollapse popup#include <GuiListView.au3> #include <GUIConstantsEx.au3> #include <array.au3> Global $idListview, $idOKay, $hMainForm, $idNewEntry, $idEditEntry, $aMsg, $hNewEntry, $idNewOKay, $idNewCancel ;~ Global $idListview, $idOKay, $hMainForm, $idNewEntry, $idEditEntry, $aMsg, $hNewEntry = 999, $idNewOKay, $idNewCancel _MainFormCreate() _Main() Func _MainFormCreate() ; Create GUI $hMainForm = GUICreate("Computer Asset", 1027, 400) $idListview = GUICtrlCreateListView("", 2, 2, 1024, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT)) ; Add columns _GUICtrlListView_AddColumn($idListview, "Computername", 100, 2) _GUICtrlListView_AddColumn($idListview, "Tkt No.", 100, 2) _GUICtrlListView_AddColumn($idListview, "Req No.", 100, 2) _GUICtrlListView_AddColumn($idListview, "Order Date", 100, 2) _GUICtrlListView_AddColumn($idListview, "Costcenter", 100, 2) _GUICtrlListView_AddColumn($idListview, "Username", 100, 2) _GUICtrlListView_AddColumn($idListview, "Model", 100, 2) _GUICtrlListView_AddColumn($idListview, "Current Location", 100, 2) _GUICtrlListView_AddColumn($idListview, "Option", 100, 2) _GUICtrlListView_AddColumn($idListview, "Shipdate", 100, 2) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) $idEditEntry = GUICtrlCreateButton("Edit", 410, 290, 85, 25) GUISetState() EndFunc ;==>_MainFormCreate Func _NewFormCreate() $hNewEntry = GUICreate("Create New", 500, 500, -1, -1, -1, -1, $hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) ;<--- and this GUISetState() EndFunc ;==>_NewFormCreate Func _Main() While 1 $aMsg = GUIGetMsg(1) ; has anything happened? Switch $aMsg[1] ; no so $aMsg[1] = 0 Case $hMainForm ; I have been created so I have a handle and it isn't 0 Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop Case $idNewEntry _NewFormCreate() GUISetState(@SW_HIDE, $hMainForm) Case $idListview MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2) EndSwitch Case $hNewEntry ; I haven't been created so no handle, and I haven't been assigned a non zero value. So I match $aMsg[1] Switch $aMsg[0] ; I am zero Case $GUI_EVENT_CLOSE ; I am -3 so I don't match the switch value GUIDelete($hNewEntry) GUISetState(@SW_SHOW, $hMainForm) case $idNewOKay ; I am 0 as I haven't been created so no ID and I haven't been assigned a non zero value when declared (Global $hNewEntry). So I match $aMsg[0] MsgBox(0,'ok', 'ok') Case $idNewCancel ; I am 0 as I haven't been created so no ID and I haven't been assigned a non zero value So I match $aMsg[0] MsgBox(0, "", "cancel") EndSwitch EndSwitch WEnd GUIDelete() EndFunc ;==>_Main This is as I understand it. Hopefully I have explained it correctly. Edited March 2, 2017 by benners
Valnurat Posted March 3, 2017 Author Posted March 3, 2017 So you are telling me that everyone that is using more forms than 1 and as child, are setting the variables to non zero, for this not to happen? Yours sincerely Kenneth.
Valnurat Posted March 3, 2017 Author Posted March 3, 2017 This is working, but do I really have to do this? expandcollapse popup#include <GuiListView.au3> #include <GUIConstantsEx.au3> Global $idListview, $aMsg Global $hMainForm, $idNewEntry, $idEditEntry Global $hEditForm = 999, $idEditCancel, $idEditOKay Global $hNewForm = 999, $idNewOKay, $idNewCancel _MainFormCreate() _Main() Func _MainFormCreate() ; Create GUI $hMainForm = GUICreate("Computer Asset", 1027, 400) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) $idEditEntry = GUICtrlCreateButton("Edit", 410, 290, 85, 25) GUISetState(@SW_SHOW,$hMainForm) EndFunc Func _NewFormCreate() $hNewForm = GUICreate("Create New", 500, 500, -1, -1,-1,-1,$hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) GUISetState(@SW_SHOW, $hNewForm) EndFunc Func _EditFormCreate() $hEditForm = GUICreate("Edit", 500, 500, -1, -1,-1,-1,$hMainForm) $idEditOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idEditCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) GUISetState(@SW_SHOW, $hEditForm) EndFunc Func _Main() While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hMainForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop Case $idNewEntry msgbox(0,"NewEntry",$aMsg[1] & @CRLF & $aMsg[0]) GUISetState(@SW_DISABLE, $hMainForm) _NewFormCreate() Case $idEditEntry msgbox(0,"EditEntry",$aMsg[1] & @CRLF & $aMsg[0]) GUISetState(@SW_DISABLE, $hMainForm) _EditFormCreate() EndSwitch Case $hEditForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE msgbox(0,"GUI_EVENT_CLOSE",$aMsg[0] & @CRLF & $aMsg[1]) GUIDelete($hEditForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idEditCancel msgbox(0,"EditCancel",$aMsg[0] & @CRLF & $aMsg[1]) GUIDelete($hEditForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idEditOKay msgbox(0,"EditOKay",$aMsg[0] & @CRLF & $aMsg[1]) EndSwitch Case $hNewForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE msgbox(0,"GUI_EVENT_CLOSE",$aMsg[0] & @CRLF & $aMsg[1]) GUIDelete($hNewForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idNewCancel msgbox(0,"NC",$aMsg[0] & @CRLF & $aMsg[1]) GUIDelete($hNewForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idNewOKay msgbox(0,"NewOKay",$aMsg[0] & @CRLF & $aMsg[1]) EndSwitch EndSwitch WEnd GUIDelete() EndFunc Yours sincerely Kenneth.
benners Posted March 4, 2017 Posted March 4, 2017 On 03/03/2017 at 11:22 AM, Valnurat said: This is working, but do I really have to do this? Unless you want the the msgboxes popping up all the time. You don't have to use 999, any non zero positive number should work. You could also draw the forms $hEditForm etc and hide them until needed. When the GUI is created it will assign a handle to the $hEditForm variable and this will also stop the msgbox code (or any other) from running
therks Posted March 5, 2017 Posted March 5, 2017 (edited) I personally think the best way to do a multi GUI script is to build out the entire GUI first and then just show/hide windows as you need them, but barring that, you could simply handle the $GUI_EVENT_NONE value before the others and have it skip the loop, then it will bypass even checking those uninitialized variables. #include <GUIConstantsEx.au3> Global $id_Uninitialized GUICreate('', 300, 200) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_NONE ContinueLoop Case $id_Uninitialized MsgBox(0, '', 'This will never happen, until the variable is non-zero.') Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd *** And just to provide an example of prebuilding the whole GUI, I whipped this up: expandcollapse popup#include <GuiListView.au3> #include <GUIConstantsEx.au3> Global $idListview, $aMsg Global $hMainForm, $idNewEntry, $idEditEntry Global $hEditForm, $idEditCancel, $idEditOKay Global $hNewForm, $idNewOKay, $idNewCancel _Main() Func _Main() $hMainForm = GUICreate("Computer Asset", 1027, 400) $idNewEntry = GUICtrlCreateButton("New", 310, 290, 85, 25) $idEditEntry = GUICtrlCreateButton("Edit", 410, 290, 85, 25) GUISetState(@SW_SHOW,$hMainForm) $hNewForm = GUICreate("Create New", 500, 500, -1, -1,-1,-1,$hMainForm) $idNewOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idNewCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) $hEditForm = GUICreate("Edit", 500, 500, -1, -1,-1,-1,$hMainForm) $idEditOKay = GUICtrlCreateButton("Ok", 110, 290, 85, 25) $idEditCancel = GUICtrlCreateButton("Cancel", 310, 290, 85, 25) While 1 $aMsg = GUIGetMsg(1) Switch $aMsg[1] Case $hMainForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE ExitLoop Case $idNewEntry msgbox(0,"NewEntry",$aMsg[1] & @CRLF & $aMsg[0]) GUISetState(@SW_DISABLE, $hMainForm) GUISetState(@SW_SHOW, $hNewForm) Case $idEditEntry msgbox(0,"EditEntry",$aMsg[1] & @CRLF & $aMsg[0]) GUISetState(@SW_DISABLE, $hMainForm) GUISetState(@SW_SHOW, $hEditForm) EndSwitch Case $hEditForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE msgbox(0,"GUI_EVENT_CLOSE",$aMsg[0] & @CRLF & $aMsg[1]) GUISetState(@SW_HIDE, $hEditForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idEditCancel msgbox(0,"EditCancel",$aMsg[0] & @CRLF & $aMsg[1]) GUISetState(@SW_HIDE, $hEditForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idEditOKay msgbox(0,"EditOKay",$aMsg[0] & @CRLF & $aMsg[1]) EndSwitch Case $hNewForm Switch $aMsg[0] Case $GUI_EVENT_CLOSE msgbox(0,"GUI_EVENT_CLOSE",$aMsg[0] & @CRLF & $aMsg[1]) GUISetState(@SW_HIDE, $hNewForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idNewCancel msgbox(0,"NC",$aMsg[0] & @CRLF & $aMsg[1]) GUISetState(@SW_HIDE, $hNewForm) GUISetState(@SW_ENABLE, $hMainForm) WinActivate($hMainForm) Case $idNewOKay msgbox(0,"NewOKay",$aMsg[0] & @CRLF & $aMsg[1]) EndSwitch EndSwitch WEnd GUIDelete() EndFunc Edited March 5, 2017 by therks My AutoIt Stuff | My Github
benners Posted March 5, 2017 Posted March 5, 2017 1 hour ago, therks said: I personally think the best way to do a multi GUI script is to build out the entire GUI first and then just show/hide windows as you need them, but barring that, you could simply handle the $GUI_EVENT_NONE value before the others and have it skip the loop, then it will bypass even checking those uninitialized variables That's how I normally do multiple GUI's if it is going to be frequently used. If not, then I'll draw it when needed. Didn't even cross my mind to handle the $GUI_EVENT_NONE Bad Dobby!
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