找回密码  加入

AUTOIT CN

搜索
查看: 596|回复: 17

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

[复制链接]
发表于 2020-11-25 00:32:11 | 显示全部楼层 |阅读模式
本帖最后由 itzyx 于 2020-11-26 11:56 编辑
  1. #include <DateTimeConstants.au3>

  2. GUICreate("Form1", 400, 300)
  3. $Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
  4. $Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
  5. $Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
  6. $Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)

  7. $time1=GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
  8. $time2=GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
  9. $time3=GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
  10. $time4=GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
  11. $style = "yyyy/MM/dd HH:mm:ss"
  12. $DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW,来自于函数DateTimeConstants.au3

  13. GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
  14. GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
  15. GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
  16. GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)


  17. $b = GUICtrlCreateButton('Start', 130, 200, 150, 25)
  18. GUISetState()
  19. $ck = 0
  20. While 1
  21.         $nMsg = GUIGetMsg()
  22.         Switch $nMsg
  23.                 Case -3
  24.                         Exit
  25.                 Case $b
  26.                         For $i = 1 To 4
  27.                                 If GUICtrlRead(Eval('Checkbox' & $i)) = 1 Then
  28.                                         $ck = $i
  29.                                         Call('_Go')
  30.                                 EndIf
  31.                         Next
  32.         EndSwitch
  33. WEnd


  34. Func _Go()
  35.         Switch $ck
  36.                 Case 1
  37.                         MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
  38.                 Case 2
  39.                         MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
  40.                 Case 3
  41.                         MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
  42.                 Case 4
  43.                         MsgBox(0, '', '执行复选框 ' & $ck & ' 的任务')
  44.                                 EndSwitch
  45. EndFunc
复制代码
各位大佬好,如上图代码,四个时间节点复选框,对应四个时间表,我如果按照顺序依次点击复选框 1,2,3,4  这样执行确实没问题, 但是我如果 不按顺序点击复选框,比如按照:4,2,3,1 这样的顺序点击的话 ,因为switch 函数是从上到下按照优先级来的,执行的输出情况还是 1234。 现在我想按照自己点击的顺序,比如我依次点击的时间节点 是2-4-3-1 ,想通过读取 ,是否勾选节点,以及勾选时间节点的顺序对应的时间值来运行程序 该怎么写呢?   这个问题我一开始感觉应该挺好解决的,但是想了一天 也没想出啥好思路,尽钻牛角尖了,越走越偏,所以想请教一下各位大佬 ,万分感谢。
发表于 2020-11-26 11:19:33 | 显示全部楼层
直接用字符串存储点击的复选框ID就行了
  1. GUICreate("Form1", 400, 300)
  2. $Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
  3. $Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
  4. $Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
  5. $Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)

  6. $time1 = GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
  7. $time2 = GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
  8. $time3 = GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
  9. $time4 = GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
  10. $style = "yyyy/MM/dd HH:mm:ss"
  11. $DTM_SETFORMAT_ = 0x1032

  12. GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
  13. GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
  14. GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
  15. GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)

  16. $btn = GUICtrlCreateButton('Start', 130, 200, 150, 25)
  17. GUISetState()

  18. Local $ii, $aCkLst, $sCkLst = ';'
  19. While 1
  20.         $nMsg = GUIGetMsg()
  21.         Switch $nMsg
  22.                 Case -3
  23.                         Exit
  24.                 Case $Checkbox1 To $Checkbox4
  25.                         If GUICtrlRead($nMsg) = 1 Then
  26.                                 $sCkLst &= $nMsg & ';'
  27.                         Else
  28.                                 $sCkLst = StringReplace($sCkLst, ';' & $nMsg & ';', ';')
  29.                         EndIf
  30.                 Case $btn
  31.                         $aCkLst = StringRegExp($sCkLst, '\d+', 3)
  32.                         For $ii = 0 To UBound($aCkLst) - 1
  33.                                 _Go($aCkLst[$ii])
  34.                         Next
  35.         EndSwitch
  36. WEnd

  37. Func _Go($id)
  38.         MsgBox(0, $id - $Checkbox1 + 1, '执行复选框 ' & GUICtrlRead($id, 1) & ' 的任务')
  39. EndFunc   ;==>_Go
复制代码

