Jump to content
Sign in to follow this  
hannes08

GUIOnEvent and Variable number of Controls

Recommended Posts

hannes08

Hi Folks,

maybe this is a stupid question, but anyway here it goes.

I have a Script in GUI mode running on event mode.

I also have a variable number of buttons the user may press.

This is an example of how I'm doing it right now:

Dim $aButtons[4]

Opt("GUIOnEventMode", 1)
GUICreate("MyGUI", 800, 600, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_THICKFRAME, $WS_MAXIMIZEBOX))
GuiSetOnEvent($GUI_EVENT_CLOSE, "ClickClose")
_CreateButtons(4)
GUISetState(@SW_SHOW)

While 1
    Sleep(1000)
WEnd

Func _CreateButtons($iAmount)
    Local $x, $y
    For $i = 1 To $iAmount
        $aButtons[$i] = GUICtrlCreateButton("Button " & $i,  10 + $i * 50, 30 + $y, 40, 40)
        GuiCtrlSetOnEvent(-1, "ClickButton" & $i)
        If $i >= $iAmount / 2 Then $y = 70
    Next
EndFunc

Func ClickClose()
    Exit
EndFunc

Func ClickButton1()
    _ClickedButton(1)
EndFunc

Func ClickButton2()
    _ClickedButton(2)
EndFunc

Func ClickButton3()
    _ClickedButton(3)
EndFunc

Func ClickButton4()
    _ClickedButton(4)
EndFunc

Func _clickedButton($id)
    ConsoleWrite("Well, now you've clicked on " & $id & @CRLF)
EndFunc

The "problem" is that I need to create a function for each button, which I believe is suboptimal. :)

The amount of available buttons is configurable over an ini file, so it's not hard-coded as in the example.

Any hint is appreciated.


Regards,Hannes[spoiler]If you can't convince them, confuse them![/spoiler]

Share this post


Link to post
Share on other sites
Warsaw

Try changing it like this:

GuiCtrlSetOnEvent(-1, "ClickButton")

Func ClickButton()
For $i = 1 To $iAmount
  If @GUI_CtrlId = $aButtons[$i] Then _clickedButton($i)
Next
EndFunc

I use this method for something I made and it works well.

Edited by Warsaw

Share this post


Link to post
Share on other sites
hannes08

Hi Warsaw,

I'll look into this tomorrow. Thanks for the hint! :)

Edit: Works like a charm :D

Thanks a lot this saves me many lines of code :D

Edited by hannes08

