已解决 如何按照复选框勾选顺序去执行代码
本帖最后由 itzyx 于 2020-11-26 11:56 编辑#include <DateTimeConstants.au3>
GUICreate("Form1", 400, 300)
$Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)
$time1=GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
$time2=GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
$time3=GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
$time4=GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
$style = "yyyy/MM/dd HH:mm:ss"
$DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW,来自于函数DateTimeConstants.au3
GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)
$b = GUICtrlCreateButton('Start', 130, 200, 150, 25)
GUISetState()
$ck = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $b
For $i = 1 To 4
If GUICtrlRead(Eval('Checkbox' & $i)) = 1 Then
$ck = $i
Call('_Go')
EndIf
Next
EndSwitch
WEnd
Func _Go()
Switch $ck
Case 1
MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
Case 2
MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
Case 3
MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
Case 4
MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
EndSwitch
EndFunc各位大佬好,如上图代码,四个时间节点复选框,对应四个时间表,我如果按照顺序依次点击复选框 1,2,3,4这样执行确实没问题, 但是我如果 不按顺序点击复选框,比如按照:4,2,3,1 这样的顺序点击的话 ,因为switch 函数是从上到下按照优先级来的,执行的输出情况还是 1234。 现在我想按照自己点击的顺序,比如我依次点击的时间节点 是2-4-3-1 ,想通过读取 ,是否勾选节点,以及勾选时间节点的顺序对应的时间值来运行程序 该怎么写呢? 这个问题我一开始感觉应该挺好解决的,但是想了一天 也没想出啥好思路,尽钻牛角尖了,越走越偏,所以想请教一下各位大佬 ,万分感谢。 直接用字符串存储点击的复选框ID就行了
GUICreate("Form1", 400, 300)
$Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)
$time1 = GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
$time2 = GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
$time3 = GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
$time4 = GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
$style = "yyyy/MM/dd HH:mm:ss"
$DTM_SETFORMAT_ = 0x1032
GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)
$btn = GUICtrlCreateButton('Start', 130, 200, 150, 25)
GUISetState()
Local $ii, $aCkLst, $sCkLst = ';'
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Checkbox1 To $Checkbox4
If GUICtrlRead($nMsg) = 1 Then
$sCkLst &= $nMsg & ';'
Else
$sCkLst = StringReplace($sCkLst, ';' & $nMsg & ';', ';')
EndIf
Case $btn
$aCkLst = StringRegExp($sCkLst, '\d+', 3)
For $ii = 0 To UBound($aCkLst) - 1
_Go($aCkLst[$ii])
Next
EndSwitch
WEnd
Func _Go($id)
MsgBox(0, $id - $Checkbox1 + 1, '执行复选框 ' & GUICtrlRead($id, 1) & ' 的任务')
EndFunc ;==>_Go 本帖最后由 yuantian 于 2020-11-25 08:13 编辑
我的理解是做一个全局变量,
每当勾选一个复选框后,在这个全局变量后追加一个带分隔符的序号,
然后按按钮的时候,
按照全局变量的顺序执行,
执行结束后清空那个全局变量,
等待下一次勾选任务
再有:
你并不是因为Switch原因才从上往下执行的,
你执行的原因是因为For循环。
yuantian 发表于 2020-11-25 08:00
我的理解是做一个全局变量,
每当勾选一个复选框后,在这个全局变量后追加一个带分隔符的序号,
然后按按 ...
是的,我知道 可以While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
ExitLoop
Case $Checkbox1 To $Checkbox4
If GUICtrlRead($nMsg) = 1 Then
$sl += 1
$name=GUICtrlRead($nMsg, 1)
来获取每次点击的顺序 ,以及复选框名称, 但是之后我不知道何处下手,去调用勾选复选框后,对应的函数了,比如我只点了一个时间节点1,读取时间节点1后,点击确认,怎么能 第一个执行时间节点1的函数呢 本帖最后由 yuantian 于 2020-11-25 12:27 编辑
itzyx 发表于 2020-11-25 09:17
是的,我知道 可以
来获取每次点击的顺序 ,以及复选框名称, 但是之后我不知道何处下手,去调用勾选复 ...
草率了,直接用数组就好
上代码:
#include <DateTimeConstants.au3>
#include <Array.au3>
GUICreate("Form1", 400, 300)
Global $CheckOrder
$Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)
$time1 = GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
$time2 = GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
$time3 = GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
$time4 = GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
$style = "yyyy/MM/dd HH:mm:ss"
$DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW,来自于函数DateTimeConstants.au3
GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)
$b = GUICtrlCreateButton('Start', 130, 200, 150, 25)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Checkbox1 To $Checkbox4
If GUICtrlRead($nMsg) = 1 Then
_ArrayAdd($CheckOrder, $nMsg)
Else
SetError(0)
$aFindOrder = _ArrayFindAll($CheckOrder, $nMsg)
If IsArray($aFindOrder) Then
_ArrayReverse($aFindOrder)
For $a = 0 To UBound($aFindOrder) - 1
_ArrayDelete($CheckOrder, $aFindOrder[$a])
Next
Else
ConsoleWrite("@error:" & @error & @CRLF)
EndIf
EndIf
Case $b
If IsArray($CheckOrder) Then
For $i = 0 To UBound($CheckOrder) - 1
If GUICtrlRead($CheckOrder[$i]) = 1 Then Call('_Go', $CheckOrder[$i])
Next
EndIf
EndSwitch
WEnd
Func _Go($Var)
Switch $Var
Case $Checkbox1
MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
Case $Checkbox2
MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
Case $Checkbox3
MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
Case $Checkbox4
MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
EndSwitch
EndFunc ;==>_Go yuantian 发表于 2020-11-25 10:05
草率了,直接用数组就好
上代码:
好的 ,感谢大佬,目前来看是实现了我想要的功能的,我基础比较弱,先看看 这个代码,等看懂了,再改为已解决 ,再次感谢 itzyx 发表于 2020-11-25 12:38
好的 ,感谢大佬,目前来看是实现了我想要的功能的,我基础比较弱,先看看 这个代码,等看懂了,再改为 ...
我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。 牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何控件都可以。 afan 发表于 2020-11-25 12:57
牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何 ...
好的 我回头可以看看,先实现功能再不断探究更好的方法 yuantian 发表于 2020-11-25 12:45
我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。
大佬,这个代码 我大致清楚意思了 , 不过有几点没搞懂,还希望能够请教一下,首先 , Else SetError(0)这里设置@error 为 0 ,为了起什么作用,其次,IfIsArray 会不会多余,因为我感觉得到的都是数组吧 ,最后,如果设置For $a = 1 To UBound($aFindOrder) - 1,是不是就可以规避了$CheckOrder,0基索引对应的值,不用_ArrayReverse反排序 这个数组了
确实才疏学浅,问的傻的地方,请见谅, 最后希望大佬看到 能帮忙解答一下,感谢 afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了
这个好,通俗易懂, 而且都是我学习过的, 看来从掌握到灵活应用 还要不断练习才行,最后感谢A大 本帖最后由 yuantian 于 2020-11-26 23:12 编辑
itzyx 发表于 2020-11-25 23:44
大佬,这个代码 我大致清楚意思了 , 不过有几点没搞懂,还希望能够请教一下,首先 , Else SetError(0 ...
1.当时作为循环,是为了怕有出现重复的,出现1个以上的序号。
2.当时选择Error,可能是为了防止如果数组容器中找不到点击的控件ID所做的。
返回一个原因。现在看来估计没有什么必要
3.返置数组,可能是我当时考虑如果查找索引的时候,出现大于1个的情况,从大到小删除数组的数据,不会误删数组内剩余的数据
按实际情况删减写就OK...
yuantian 发表于 2020-11-26 23:04
1.当时作为循环,是为了怕有出现重复的,出现1个以上的序号。
2.当时选择Error,可能是为了防止如果数 ...
好的 ,谢谢 afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了
A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”为什么呀?“\d+” 不是一个或多个数字嘛? itzyx 发表于 2020-11-27 09:15
A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”为什么呀?“\d+”...
是啊,控件id就是数字,从3开始
页:
[1]
2