水木子 发表于 2009-7-15 18:47:47

请教:N个复选框(Checkbox),如何“全选\反选”。[已解决]

本帖最后由 水木子 于 2010-11-22 17:48 编辑

大家好!
忙了一天,也热了一天,衣服都被汗水打湿了好几次,哎!辛苦啊!
终于下班了,又来继续学习Autoit3。
求助大家一个关于一键“全选\反选”的问题,下面是我简单做的窗体代码,我自己试着写了些,虽然能实现全选,但是反选就出问题,而且感觉方法很笨见不得人,琢磨半天未果,“搜索”里关于这方面的问题也少得很!这才问问大家。
希望各位前辈能抽空指点下。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("全选\反选", 260, 250)
$Checkbox1 = GUICtrlCreateCheckbox("1", 50, 50, 25, 17)
$Checkbox2 = GUICtrlCreateCheckbox("2", 120, 50, 25, 17)
$Checkbox3 = GUICtrlCreateCheckbox("3", 190, 50, 25, 17)
$Checkbox4 = GUICtrlCreateCheckbox("4", 50, 100, 25, 17)
$Checkbox5 = GUICtrlCreateCheckbox("5", 120, 100, 25, 17)
$Checkbox6 = GUICtrlCreateCheckbox("6", 190, 100, 25, 17)
$Checkbox7 = GUICtrlCreateCheckbox("7", 50, 150, 25, 17)
$Checkbox8 = GUICtrlCreateCheckbox("8", 120, 150, 25, 17)
$Checkbox9 = GUICtrlCreateCheckbox("9", 190, 150, 25, 17)
$Group1 = GUICtrlCreateGroup("10", 24, 24, 209, 169)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("全选\反选", 90, 210, 75, 25, $WS_GROUP)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Checkbox1
                Case $Checkbox2
                Case $Checkbox3
                Case $Checkbox4
                Case $Checkbox5
                Case $Checkbox6
                Case $Checkbox7
                Case $Checkbox8
                Case $Checkbox9
                Case $Button1

        EndSwitch
WEnd

netegg 发表于 2009-7-15 19:17:29

全选/反选一个按钮?不大方便
.....
case button1
_selectall()
case button2
_selectopsite()
endswitch
func _selectall()
guisetstate($checkbox1, $gui_checked)
.....
guisetstate($checkbox9, $gui_checked)
endfunc
func _seleceopsite()
change($checkbox1)
   ......
change($checkbox9)
endfunc
func change($i)
if BitAnd(GUICtrlRead($i),$GUI_CHECKED)) then
   guisetstate($i, $gui_unchecked)
else
   guisetstate($i, $gui_checked)
endif
endfunc

水木子 发表于 2009-7-15 21:00:18

本帖最后由 水木子 于 2009-7-15 21:02 编辑

是啊!就是因为有难度才问啊!
不过这个的情况相信大家在不少软件中都用过一键“全选\反选”。
别人都可以做到,相信这样的问题在前辈面前应该简单。
希望有前辈能解答,或是指点下思路。

我刚刚从外面维护回来 哎!热死啦!衣服又打湿了,洗澡切了!

qqgghh1 发表于 2009-7-15 21:02:17

我的程序都在公司里,没办法发给你。论坛里有不少别人做的实例的。你到自动安装的里看看别人做的程序。我记得里面有不少

lynfr8 发表于 2009-7-15 22:24:38

