找回密码
 加入
搜索
查看: 5316|回复: 17

[AU3基础] 已解决 如何按照复选框勾选顺序去执行代码

[复制链接]
发表于 2020-11-25 00:32:11 | 显示全部楼层 |阅读模式
本帖最后由 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 ,想通过读取 ,是否勾选节点,以及勾选时间节点的顺序对应的时间值来运行程序 该怎么写呢?   这个问题我一开始感觉应该挺好解决的,但是想了一天 也没想出啥好思路,尽钻牛角尖了,越走越偏,所以想请教一下各位大佬 ,万分感谢。
发表于 2020-11-26 11:19:33 | 显示全部楼层
直接用字符串存储点击的复选框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

评分

参与人数 1金钱 +30 收起 理由
itzyx + 30 很给力!

查看全部评分

发表于 2020-11-25 08:00:29 | 显示全部楼层
本帖最后由 yuantian 于 2020-11-25 08:13 编辑

我的理解是做一个全局变量,
每当勾选一个复选框后,在这个全局变量后追加一个带分隔符的序号,
然后按按钮的时候,
按照全局变量的顺序执行,
执行结束后清空那个全局变量,
等待下一次勾选任务


再有:
你并不是因为Switch原因才从上往下执行的,
你执行的原因是因为For循环。

 楼主| 发表于 2020-11-25 09:17:23 | 显示全部楼层
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的函数呢

点评

这回再看看吧。。  发表于 2020-11-25 10:17
发表于 2020-11-25 10:05:51 | 显示全部楼层
本帖最后由 yuantian 于 2020-11-25 12:27 编辑
itzyx 发表于 2020-11-25 09:17
是的,我知道 可以
来获取每次点击的顺序 ,以及复选框名称, 但是之后我不知道何处下手,去调用勾选复 ...

草率了,直接用数组就好
上代码:
#include <DateTimeConstants.au3>
#include <Array.au3>

GUICreate("Form1", 400, 300)
Global $CheckOrder[0]
$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

评分

参与人数 1金钱 +30 收起 理由
itzyx + 30 赞一个!

查看全部评分

 楼主| 发表于 2020-11-25 12:38:30 | 显示全部楼层
yuantian 发表于 2020-11-25 10:05
草率了,直接用数组就好
上代码:

好的 ,感谢大佬,目前来看是实现了我想要的功能的,  我基础比较弱,先看看 这个代码,等看懂了,再改为已解决 ,再次感谢
发表于 2020-11-25 12:45:50 | 显示全部楼层
itzyx 发表于 2020-11-25 12:38
好的 ,感谢大佬,目前来看是实现了我想要的功能的,  我基础比较弱,先看看 这个代码,等看懂了,再改为 ...

我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。
发表于 2020-11-25 12:57:17 | 显示全部楼层
牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何控件都可以。
 楼主| 发表于 2020-11-25 15:06:25 | 显示全部楼层
afan 发表于 2020-11-25 12:57
牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何 ...

好的 我回头可以看看,  先实现功能  再不断探究更好的方法
 楼主| 发表于 2020-11-25 23:44:42 | 显示全部楼层
yuantian 发表于 2020-11-25 12:45
我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。

大佬,这个代码 我大致清楚意思了 , 不过有几点没搞懂,还希望能够请教一下,首先 , Else   SetError(0)  这里设置@error 为 0 ,为了起什么作用,其次,  If  IsArray   会不会多余,因为我感觉得到的都是数组吧 ,最后,如果设置For $a = 1 To UBound($aFindOrder) - 1,是不是就可以规避了$CheckOrder,0基索引对应的值,不用_ArrayReverse反排序 这个数组了
确实才疏学浅,问的傻的地方,请见谅, 最后希望大佬看到 能帮忙解答一下,  感谢                     
 楼主| 发表于 2020-11-26 11:49:36 | 显示全部楼层
afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了

这个好,通俗易懂, 而且都是我学习过的, 看来从掌握到灵活应用   还要不断练习才行,  最后感谢A大
发表于 2020-11-26 23:04:55 | 显示全部楼层
本帖最后由 yuantian 于 2020-11-26 23:12 编辑
itzyx 发表于 2020-11-25 23:44
大佬,这个代码 我大致清楚意思了 , 不过有几点没搞懂,还希望能够请教一下,首先 , Else   SetError(0 ...

1.当时作为循环,是为了怕有出现重复的,出现1个以上的序号。

2.当时选择Error,可能是为了防止如果数组容器中找不到点击的控件ID所做的。
返回一个原因。现在看来估计没有什么必要

3.返置数组,可能是我当时考虑如果查找索引的时候,出现大于1个的情况,从大到小删除数组的数据,不会误删数组内剩余的数据

按实际情况删减写就OK...

 楼主| 发表于 2020-11-27 08:57:25 | 显示全部楼层
yuantian 发表于 2020-11-26 23:04
1.当时作为循环,是为了怕有出现重复的,出现1个以上的序号。

2.当时选择Error,可能是为了防止如果数 ...

好的 ,谢谢
 楼主| 发表于 2020-11-27 09:15:35 | 显示全部楼层
afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了

A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”  为什么呀?“\d+” 不是一个或多个数字嘛?
发表于 2020-11-27 10:36:44 | 显示全部楼层
itzyx 发表于 2020-11-27 09:15
A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”  为什么呀?“\d+”  ...

是啊,控件id就是数字,从3开始
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-20 09:08 , Processed in 0.091568 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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