评分

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

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 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
我的理解是做一个全局变量,
每当勾选一个复选框后,在这个全局变量后追加一个带分隔符的序号,
然后按按 ...

是的,我知道 可以
  1. While 1
  2.         $nMsg = GUIGetMsg()
  3.         Switch $nMsg
  4.                 Case -3
  5.                         ExitLoop
  6.                 Case $Checkbox1 To $Checkbox4
  7.                         If GUICtrlRead($nMsg) = 1 Then
  8.                                 $sl += 1
  9.                                                                 $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
是的,我知道 可以
来获取每次点击的顺序 ,以及复选框名称, 但是之后我不知道何处下手,去调用勾选复 ...

草率了,直接用数组就好
上代码:

  1. #include <DateTimeConstants.au3>
  2. #include <Array.au3>

  3. GUICreate("Form1", 400, 300)
  4. Global $CheckOrder[0]
  5. $Checkbox1 = GUICtrlCreateCheckbox("时间节点 - 1", 40, 30, 97, 17)
  6. $Checkbox2 = GUICtrlCreateCheckbox("时间节点 - 2", 40, 60, 97, 17)
  7. $Checkbox3 = GUICtrlCreateCheckbox("时间节点 - 3", 40, 90, 97, 17)
  8. $Checkbox4 = GUICtrlCreateCheckbox("时间节点 - 4", 40, 120, 97, 17)

  9. $time1 = GUICtrlCreateDate('2020/11/24', 200, 30, 180, 17)
  10. $time2 = GUICtrlCreateDate('2020/11/24', 200, 60, 180, 17)
  11. $time3 = GUICtrlCreateDate('2020/11/24', 200, 90, 180, 17)
  12. $time4 = GUICtrlCreateDate('2020/11/24', 200, 120, 180, 17)
  13. $style = "yyyy/MM/dd HH:mm:ss"
  14. $DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW,来自于函数DateTimeConstants.au3

  15. GUICtrlSendMsg($time1, $DTM_SETFORMAT_, 0, $style)
  16. GUICtrlSendMsg($time2, $DTM_SETFORMAT_, 0, $style)
  17. GUICtrlSendMsg($time3, $DTM_SETFORMAT_, 0, $style)
  18. GUICtrlSendMsg($time4, $DTM_SETFORMAT_, 0, $style)


  19. $b = GUICtrlCreateButton('Start', 130, 200, 150, 25)
  20. GUISetState()
  21. While 1
  22.         $nMsg = GUIGetMsg()
  23.         Switch $nMsg
  24.                 Case -3
  25.                         Exit

  26.                 Case $Checkbox1 To $Checkbox4
  27.                         If GUICtrlRead($nMsg) = 1 Then
  28.                                 _ArrayAdd($CheckOrder, $nMsg)
  29.                         Else
  30.                                 SetError(0)
  31.                                 $aFindOrder = _ArrayFindAll($CheckOrder, $nMsg)
  32.                                 If IsArray($aFindOrder) Then
  33.                                         _ArrayReverse($aFindOrder)
  34.                                         For $a = 0 To UBound($aFindOrder) - 1
  35.                                                 _ArrayDelete($CheckOrder, $aFindOrder[$a])
  36.                                         Next
  37.                                 Else
  38.                                         ConsoleWrite("@error:" & @error & @CRLF)
  39.                                 EndIf
  40.                         EndIf

  41.                 Case $b
  42.                         If IsArray($CheckOrder) Then
  43.                                 For $i = 0 To UBound($CheckOrder) - 1
  44.                                         If GUICtrlRead($CheckOrder[$i]) = 1 Then Call('_Go', $CheckOrder[$i])
  45.                                 Next
  46.                         EndIf
  47.         EndSwitch
  48. WEnd


  49. Func _Go($Var)
  50.         Switch $Var
  51.                 Case $Checkbox1
  52.                         MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
  53.                         
  54.                 Case $Checkbox2
  55.                         MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
  56.                         
  57.                 Case $Checkbox3
  58.                         MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
  59.                         
  60.                 Case $Checkbox4
  61.                         MsgBox(0, '', '执行复选框 ' & GUICtrlRead($Var, 1) & ' 的任务')
  62.         EndSwitch
  63. 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, 2021-1-20 08:24 , Processed in 1.703016 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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