请教: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
全选/反选一个按钮?不大方便
.....
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:02 编辑
是啊!就是因为有难度才问啊!
不过这个的情况相信大家在不少软件中都用过一键“全选\反选”。
别人都可以做到,相信这样的问题在前辈面前应该简单。
希望有前辈能解答,或是指点下思路。
我刚刚从外面维护回来 哎!热死啦!衣服又打湿了,洗澡切了! 我的程序都在公司里,没办法发给你。论坛里有不少别人做的实例的。你到自动安装的里看看别人做的程序。我记得里面有不少 #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: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 前辈这个办法。
但是我想的是怎么在一个键上实现,因为经常在一些软件上见到这样的例子,所以想学习下。
我是不是有点儿没事儿找事儿啊?如果是的话那就算啦!嘿嘿! 想办到很简单
自定义一个变量$a,赋值为1
每次点击Button全选\反选就运算$a=$a+1
然后写个判断$a/2是奇数还是偶数
奇数就执行全选
偶数就执行反选
代码很简单就不给了
自己试试吧 嗯!谢谢!谢谢前辈的思路指点。
刚开始我也是这样想的,但是不知道具体怎么判断点击次数。
经过你一指点,终于明白了,谢谢啊!又麻烦你啦! 想办到很简单
自定义一个变量$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 09:41 http://www.autoitx.com/images/common/back.gif
呵呵!没想到这个问题还颇有争议,不过这位前辈说的办法我还不会,不知道从何下手。
能说具体点儿吗?或给点关键性的代码。:face (20): #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: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:57 编辑
真没想到两位前辈几乎同时给出解决方法,非常感谢你们的帮助。
希望此帖能给像我这样的新人很好的启发。 学习了,这帖子收藏,很具有学习价值。 送一个自己原来编的函数。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