smooth 发表于 2010-10-27 22:38:00

[已解决]请教如何用一个总的复选框控制其余20个复选框,并执行相应代码呢?

本帖最后由 smooth 于 2010-11-9 08:29 编辑

各位老师,有$Checkbox1到$Checkbox21共21个复选框。如何实现:当点击选中$Checkbox1时,$Checkbox2至$Checkbox21都被选中,如果取消$Checkbox1的选中状态时,则$Checkbox2至$Checkbox21都被取消选择。只要$Checkbox2至$Checkbox21中的某一个被选中,则Checkbox1都会被选中,但取消$Checkbox2至$Checkbox21中某一个或者几个时,不影响Checkbox1的选中状态,除非$Checkbox2至$Checkbox21都被取消选中。谢谢。

lpxx 发表于 2010-10-27 22:45:31

论坛有这个_CheckboxOpt_udf.au3,你可以参考一下的。
http://www.autoitx.com/forum.php?mod=viewthread&tid=9252&highlight=%B8%B4%D1%A1%BF%F2

afan 发表于 2010-10-27 23:21:58

Opt('GUIOnEventMode', 1)

GUICreate('afan Checkbox 例子', 150, 500)
GUISetOnEvent(-3, '_Exit')
Local $Checkbox
$Checkbox = GUICtrlCreateCheckbox('Checkbox0 - 总管', 10, 450, 120, 17)
GUICtrlSetOnEvent(-1, '_ZG')
For $i = 1 To 20
        $Checkbox[$i] = GUICtrlCreateCheckbox('Checkbox' & $i, 10, 20 * $i, 100, 17)
        Assign('_ _||' & $Checkbox[$i] & ':)', 1)
Next
$c = 0
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
While 1
        Sleep(1000)
WEnd

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func _ZG()
        If GUICtrlRead($Checkbox) = 1 Then
                Local $state = 1
                $c = 20
        Else
                Local $state = 4
                $c = 0
        EndIf
        For $i = 1 To 20
                GUICtrlSetState($Checkbox[$i], $state)
        Next
EndFunc   ;==>_ZG

Func WM_COMMAND($hWnd, $msg, $wParam)
        #forceref $hWnd, $Msg
        Local $nID = BitAND($wParam, 0xFFFF)
        If IsDeclared('_ _||' & $nID & ':)') Then
                If GUICtrlRead($nID) = 1 Then
                        $c += 1
                Else
                        $c -= 1
                EndIf
                If $c > 0 Then
                        GUICtrlSetState($Checkbox, 1)
                Else
                        GUICtrlSetState($Checkbox, 4)
                EndIf
        EndIf
EndFunc   ;==>WM_COMMAND

smooth 发表于 2010-10-27 23:47:03

回复 3# afan

感谢A版的热心帮助,给出完美代码。另外:我也从你发的另外一个帖子给出的例子受益匪浅。

pusofalse 发表于 2010-10-28 00:59:39

回复 3# afan


    为何要用Assign函数定义这些变量呢?~

afan 发表于 2010-10-28 01:05:30

回复 5# pusofalse


    只是想在 $WM_COMMAND 消息里面 If IsDeclared('_ _||' & $nID & ':)') Then 判断是否为指定的ID,貌似多余… 还请P版指点江山~ http://www.autoitx.com/uc/avatar.php?uid=7634069&size=middle

pusofalse 发表于 2010-10-28 01:22:48

本帖最后由 pusofalse 于 2010-10-28 01:24 编辑

回复 6# afan


    afan兄言重。

“判断是否为指定的ID”,在这段代码中,除了$Checkbox之外,其他的都是属于“指定的ID”啊,与其判断是否属于指定的ID,不如判断是否“不属于指定的ID”,当不属于指定的ID时,设置$CheckBox的状态,这样的话,只需要用Assign($Checkbox, 1)给$Checkbox赋一个值即可。
变量的存储总是需要空间,Assign创建的变量同是如此,那么与其只给$Checkbox赋值,不如直接在WM_COMMAND中用If $nID <> $Checkbox判断即可。

也许我也没考虑周到,WM_COMMAND函数不只是在点击CheckBox控件时才会被调用,如果还有其他的按钮或者菜单等控件,当事件出现时,同会调用WM_COMMAND,这种情况下,只用If $nID <> $Checkbox判断,就会出现误判,因为$nID可能是某按钮的ID。这种情况下,必须要一一给Checkbox ~ Checkbox赋值了。

以上这段是我现在才想到的,在写5#的回复时没想到这些,afan兄的代码是对的。

afan 发表于 2010-10-28 01:30:01

回复 7# pusofalse


    是这样,我是考虑到这个界面的最终功能不可能没有别的控件,所以才这样~ 之前用的 If $nID >= $Checkbox And $nID <= $Checkbox Then,后来觉得用 Assign 似乎好一点,也没考虑变量的存储空间这回事,多谢P版指教~

smooth 发表于 2010-10-28 09:10:10

能同时看到两位超版解答我的问题,真是感到莫大的荣幸,谢谢你们~

awfymwvf 发表于 2010-10-28 09:45:16

咱们论坛的人最热心了。我的好多问题都是好多人帮助我呢

xyyie 发表于 2010-10-28 09:46:30

这个不错啊。学习了不少东西。这个能做全选

hollandmfq 发表于 2014-5-4 10:18:15

雷锋精神传天下!谢谢分享!
页: [1]
查看完整版本: [已解决]请教如何用一个总的复选框控制其余20个复选框,并执行相应代码呢?