Jump to content

Mainform is set to "Hide"


Recommended Posts

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?

#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.

Link to comment
Share on other sites

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

#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 by benners
Link to comment
Share on other sites

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 by Valnurat

Yours sincerely

Kenneth.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

#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 by benners
Link to comment
Share on other sites

This is working, but do I really have to do this?

#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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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:

#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 by therks
Link to comment
Share on other sites

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 :doh: Bad Dobby!

Link to comment
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
 Share

×
×
  • Create New...