找回密码
 加入
搜索
查看: 5651|回复: 11

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

  [复制链接]
发表于 2010-10-27 22:38:00 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2010-11-9 08:29 编辑

各位老师,有$Checkbox1到$Checkbox21共21个复选框。如何实现:当点击选中$Checkbox1时,$Checkbox2至$Checkbox21都被选中,如果取消$Checkbox1的选中状态时,则$Checkbox2至$Checkbox21都被取消选择。只要$Checkbox2至$Checkbox21中的某一个被选中,则Checkbox1都会被选中,但取消$Checkbox2至$Checkbox21中某一个或者几个时,不影响Checkbox1的选中状态,除非$Checkbox2至$Checkbox21都被取消选中。谢谢。
发表于 2010-10-27 22:45:31 | 显示全部楼层
论坛有这个_CheckboxOpt_udf.au3,你可以参考一下的。
http://www.autoitx.com/forum.php ... =%B8%B4%D1%A1%BF%F2
发表于 2010-10-27 23:21:58 | 显示全部楼层
Opt('GUIOnEventMode', 1)

GUICreate('afan Checkbox 例子', 150, 500)
GUISetOnEvent(-3, '_Exit')
Local $Checkbox[21]
$Checkbox[0] = 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[0]) = 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[0], 1)
                Else
                        GUICtrlSetState($Checkbox[0], 4)
                EndIf
        EndIf
EndFunc   ;==>WM_COMMAND

评分

参与人数 2金钱 +30 收起 理由
smooth + 20 谢谢热心帮助。
xyold1 + 10 精彩的代码

查看全部评分

 楼主| 发表于 2010-10-27 23:47:03 | 显示全部楼层
回复 3# afan

感谢A版的热心帮助,给出完美代码。另外:我也从你发的另外一个帖子给出的例子受益匪浅。
发表于 2010-10-28 00:59:39 | 显示全部楼层
回复 3# afan


    为何要用Assign函数定义这些变量呢?~
发表于 2010-10-28 01:05:30 | 显示全部楼层
回复 5# pusofalse


    只是想在 $WM_COMMAND 消息里面 If IsDeclared('_ _||' & $nID & ':)') Then 判断是否为指定的ID,貌似多余… 还请P版指点江山~
发表于 2010-10-28 01:22:48 | 显示全部楼层
本帖最后由 pusofalse 于 2010-10-28 01:24 编辑

回复 6# afan


    afan兄言重。

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

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

以上这段是我现在才想到的,在写5#的回复时没想到这些,afan兄的代码是对的。
发表于 2010-10-28 01:30:01 | 显示全部楼层
回复 7# pusofalse


    是这样,我是考虑到这个界面的最终功能不可能没有别的控件,所以才这样~ 之前用的 If $nID >= $Checkbox[1] And $nID <= $Checkbox[20] Then,后来觉得用 Assign 似乎好一点,也没考虑变量的存储空间这回事,多谢P版指教~
 楼主| 发表于 2010-10-28 09:10:10 | 显示全部楼层
能同时看到两位超版解答我的问题,真是感到莫大的荣幸,谢谢你们~
发表于 2010-10-28 09:45:16 | 显示全部楼层
咱们论坛的人最热心了。我的好多问题都是好多人帮助我呢
发表于 2010-10-28 09:46:30 | 显示全部楼层
这个不错啊。学习了不少东西。这个能做全选
发表于 2014-5-4 10:18:15 | 显示全部楼层
雷锋精神传天下!谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-23 03:53 , Processed in 0.079172 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表