itzyx 发表于 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 ,想通过读取 ,是否勾选节点,以及勾选时间节点的顺序对应的时间值来运行程序 该怎么写呢?   这个问题我一开始感觉应该挺好解决的,但是想了一天 也没想出啥好思路,尽钻牛角尖了,越走越偏,所以想请教一下各位大佬 ,万分感谢。

afan 发表于 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

yuantian 发表于 2020-11-25 08:00:29

本帖最后由 yuantian 于 2020-11-25 08:13 编辑

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


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

itzyx 发表于 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的函数呢

yuantian 发表于 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
$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

itzyx 发表于 2020-11-25 12:38:30

yuantian 发表于 2020-11-25 10:05
草率了,直接用数组就好
上代码:

好的 ,感谢大佬,目前来看是实现了我想要的功能的,我基础比较弱,先看看 这个代码,等看懂了,再改为已解决 ,再次感谢

yuantian 发表于 2020-11-25 12:45:50

itzyx 发表于 2020-11-25 12:38
好的 ,感谢大佬,目前来看是实现了我想要的功能的,我基础比较弱,先看看 这个代码,等看懂了,再改为 ...

我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。

afan 发表于 2020-11-25 12:57:17

牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何控件都可以。

itzyx 发表于 2020-11-25 15:06:25

afan 发表于 2020-11-25 12:57
牵涉到排序、顺序的,一般使用listview控件,可直观 序,并可方便调整 序。
当然,只要达到功能,使用任何 ...

好的 我回头可以看看,先实现功能再不断探究更好的方法

itzyx 发表于 2020-11-25 23:44:42

yuantian 发表于 2020-11-25 12:45
我也是新手,互相学习互相进步。
论坛里还是有很多知识需要慢慢学习的。

大佬,这个代码 我大致清楚意思了 , 不过有几点没搞懂,还希望能够请教一下,首先 , Else   SetError(0)这里设置@error 为 0 ,为了起什么作用,其次,IfIsArray   会不会多余,因为我感觉得到的都是数组吧 ,最后,如果设置For $a = 1 To UBound($aFindOrder) - 1,是不是就可以规避了$CheckOrder,0基索引对应的值,不用_ArrayReverse反排序 这个数组了
确实才疏学浅,问的傻的地方,请见谅, 最后希望大佬看到 能帮忙解答一下,感谢                     

itzyx 发表于 2020-11-26 11:49:36

afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了

这个好,通俗易懂, 而且都是我学习过的, 看来从掌握到灵活应用   还要不断练习才行,最后感谢A大

yuantian 发表于 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...

itzyx 发表于 2020-11-27 08:57:25

yuantian 发表于 2020-11-26 23:04
1.当时作为循环,是为了怕有出现重复的,出现1个以上的序号。

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

好的 ,谢谢

itzyx 发表于 2020-11-27 09:15:35

afan 发表于 2020-11-26 11:19
直接用字符串存储点击的复选框ID就行了

A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”为什么呀?“\d+” 不是一个或多个数字嘛?

afan 发表于 2020-11-27 10:36:44

itzyx 发表于 2020-11-27 09:15
A大,提个小问题
$aCkLst = StringRegExp($sCkLst, '\d+', 3) ,这个匹配“\d+”为什么呀?“\d+”...

是啊,控件id就是数字,从3开始
页: [1] 2
查看完整版本: 已解决 如何按照复选框勾选顺序去执行代码