Jump to content
baconaise

Buttons Aiming to Unintended Targets

Recommended Posts

Greetings!

Will someone please tell me why buttons 2-1 and 3-1 seem to respond as though they are button 1-1, and why buttons 2-2 and 3-2 seem to respond as though they are button 1-2?

 

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)

Func Create_Main_GUI()
   Global $Main_GUI = GUICreate("Main GUI", 200, 120)
   GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting_Function")
   Global $Main_GUI_Button_1 = GUICtrlCreateButton("Main Button 1", 0, 0, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   Global $Main_GUI_Button_2 = GUICtrlCreateButton("Main Button 2", 0, 40, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   Global $Main_GUI_Button_3 = GUICtrlCreateButton("Main Button 3", 0, 80, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
EndFunc

Func Do_Events_Specified_By_Which_Button_Was_Pushed()
   Switch @GUI_CtrlId
   Case $Main_GUI_Button_1
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            Global $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               Global $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_2
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            Global $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               Global $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_3
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            Global $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               Global $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Kill_Secondary_Selection_Window
         GUIDelete($Secondary_Selection_Window)
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3")
   EndSwitch
EndFunc

Func Exiting_Function()
   Exit
EndFunc

Create_Main_GUI()
GUISetState(@SW_SHOW, $Main_GUI)

While 1
   Sleep(10)
WEnd

 

Share this post


Link to post
Share on other sites

Hey, having global variables inside a function may be causing.

Try putting global declarations outside at the top, and assign to variable only inside the function.

Share this post


Link to post
Share on other sites

Thanks for the suggestion. I rewrote it as you suggested, but it is still suffering from the same problem: The buttons on the Secondary Selection Window are all behaving as though the first button clicked is $Main_GUI_Button_1, regardless of if you click $Main_GUI_Button_1, $Main_GUI_Button_2, or $Main_GUI_Button_3.

 

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)

Func Declare_All_The_Variables()
   Global $Main_GUI
   Global $Main_GUI_Button_1
   Global $Main_GUI_Button_2
   Global $Main_GUI_Button_3
   Global $Secondary_Selection_Window
   Global $Kill_Secondary_Selection_Window
   Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1
   Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1
   Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2
   Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2
   Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3
   Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3
EndFunc

Func Create_Main_GUI()
   $Main_GUI = GUICreate("Main GUI", 200, 120)
   GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting_Function")
   $Main_GUI_Button_1 = GUICtrlCreateButton("Main Button 1", 0, 0, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   $Main_GUI_Button_2 = GUICtrlCreateButton("Main Button 2", 0, 40, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   $Main_GUI_Button_3 = GUICtrlCreateButton("Main Button 3", 0, 80, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
EndFunc

Func Do_Events_Specified_By_Which_Button_Was_Pushed()
   Switch @GUI_CtrlId
   Case $Main_GUI_Button_1
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_2
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_3
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Kill_Secondary_Selection_Window
         GUIDelete($Secondary_Selection_Window)
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3")
   EndSwitch
EndFunc

Func Exiting_Function()
   Exit
EndFunc

Declare_All_The_Variables()
Create_Main_GUI()
GUISetState(@SW_SHOW, $Main_GUI)

While 1
   Sleep(10)
WEnd

 

Share this post


Link to post
Share on other sites

They are still within a function :)

More like this. Don't need the GUI stuff ina  function I believe but this looks neater to me, idk.

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)


Global $Main_GUI
Global $Main_GUI_Button_1
Global $Main_GUI_Button_2
Global $Main_GUI_Button_3
Global $Secondary_Selection_Window
Global $Kill_Secondary_Selection_Window
Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1
Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1
Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2
Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2
Global $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3
Global $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3

Create_Main_GUI()

Func Create_Main_GUI()
   $Main_GUI = GUICreate("Main GUI", 200, 120)
   GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting_Function")
   $Main_GUI_Button_1 = GUICtrlCreateButton("Main Button 1", 0, 0, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   $Main_GUI_Button_2 = GUICtrlCreateButton("Main Button 2", 0, 40, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
   $Main_GUI_Button_3 = GUICtrlCreateButton("Main Button 3", 0, 80, 200, 40)
      GUICtrlSetOnEvent($Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")

    GUISetState(@SW_SHOW, $Main_GUI)

    While 1
       Sleep(10)
    WEnd

EndFunc

Func Do_Events_Specified_By_Which_Button_Was_Pushed()
   Switch @GUI_CtrlId
   Case $Main_GUI_Button_1
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1 = GUICtrlCreateButton("Choice 1-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_2
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2 = GUICtrlCreateButton("Choice 2-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Main_GUI_Button_3
         Local $Mouse_Position = MouseGetPos()
         If Not WinExists("Secondary Selection Window") Then
            $Secondary_Selection_Window = GUICreate("Secondary Selection Window", 160, 69, $Mouse_Position[0] - 80, $Mouse_Position[1] - 10, $WS_POPUPWINDOW)
               $Kill_Secondary_Selection_Window = GUICtrlCreateButton("X", 0, 0, 160, 23)
                  GUICtrlSetOnEvent($Kill_Secondary_Selection_Window, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-1", 0, 23, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
               $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3 = GUICtrlCreateButton("Choice 3-2", 0, 46, 160, 23)
                  GUICtrlSetOnEvent($Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3, "Do_Events_Specified_By_Which_Button_Was_Pushed")
            WinSetOnTop($Secondary_Selection_Window, "", $WINDOWS_ONTOP)
            GUISetState(@SW_SHOW, $Secondary_Selection_Window)
         EndIf
      Case $Kill_Secondary_Selection_Window
         GUIDelete($Secondary_Selection_Window)
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 1-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 2-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2")
      Case $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-1", "$Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3")
      Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3
         GUIDelete($Secondary_Selection_Window)
         MsgBox($MB_OK,"You selected 3-2", "$Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3")
   EndSwitch
EndFunc

Func Exiting_Function()
   Exit
EndFunc

 

Share this post


Link to post
Share on other sites

The GuiDelete deletes all control ids.  When you recreate them, it will take place of the empty spaces number.  So in your case, it thinks it is always first main button.  So you should create all secondary windows at first then hide and show appropriately.  That way all control ids will have different numbers.

Share this post


Link to post
Share on other sites
49 minutes ago, Nine said:

The GuiDelete deletes all control ids.  When you recreate them, it will take place of the empty spaces number.  So in your case, it thinks it is always first main button.  So you should create all secondary windows at first then hide and show appropriately.  That way all control ids will have different numbers.

That makes sense! Thank you. My actual purpose would require something like 300 GUIs to do that--have any cleaner way to do that?

Share this post


Link to post
Share on other sites

If you run the script from Scite, then you can debug with ConsoleWrite() showing all control ID's.
Here is what you will find :

Func Do_Events_Specified_By_Which_Button_Was_Pushed()

    Switch @GUI_CtrlId
        Case $Main_GUI_Button_1

        Case ...

        Case $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3

    EndSwitch
 
    ConsoleWrite( _
        $Main_GUI_Button_1 & "   " & _
        $Main_GUI_Button_2 & "   " & _
        $Main_GUI_Button_3 & "   " & _
        $Kill_Secondary_Selection_Window & "   " & _
        $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1 & "   " & _
        $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1 & "   " & _
        $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_2 & "   " & _
        $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_2 & "   " & _
        $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_3 & "   " & _
        $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_3 & "   " & @CRLF)

EndFunc

Console result :

3   4   5   6                   7   8   
3   4   5   6                   7   8   
3   4   5   6           7   8   7   8   
3   4   5   6           7   8   7   8   
3   4   5   6   7   8   7   8   7   8   
3   4   5   6   7   8   7   8   7   8

Id's 3, 4, 5 are always for $Main_GUI_Button_1, $Main_GUI_Button_2, $Main_GUI_Button_3
Id 6 is always for $Kill_Secondary_Selection_Window
Issue comes for Id's 7 and 8 which will be soon triplicated in your function.

The console result (above) shows what happens when you click in this specific order :
* Main Button 3 => choice 3-1 (message box is correct) then
* Main Button 2 => choice 2-1 (message box is correct) then
* Main Button 1 => choice 1-1 (message box is correct)

At this stage, you notice that several variables (Case) got the same value in your function and the "first" id's 7 and 8 which will be first accessed correspond to :
* $Secondary_Selection_Window_Choice_1_Spawned_From_Main_GUI_Button_1 = 7
* $Secondary_Selection_Window_Choice_2_Spawned_From_Main_GUI_Button_1 = 8

Which means that from now on, all clicks on main button 2 & 3 will display wrong results.
It's important to remember that deleting a GUI doesn't "blank" the variables assigned to the deleted id's

I had a similar problem once with this kind of script :

$hGUI_Preview = GUICreate(...)
...
GUIDelete($hGUI_Preview)
...
If $hGUI_Preview Then ; very bad !

It's bad because deleting the GUI doesn't blank $hGUI_Preview which still contains a value until the end of time. If one really needs the "If" test, then It can be scripted like this :

$hGUI_Preview = GUICreate(...)
...
GUIDelete($hGUI_Preview)
$hGUI_Preview = 0 ; <=============
...
If $hGUI_Preview Then ; now it's ok

 

Edited by pixelsearch
I saw you just answered to Nine, anyway I'll keep my answer as-is

Share this post


Link to post
Share on other sites
11 hours ago, baconaise said:

My actual purpose would require something like 300 GUIs to do that--have any cleaner way to do that?

One way would be to save the control ids in a MAP array that you can delete easily after usage :

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=Beta
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>

Create_Main_GUI()

Func Create_Main_GUI()
  Local $mGUI[]

  Local $hGUI = GUICreate("Main GUI", 200, 120)
  Local $idMain1 = GUICtrlCreateButton("Main 1", 0, 0, 200, 40)
  Local $idMain2 = GUICtrlCreateButton("Main 2", 0, 40, 200, 40)
  Local $idMain3 = GUICtrlCreateButton("Main 3", 0, 80, 200, 40)
  GUISetState()

  Local $aPos, $nMsg, $idKill, $aKeys

  While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
      Case $GUI_EVENT_NONE  ; not truly necessary, but avoid triggering Case Else for nothing
      Case $GUI_EVENT_CLOSE
        ExitLoop
      Case $idMain1
        If Not WinExists("Secondary Window") Then
          $aPos = MouseGetPos()
          $hWindow2 = GUICreate("Secondary Window", 160, 69, $aPos[0] - 80, $aPos[1] - 10, $WS_POPUPWINDOW)
          $idKill = GUICtrlCreateButton("X", 0, 0, 160, 23)
          $mGUI["Choice 1-1"] = GUICtrlCreateButton("Choice 1-1", 0, 23, 160, 23)
          $mGUI["Choice 1-2"] = GUICtrlCreateButton("Choice 1-2",  0, 46, 160, 23)
          WinSetOnTop($hWindow2, "", $WINDOWS_ONTOP)
          GUISetState(@SW_SHOW, $hWindow2)
        EndIf
      Case $idMain2
        If Not WinExists("Secondary Window") Then
          $aPos = MouseGetPos()
          $hWindow2 = GUICreate("Secondary Window", 160, 69, $aPos[0] - 80, $aPos[1] - 10, $WS_POPUPWINDOW)
          $idKill = GUICtrlCreateButton("X", 0, 0, 160, 23)
          $mGUI["Choice 2-1"] = GUICtrlCreateButton("Choice 2-1", 0, 23, 160, 23)
          $mGUI["Choice 2-2"] = GUICtrlCreateButton("Choice 2-2",  0, 46, 160, 23)
          WinSetOnTop($hWindow2, "", $WINDOWS_ONTOP)
          GUISetState(@SW_SHOW, $hWindow2)
        EndIf
      Case $idMain3
        If Not WinExists("Secondary Window") Then
          $aPos = MouseGetPos()
          $hWindow2 = GUICreate("Secondary Window", 160, 69, $aPos[0] - 80, $aPos[1] - 10, $WS_POPUPWINDOW)
          $idKill = GUICtrlCreateButton("X", 0, 0, 160, 23)
          $mGUI["Choice 3-1"] = GUICtrlCreateButton("Choice 3-1", 0, 23, 160, 23)
          $mGUI["Choice 3-2"] = GUICtrlCreateButton("Choice 3-2",  0, 46, 160, 23)
          WinSetOnTop($hWindow2, "", $WINDOWS_ONTOP)
          GUISetState(@SW_SHOW, $hWindow2)
        EndIf
      Case $idKill
        GUIDelete($hWindow2)
        Local $mGUI[]
      Case Else
        $aKeys = MapKeys($mGUI)
        For $i = 0 to UBound($aKeys)-1
          If $mGUI[$aKeys[$i]] = $nMsg Then MsgBox ($MB_SYSTEMMODAL,"Info", "Button " & $aKeys[$i] & " was pressed !")
        Next
    EndSwitch
  WEnd
EndFunc

Sorry I had to rewrite much of it as I cannot stand very long var names ;)

ps. I could have streamlined $idMain1 to $idMain3 as only a few numbers differs , but I will leave it to you if you want.

Share this post


Link to post
Share on other sites

Thx Nine for your script above, based on Map variables. As I never used them before, it forced me to start study them :)

* First learning was from the help file (AutoIt Beta v3.3.15.3, NOT our actual stable version 3.3.14.5)
7 topics found, i.e. the crucial "Language Reference - variables (maps)", then 4 functions MapAppend, MapExists, MapKeys, MapRemove, not forgetting IsMap() and UBound()

* Then your script above, it was ingenious during the Case Else to retrieve the Map keys from the Map values, great !

2 observations I'd like to share concerning the script :

Case $GUI_EVENT_NONE  ; not truly necessary, but avoid triggering Case Else for nothing

In fact, as soon as this line is commented, a fatal error happens because Case $idKill is immediately triggered ($îdKill being assimilated to 0, just as $GUI_EVENT_NONE) and GUIDelete($hWindow2) generates now the fatal error ("Variable used without being declared")

This being said, even with Case $GUI_EVENT_NONE active, we'll notice that Case Else is triggered many times as shown below, where a counter has been added :

Local $iCounter = 0 ; to be placed before the While...Wend loop
...
Case Else
    $iCounter += 1
    ConsoleWrite($iCounter & " ")
    $aKeys = MapKeys($mGUI)
    ...

Console display :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30...

This should fix it :

Case $GUI_EVENT_NONE, $GUI_EVENT_MOUSEMOVE ; 0 & -11

Aargghhh, I notice there's a new version of your animated gif script, great ! ...but lunch & coffee first :bye:

Share this post


Link to post
Share on other sites
40 minutes ago, pixelsearch said:

fatal error happens because Case $idKill is immediately triggered

Ya good point.  We could simply initialize $idKill to -999 to eliminate any risk in the future development of the script.

42 minutes ago, pixelsearch said:

Case $GUI_EVENT_NONE, $GUI_EVENT_MOUSEMOVE

Yep another good point, we can just add any unless events in fact...

Share this post


Link to post
Share on other sites
1 hour ago, Nine said:

we can just add any unless events in fact...

Nah... no need, other events are just triggered from time to time during the While...Wend loop, a right click here and there, a minimize/restore from time to time etc... The 2 events that happen hundred of times are (almost) always $GUI_EVENT_NONE and $GUI_EVENT_MOUSEMOVE

Share this post


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.

×
×
  • Create New...