Что нового

[Элементы GUI] Обработка и задание состояния Checkbox'ов в цикле

Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Pelerin сказал(а):
k790, смотри эту тему
Если что, задавай вопросы здесь или в ней.
Не то, мне не обратное выделение надо, а строго
1. Если любой чекбокс отмечен, то снять выделение у всех
2. Если все выделены то снять
3. Если ни один не выбран, то отметить все
Как-то так
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Local $var, $count=0, $MaxCount = 10
For $i = $Checkbox1 To $Checkbox10 Step 1
    $var = GUICtrlRead($i)
    If GUICtrlRead($var) = 1 Then
        For $i = $Checkbox1 To $Checkbox10 Step 1
            GUICtrlSetState($i, $GUI_UNCHECKED)
        Next
    ElseIf GUICtrlRead($var) = 4 Then
        $count = $count + 1
        If $Count = $MaxCount Then
            For $i = $Checkbox1 To $Checkbox10 Step 1
                GUICtrlSetState($i, $GUI_CHECKED)
            Next
        EndIf
    EndIf
Next

Как-то так. Пункты 1 и 2 взаимо заменяют друг друга.
Если любой чекбокс отмечен, то снять выделение у всех.
Если все чекбоксы отмечены, то снять выделение у всех. В этом случае любой чекбокс отмечен, поэтому снимаем выделение у всех.
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
k790, вот с помощью _GUICtrlSwitchState():
Код:
; ...предыдущий код
		Case $Button_ALL
			Local $i=$Checkbox1, $IfChecked=0
			Do
				If GUICtrlRead ($i)=$GUI_CHECKED Then $IfChecked=1
				$i+=1
			Until $i=$Checkbox10+1 or $IfChecked=1

			For $i=$Checkbox1 to $Checkbox10
				_GUICtrlSwitchState ($i, $IfChecked, $GUI_CHECKED, $GUI_UNCHECKED)
			Next
    EndSwitch
WEnd

Func _GUICtrlSwitchState($ctrlid, $param, $true, $false)
    If IsString($param) Then
        Switch $param
            Case "True", "+" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $false
            Case "False", "-" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    Else
        Switch Number($param)
            Case 1,  $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $false
            Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE , $GUI_NOFOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    EndIf
    If GUICtrlGetHandle($ctrlid) <> 0 And not IsString($true) And not IsString($false) Then GUICtrlSetState ($ctrlid, $param)
    Return $param
EndFunc
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Belfigor
Хороший код, но он не работает, то есть если все выделились кнопкой, то галочки этой же кнопкой не снимаются и если я выбираю первый пункт, то галочки снимаются, а если любой другой, то ничего не происходит, а надо чтоб все галочки снимались как будто выбран 1-ый
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 18, 24, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 123, 51, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 24, 87, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("Checkbox4", 231, 60, 97, 17)
$Checkbox5 = GUICtrlCreateCheckbox("Checkbox5", 258, 111, 97, 17)
$Checkbox6 = GUICtrlCreateCheckbox("Checkbox6", 195, 171, 97, 17)
$Checkbox7 = GUICtrlCreateCheckbox("Checkbox7", 72, 162, 97, 17)
$Checkbox8 = GUICtrlCreateCheckbox("Checkbox8", 120, 243, 97, 17)
$Checkbox9 = GUICtrlCreateCheckbox("Checkbox9", 276, 234, 97, 17)
$Checkbox10 = GUICtrlCreateCheckbox("Checkbox10", 342, 309, 97, 17)
$Button1 = GUICtrlCreateButton("Button1", 447, 129, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button1
            Local $var, $count=0, $MaxCount = 10
            For $i = $Checkbox1 To $Checkbox10 Step 1
                $var = GUICtrlRead($i)
                If $var = 1 Then
                    For $i = $Checkbox1 To $Checkbox10 Step 1
                        GUICtrlSetState($i, $GUI_UNCHECKED)
                    Next
                ElseIf GUICtrlRead($var) = 4 Then
                    $count = $count + 1
                    If $Count = $MaxCount Then
                        For $i = $Checkbox1 To $Checkbox10 Step 1
                            GUICtrlSetState($i, $GUI_CHECKED)
                        Next
                    EndIf
                EndIf
            Next
        EndSwitch
WEnd

Вот, все работает. Ошибка была в этом:
Код:
$var = GUICtrlRead($i)
If GUICtrlRead($var) = 1 Then

То есть в переменную $var читалось состояние проверяемого контрола, и потом снова применялось GuiCtrlRead к содержимому $var. А надо было так:
Код:
$var = GUICtrlRead($i)
If $var = 1 Then
 
Верх