#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("全选\反选", 261, 251, 340, 162)
$Checkbox1 = GUICtrlCreateCheckbox("1", 50, 50, 25, 17)
$Checkbox2 = GUICtrlCreateCheckbox("2", 120, 50, 25, 17)
$Checkbox3 = GUICtrlCreateCheckbox("3", 190, 50, 25, 17)
$Checkbox4 = GUICtrlCreateCheckbox("4", 50, 100, 25, 17)
$Checkbox5 = GUICtrlCreateCheckbox("5", 120, 100, 25, 17)
$Checkbox6 = GUICtrlCreateCheckbox("6", 190, 100, 25, 17)
$Checkbox7 = GUICtrlCreateCheckbox("7", 50, 150, 25, 17)
$Checkbox8 = GUICtrlCreateCheckbox("8", 120, 150, 25, 17)
$Checkbox9 = GUICtrlCreateCheckbox("9", 190, 150, 25, 17)
$Group1 = GUICtrlCreateGroup("10", 24, 24, 209, 169)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("全选", 50, 210, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("反选", 140, 210, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)

Dim $Checkbox
While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                         For $i=3 To 11
                         GUICtrlSetState($Checkbox&$i, $GUI_CHECKED)
                         Next
                Case $Button2
                        For $i=3 To 11
                        If GUICtrlRead($Checkbox&$i)=1 then
                   GUICtrlSetState($Checkbox&$i, $GUI_UNCHECKED )
                         Elseif GUICtrlRead($Checkbox&$i)=4 then
                   GUICtrlSetState($Checkbox&$i, $GUI_CHECKED)
                   Endif
                   Next
      EndSwitch
WEnd

水木子 发表于 2009-7-15 22:50:00

本帖最后由 水木子 于 2009-7-15 22:55 编辑

#include
#include
#include
#include
#include

$Form1 = GUICreate("全选\反选", 261, 251, 340, 162)
$Checkbox1 = GUICtrlCreateCheckbox("1", 50, 50, 25, 17)
$Checkbox2 = GUICtrlCreateCheckbo ...
lynfr8 发表于 2009-7-15 22:24 http://www.autoitx.com/images/common/back.gif

我之前就是用 lynfr8 前辈这个办法。
但是我想的是怎么在一个键上实现,因为经常在一些软件上见到这样的例子,所以想学习下。
我是不是有点儿没事儿找事儿啊?如果是的话那就算啦!嘿嘿!

lynfr8 发表于 2009-7-16 00:36:19

想办到很简单
自定义一个变量$a,赋值为1
每次点击Button全选\反选就运算$a=$a+1
然后写个判断$a/2是奇数还是偶数
奇数就执行全选
偶数就执行反选
代码很简单就不给了
自己试试吧

水木子 发表于 2009-7-16 09:11:02

嗯!谢谢!谢谢前辈的思路指点。
刚开始我也是这样想的,但是不知道具体怎么判断点击次数。
经过你一指点,终于明白了,谢谢啊!又麻烦你啦!

顽固不化 发表于 2009-7-16 09:41:13

想办到很简单
自定义一个变量$a,赋值为1
每次点击Button全选\反选就运算$a=$a+1
然后写个判断$a/2是奇数还是偶数
奇数就执行全选
偶数就执行反选
代码很简单就不给了
自己试试吧
lynfr8 发表于 2009-7-16 00:36 http://www.autoitx.com/images/common/back.gif

这个变量一直累加下去不好吧?直接定义为布尔变量就可以,以真假来判断

水木子 发表于 2009-7-16 11:05:24



这个变量一直累加下去不好吧?直接定义为布尔变量就可以,以真假来判断
顽固不化 发表于 2009-7-16 09:41 http://www.autoitx.com/images/common/back.gif

呵呵!没想到这个问题还颇有争议,不过这位前辈说的办法我还不会,不知道从何下手。
能说具体点儿吗?或给点关键性的代码。:face (20):

lynfr8 发表于 2009-7-16 13:32:28

#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("全选\反选", 261, 251, 340, 162)
$Checkbox1 = GUICtrlCreateCheckbox("1", 50, 50, 25, 17)
$Checkbox2 = GUICtrlCreateCheckbox("2", 120, 50, 25, 17)
$Checkbox3 = GUICtrlCreateCheckbox("3", 190, 50, 25, 17)
$Checkbox4 = GUICtrlCreateCheckbox("4", 50, 100, 25, 17)
$Checkbox5 = GUICtrlCreateCheckbox("5", 120, 100, 25, 17)
$Checkbox6 = GUICtrlCreateCheckbox("6", 190, 100, 25, 17)
$Checkbox7 = GUICtrlCreateCheckbox("7", 50, 150, 25, 17)
$Checkbox8 = GUICtrlCreateCheckbox("8", 120, 150, 25, 17)
$Checkbox9 = GUICtrlCreateCheckbox("9", 190, 150, 25, 17)
$Group1 = GUICtrlCreateGroup("10", 24, 24, 209, 169)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button = GUICtrlCreateButton("全选", 90, 210, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)

Dim $Checkbox,$B=True
While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button
               If $B=True Then
                         For $i=3 To 11
                         GUICtrlSetState($Checkbox&$i, $GUI_CHECKED)
                            GUICtrlSetData($Button,'反选')
                            Next
                        $B=False
               Else
                        For $i=3 To 11
                        If GUICtrlRead($Checkbox&$i)=1 then
                   GUICtrlSetState($Checkbox&$i, $GUI_UNCHECKED )
                         Elseif GUICtrlRead($Checkbox&$i)=4 then
                   GUICtrlSetState($Checkbox&$i, $GUI_CHECKED)
                   Endif
                           Next
                           $B=True
                           GUICtrlSetData($Button,'全选')
                           Endif
      EndSwitch
WEnd

顽固不化 发表于 2009-7-16 13:33:20

本帖最后由 顽固不化 于 2009-7-16 13:43 编辑

#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("全选\反选", 261, 251, 340, 162)
$Checkbox1 = GUICtrlCreateCheckbox("1", 50, 50, 25, 17)
$Checkbox2 = GUICtrlCreateCheckbox("2", 120, 50, 25, 17)
$Checkbox3 = GUICtrlCreateCheckbox("3", 190, 50, 25, 17)
$Checkbox4 = GUICtrlCreateCheckbox("4", 50, 100, 25, 17)
$Checkbox5 = GUICtrlCreateCheckbox("5", 120, 100, 25, 17)
$Checkbox6 = GUICtrlCreateCheckbox("6", 190, 100, 25, 17)
$Checkbox7 = GUICtrlCreateCheckbox("7", 50, 150, 25, 17)
$Checkbox8 = GUICtrlCreateCheckbox("8", 120, 150, 25, 17)
$Checkbox9 = GUICtrlCreateCheckbox("9", 190, 150, 25, 17)
$Group1 = GUICtrlCreateGroup("10", 24, 24, 209, 169)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("全选", 50, 210, 75, 25, $WS_GROUP)
;$Button2 = GUICtrlCreateButton("反选", 140, 210, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)

Dim $Checkbox
Dim $IsCheck = False

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        If $IsCheck = False Then
                                For $i = 3 To 11
                                        GUICtrlSetState($Checkbox & $i, $GUI_CHECKED)
                                Next
                                GUICtrlSetData($Button1, "全不选")
                                $IsCheck = True
                        Else
                                For $i = 3 To 11
                                        GUICtrlSetState($Checkbox & $i, $GUI_UNCHECKED)
                                Next
                                GUICtrlSetData($Button1, "全选")
                                $IsCheck = False
                        EndIf
        EndSwitch
WEnd

水木子 发表于 2009-7-16 15:44:23

本帖最后由 水木子 于 2009-7-16 15:57 编辑

真没想到两位前辈几乎同时给出解决方法,非常感谢你们的帮助。
希望此帖能给像我这样的新人很好的启发。

KLU3K 发表于 2009-7-17 02:20:40

学习了,这帖子收藏,很具有学习价值。

即即 发表于 2009-7-17 09:47:55

送一个自己原来编的函数。Func _Checkbox_CHECKED_UNCHECKED($CheckboxName, $State = 1)

        ;函数:_Checkbox_CHECKED_UNCHECKED($CheckboxName, $State)
        ;功能:对复选框控件进行选中和不选中设置
        ;用法:$CheckboxName 为当前复选框控件除去"$"和编号的函数名称,如现有$Checkbox1控件函数,
        ;      则$CheckboxName=“Checkbox”
        ;      $State为开关设置参数。全部选中参数为1 (默认值);全部不选中为"-1";选中部分:用"1+3+8"
        ;      表示,即选中复选框1和3和8,用"+"号作为连接符。
        ;注意:使用该自定义函数时,菜单中的控件函数名应该一致且编号从1开始并且必须连号中间不能有跳号。
        Local $CHECKED
        $CHECKED = StringSplit($State, "+")
        $N = 1
        While 1
                If Eval($CheckboxName & $N) Then
                        If $State = 1 Then
                                GUICtrlSetState(Eval($CheckboxName & $N), $GUI_CHECKED)
                        ElseIf $State = -1 Then
                                GUICtrlSetState(Eval($CheckboxName & $N), $GUI_UNCHECKED)
                        Else
                                For $S = 1 To $CHECKED
                                        If $N = $CHECKED[$S] Then
                                                GUICtrlSetState(Eval($CheckboxName & $N), $GUI_CHECKED)
                                                ExitLoop
                                        Else
                                                GUICtrlSetState(Eval($CheckboxName & $N), $GUI_UNCHECKED)
                                        EndIf
                                Next
                        EndIf
                        $N += 1
                Else
                        ExitLoop
                EndIf
        WEnd
EndFunc   ;==>_Checkbox_CHECKED_UNCHECKED
页: [1] 2
查看完整版本: 请教:N个复选框(Checkbox),如何“全选\反选”。[已解决]