Regards,Hannes[spoiler]If you can't convince them, confuse them![/spoiler]

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
Sign in to follow this  

  • Similar Content

    • Slipk
      By Slipk
      Hello everyone,
      I have a problem that from the title may sound a little bit confusing.
       
      I have a listview interface with a context menu and as you know it's working only if GuiOnEventMode is enabled.
      However, I need a script that can check whenever the user right click on a listview item and automatically enable GuiOnEventMode to make the function run when he click menu item.
      I have some buttons next to listview that need to work while this is possible too.
       
      It this even can be done?
      Thank you and sorry for my bad english.
    • timmy2
      By timmy2
      I have the impression that the traditional method for processing responses to a GUI is to assign variables to each GUICreateButton (or Pic) and then use Switch/Case/Endswitch to detect when any Control is clicked.  In the tutorials I've seen about Koda it appears to use this method, too.
      While 1 Global $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Pic2 Call("verizon") Case $Pic3 Call("skype") Case $PicExit Exit EndSwitch WEnd But in a few examples I've seen a script use a different method. The script always includes the following option near the top:
      Opt("GUIOnEventMode", 1) ...and then, later, after creating each Control for the GUI, there's the function, GUICtrlSetOnEvent.  In these cases a very simple While/WEnd loop is used to wait for the user to respond. 
      I happened to employ this second method in a recent script where I used "canned" controls (checkbox and buttons). Later in the same script I used the GuiCreatePic and Switch/Case/EndSwitch method because my GUI was all custom images. (I'm not sure if that's necessary, but it's what I've deduced.) The second GUI failed to respond to any mouse clicks, but eventually I figured out the cause was the GUIOnEvenMode being enabled at the top of the script.
      This is when I realized I don't understand the reasoning behind choosing between these two methods. And I'm having no luck phrasing an appropriate search criterion. Is there an overview somewhere that explains the two methods and -- most importantly -- describes when each is appropriate?
    • Mannyfresh31
      By Mannyfresh31
      Hello everybody I need help with Opt("GUIOnEventMode",1) 
      I Normally use GUIGetMsg() but I want to learn how GUIOnEventMode works so I created a little test GUI the start button works fine and everything but the problem is that the stop button won't work down below is the code  I made and I'm wondering if someone with experience can explain me and the rest o newbies how it works and also if can post the code already fixed
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ProgressConstants.au3> #include <WindowsConstants.au3> $Stop = False $X=1 $i = 0 Opt("GUIOnEventMode",1) #Region ### START Koda GUI section ### Form= Global $Form1 = GUICreate("Form1", 579, 212, 192, 124) Global $Button1 = GUICtrlCreateButton("Stop", 432, 136, 75, 25) Global $Button2 = GUICtrlCreateButton("Start", 96, 136, 75, 25) Global $Progress1 = GUICtrlCreateProgress(24, 40, 526, 49) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### GUISetOnEvent ($GUI_EVENT_CLOSE, "_exit",$Form1 ) GUICtrlSetOnEvent($Button1,"_Stop") GUICtrlSetOnEvent($Button2,"DecreaseAndIncrement") While 1 sleep(500) WEnd Func _Stop () $Stop = True EndFunc Func _exit () Exit EndFunc Func DecreaseAndIncrement () $Stop = False While $Stop = False $i+=$X ;ConsoleWrite($i & @CRLF) GUICtrlSetData($Progress1,$i) Sleep(80) if $i = 105 Then $X = -1 if $i = 0 Then $X = 1 WEnd EndFunc  
       
      here is the version that works with GUIGetMsg()
       
       
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ProgressConstants.au3> #include <WindowsConstants.au3> $Stop = False $X=1 $i = 0 #Region ### START Koda GUI section ### Form= Global $Form1 = GUICreate("Form1", 579, 212, 192, 124) Global $Button1 = GUICtrlCreateButton("Stop", 432, 136, 75, 25) Global $Button2 = GUICtrlCreateButton("Start", 96, 136, 75, 25) Global $Progress1 = GUICtrlCreateProgress(24, 40, 526, 49) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button2 DecreaseAndIncrement () case $Button1 $Stop = True EndSwitch WEnd Func DecreaseAndIncrement () $Stop = False While $Stop = False $i+=$X ;ConsoleWrite($i & @CRLF) GUICtrlSetData($Progress1,$i) Sleep(80) if $i = 105 Then $X = -1 if $i = 0 Then $X = 1 $nMsg2 = GUIGetMsg() Switch $nMsg2 Case $GUI_EVENT_CLOSE Exit case $Button1 $Stop = True EndSwitch WEnd EndFunc  
       
       
       
       
       
       
    • Skeletor
      By Skeletor
      Hi Guys,
      Is it possible to get a variable on your For..Next loop? 
       
      Local $Lines1 = _FileCountLines(C:\temp\test.txt) Local $linesToCount2 = $Lines1 + 2 $var = Number($linesToCount2) For $count = 1 To _FileCountLines($FileRead2) Step 1 For $i = $var To $count Next ;Code does stuff here Next Somehow my code doesn't work even though I thought I could convert the variable to a Integer / Number.
      This code I posted above does not move to the next value.
      But the code below does... why is that?
      For $count = 1 To _FileCountLines($FileRead2) Step 1 For $i = 2 To $count Next ;Code does stuff here Next  
      Why is the For loop resetting itself?
      Is it because the program does not cache the variable and needs to keep on acquiring this variable each time?
      If so , how would you make this variable static?

       
    • Miliardsto
      By Miliardsto
      I got that func
      Func makeHelpImgGUI($title,$width,$height,$img) $img = GUICtrlCreatePic("",20,40,$width,$height) _ResourceSetImageToCtrl($img, "HERE") EndFunc and I call this func like that
      makeHelpImgGUI("Image",1190, 800,$SETTINGS_JPG)  
      so what is the problem in the parameter where is - "HERE" I need value of img but passed as string
      so $img = $SETTINGS_JPG and how make it "SETTINGS_JPG"
       
      I tried something like that but not work
      Func makeHelpImgGUI($title,$width,$height,$img) $name_str = String($img) $name_str = StringTrimLeft ($name_str, 1 ) $img = GUICtrlCreatePic("",20,40,$width,$height) _ResourceSetImageToCtrl($img, $name_str) EndFunc  
×