Jump to content

Check and Clearing All Boxes


Recommended Posts

Hi All,

I'm having a tough time clearing all boxes with my code... Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded, I know what this means, but I don't see where I exceeded the range. If I clear doesn't that mean I'm resetting the variable to uncheck state?

#include <GUIConstants.au3>

Local $Checkbox[5]
$i = -1

$Form1 = GUICreate("Form1", 290, 278, 193, 115)
$Checkbox[0] = GUICtrlCreateCheckbox("Checkbox1", 32, 32, 97, 17)
$Checkbox[1] = GUICtrlCreateCheckbox("Checkbox2", 32, 56, 97, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("Checkbox3", 32, 80, 97, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("Checkbox4", 32, 104, 97, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("Checkbox5", 32, 128, 97, 17)
$Button1 = GUICtrlCreateButton("Check All", 16, 216, 75, 25, 0)
$Button2 = GUICtrlCreateButton("Clear All", 104, 216, 75, 25, 0)
$Button3 = GUICtrlCreateButton("Cancel", 192, 216, 75, 25, 0)

GUISetState(@SW_SHOW)
$nMsg = 0
While $nMsg <> $GUI_EVENT_CLOSE
    
    $nMsg = GUIGetMsg()
        Select
        Case $nMsg = $Button3
                ExitLoop
                
        Case $nMsg = $Button2   
                Do          
                    $i = $i + 1
                    GUICtrlSetState($Checkbox[$i], $GUI_UNCHECKED)                  
                Until $i = 4
                
        Case $nMsg = $Button1               
                Do          
                    $i = $i + 1
                    GUICtrlSetState($Checkbox[$i], $GUI_CHECKED)
                Until $i = 4                            
        EndSelect
WEnd
Edited by gfunk999
Link to comment
Share on other sites

Your problem seems to be that $i is staying at 4 every time, thus you're trying to call $Checkbox[5] every time you click another button. Try adding $i = 0 under your Until lines.

Edit: Just tried it with the $i = 0, works perfectly.

Edited by dbzfanatic
Link to comment
Share on other sites

Oh the array builds from 4 lol that worked thank you ;)

Your problem seems to be that $i is staying at 4 every time, thus you're trying to call $Checkbox[5] every time you click another button. Try adding $i = 0 under your Until lines.

Edit: Just tried it with the $i = 0, works perfectly.

Link to comment
Share on other sites

Oh the array builds from 4 lol that worked thank you :D

No problem, also try instead of using the Do ... Until use For $i = 0 To 4 ... Next for the steps. Here's a bit of a cleaned-up version of your code. Using Swtich seems easier than Select, at least IMO.

#include <GUIConstants.au3>

Local $Checkbox[5]
Dim $i

$Form1 = GUICreate("Form1", 290, 278, 193, 115)
$Checkbox[0] = GUICtrlCreateCheckbox("Checkbox1", 32, 32, 97, 17)
$Checkbox[1] = GUICtrlCreateCheckbox("Checkbox2", 32, 56, 97, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("Checkbox3", 32, 80, 97, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("Checkbox4", 32, 104, 97, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("Checkbox5", 32, 128, 97, 17)
$Button1 = GUICtrlCreateButton("Check All", 16, 216, 75, 25, 0)
$Button2 = GUICtrlCreateButton("Clear All", 104, 216, 75, 25, 0)
$Button3 = GUICtrlCreateButton("Cancel", 192, 216, 75, 25, 0)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
            Case  $Button3
                    ExitLoop
            Case $Button2   
                    For $i = 0 To 4
                        GUICtrlSetState($Checkbox[$i], $GUI_UNCHECKED)         
                    Next
                    $i = 0
            Case $Button1            
                    For $i = 0 To 4
                        GUICtrlSetState($Checkbox[$i], $GUI_CHECKED)
                    Next
                    $i = 0
        EndSwitch
WEnd

Dim $i sets $i to 0 by default and with Switch you don't need to add the $nMsg = to your case statements. ;)

Link to comment
Share on other sites

Very Cool thanks again... Just modified it.

No problem, also try instead of using the Do ... Until use For $i = 0 To 4 ... Next for the steps. Here's a bit of a cleaned-up version of your code. Using Swtich seems easier than Select, at least IMO.

#include <GUIConstants.au3>

Local $Checkbox[5]
Dim $i

$Form1 = GUICreate("Form1", 290, 278, 193, 115)
$Checkbox[0] = GUICtrlCreateCheckbox("Checkbox1", 32, 32, 97, 17)
$Checkbox[1] = GUICtrlCreateCheckbox("Checkbox2", 32, 56, 97, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("Checkbox3", 32, 80, 97, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("Checkbox4", 32, 104, 97, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("Checkbox5", 32, 128, 97, 17)
$Button1 = GUICtrlCreateButton("Check All", 16, 216, 75, 25, 0)
$Button2 = GUICtrlCreateButton("Clear All", 104, 216, 75, 25, 0)
$Button3 = GUICtrlCreateButton("Cancel", 192, 216, 75, 25, 0)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
            Case  $Button3
                    ExitLoop
            Case $Button2   
                    For $i = 0 To 4
                        GUICtrlSetState($Checkbox[$i], $GUI_UNCHECKED)         
                    Next
                    $i = 0
            Case $Button1            
                    For $i = 0 To 4
                        GUICtrlSetState($Checkbox[$i], $GUI_CHECKED)
                    Next
                    $i = 0
        EndSwitch
WEnd

Dim $i sets $i to 0 by default and with Switch you don't need to add the $nMsg = to your case statements. ;)

Link to comment
Share on other sites

One more question if you don't mind, how would go about executing all selected checkboxes and perform an action once i.e. an OK button is pressed. I'll post my code as soon as I'm done, but I know is dirty. :|

Very Cool thanks again... Just modified it.

Link to comment
Share on other sites

There are a few ways to do this. The one I use normally is a bit intensive but it works. Here's an example.

Case $btnOk
     If GuiCtrlRead($CheckBox[0]) = $GUI_CHECKED Then
          *insert code here*
     EndIf
     If GuiCtrlRead($CheckBox[1]) = $GUI_CHECKED Then
          *insert code here*
     ...
     EndIf

You could also probably send messages to the GUI but I'm not sure how to do that.

Edited by dbzfanatic
Link to comment
Share on other sites

Cool, what i'm trying to do is pass the result of read for each checkbox, and based on that I will carry out the code. Kind of tedious, I'm still looking for a better solution. I'll give yours a try, thanks again for the quick reply

$cr1 = GUICtrlRead($Checkbox[0])

$cr2 = GUICtrlRead($Checkbox[1])

$cr3 = GUICtrlRead($Checkbox[2])

$cr4 = GUICtrlRead($Checkbox[3])

There are a few ways to do this. The one I use normally is a bit intensive but it works. Here's an example.

Case $btnOk
     If GuiCtrlRead($CheckBox[0]) = $GUI_CHECKED Then
          *insert code here*
     ElseIf GuiCtrlRead($CheckBox[1]) = $GUI_CHECKED Then
          *insert code here*
     ...
     End

Or you could use seperate If statements for each. You could also probably send messages to the GUI but I'm not sure how to do that.

Link to comment
Share on other sites

I kinda goofed a bit on my first post (not enough coffeee). You do need to use separate If statements for each otherwise it will only carry out the first condition it finds and nothing else. So if boxes 1 and 4 are checked it will execute the code for box 1 but not box 4. I also had an idea that may or may not work. Try something like

Case $btnOk
     For $i = 0 To 4
          $cr[$i] = GuiCtrlRead($CheckBox[$i])
     Next
     $i = 0
     Call Function($cr)

Func Function($value)
     For $i = 0 To 4
          If $value[$i] = 1 Then
               If $i = 0 Then
                    ;do something here for checkbox one
               EndIf
               If $i = 1 Then
                    ;do something here for checkbox two
               Endif
          EndIf
     Next
EndFunc

Edit: Made code a bit more in-depth. Hopefully this will help.

Edited by dbzfanatic
Link to comment
Share on other sites

That work I modified it a bit...but I still think there's a cleaner way of doing it. Thanks again dbzfanatic

Case $Button4
                    For $i = 0 To 4
                        $cr[$j] = GuiCtrlRead($CheckBox[$i])
                        If $cr[$j] = 1 Then
                            If $i = 0 Then
                                MsgBox(0, "1", "checkbox1")
                            EndIf
                            If $i = 1 Then
                                MsgBox(0, "2", "checkbox2")
                            EndIf
                            If $i = 2 Then
                                MsgBox(0, "3", "checkbox3")
                            EndIf
                            If $i = 3 Then
                                MsgBox(0, "4", "checkbox4")
                            EndIf
                            If $i = 4 Then
                                MsgBox(0, "5", "checkbox5")
                            EndIf
                        EndIf
                    Next
                    $i = 0
Edited by gfunk999
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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...