找回密码  加入

AUTOIT CN

搜索
查看: 117|回复: 5

[AU3基础] 当通过代码改变combo内容的时候,如何同时触发GUICtrlSetOnEvent所对应的函数

[复制链接]
发表于 2019-1-12 20:37:16 | 显示全部楼层 |阅读模式
本帖最后由 fenhanxue 于 2019-1-12 20:50 编辑

问题比较拗口。是这样的,我的一个程序,代码已经写好了,要添加一个小功能,原程序已有的代码太多了,不允许改动,因为一改动要改的地方就实在太多太多了。

下面是我的原程序的简化模型:
  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. Opt("GUIOnEventMode", 1)

  5. GUICreate("窗")

  6. Local $n = 2;这里简化了模型,实际上n数字很大,例如 n= 100
  7. Local $combo_array[1+$n]
  8. For $i = 1 To $n
  9.         $combo_array[$i] = GUICtrlCreateCombo('',150 * $i - 90 ,10,130,30)
  10.         GUICtrlSetOnEvent($combo_array[$i], "udf");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
  11. Next
  12.         
  13. ;对$combo_array赋值        注意,这里的字符都是无规律的,
  14. GUICtrlSetData($combo_array[1],'随机字符1|随机字符2|随机字符3')
  15. GUICtrlSetData($combo_array[2],'随机字符21|随机字符25|随机字符28')
  16.         
  17. ;校验
  18. $lable = GUICtrlCreateLabel('显示选择的结果',10,50,200,20)

  19. GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
  20. GUISetState(@SW_SHOW)
  21. While 1
  22.         Sleep(10)
  23. WEnd

  24. Func udf();本部分的代码已经写好了,不允许改动               
  25.         Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
  26.         GUICtrlSetData($lable,$temp)
  27. EndFunc

  28. Func QUIT()
  29.     Exit
  30. EndFunc   ;==>退出程序
复制代码


原程序环境下,我用鼠标选任意个combo下的文字,  udf() 都会做出对应的反应。
udf()本身代码不允许改动。主要是根据@GUI_CtrlId 这个参数来判断,到底鼠标点了哪一个combo的


我现在要增加的功能是,我按一下按钮,程序会用代码来勾选combo的指定选项。那么此时,如何去触发udf()呢?
也就是说:
例如,本来,我用鼠标点选第一个combo的第二个选项,那么udf()函数会做出相应,并显示‘随机字符2’
现在,我不想用鼠标点,而是用代码来选combo的第二个选项,那么如何让udf()被触发?
  1. _GUICtrlComboBox_SetCurSel
复制代码


也就是这样的代码,如何让他触发udf事件?下面的代码,并没有触发udf():
  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. Opt("GUIOnEventMode", 1)

  5. GUICreate("窗")

  6. Local $n = 2;这里简化了模型,实际上n数字很大,例如 n= 100
  7. Local $combo_array[1+$n]
  8. For $i = 1 To $n
  9.         $combo_array[$i] = GUICtrlCreateCombo('',150 * $i - 90 ,10,130,30)
  10.         GUICtrlSetOnEvent($combo_array[$i], "udf");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
  11. Next
  12.         
  13. ;对$combo_array赋值        注意,这里的字符都是无规律的,
  14. GUICtrlSetData($combo_array[1],'随机字符1|随机字符2|随机字符3')
  15. GUICtrlSetData($combo_array[2],'随机字符21|随机字符25|随机字符28')
  16.         
  17. ;校验
  18. $lable = GUICtrlCreateLabel('显示选择的结果',10,50,200,20)

  19. $bt = GUICtrlCreateButton('按钮',10,100,200,40)
  20. GUICtrlSetOnEvent($bt, "add");==>==>==>==>==>==>==>==>==>==>此行是问题的核心

  21. GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
  22. GUISetState(@SW_SHOW)
  23. While 1
  24.         Sleep(10)
  25. WEnd
  26. Func add()
  27.         _GUICtrlComboBox_SetCurSel($combo_array[1],1)
  28. EndFunc

  29. Func udf();本部分的代码已经写好了,不允许改动               
  30.         Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
  31.         GUICtrlSetData($lable,$temp)
  32. EndFunc

  33. Func QUIT()
  34.     Exit
  35. EndFunc   ;==>退出程序
复制代码

当然,这样的代码也并没达到我想要的目的:
  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. Opt("GUIOnEventMode", 1)

  5. GUICreate("窗")

  6. Local $n = 2;这里简化了模型,实际上n数字很大,例如 n= 100
  7. Local $combo_array[1+$n]
  8. For $i = 1 To $n
  9.         $combo_array[$i] = GUICtrlCreateCombo('',150 * $i - 90 ,10,130,30)
  10.         GUICtrlSetOnEvent($combo_array[$i], "udf");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
  11. Next
  12.         
  13. ;对$combo_array赋值        注意,这里的字符都是无规律的,
  14. GUICtrlSetData($combo_array[1],'随机字符1|随机字符2|随机字符3')
  15. GUICtrlSetData($combo_array[2],'随机字符21|随机字符25|随机字符28')
  16.         
  17. ;校验
  18. $lable = GUICtrlCreateLabel('显示选择的结果',10,50,200,20)

  19. $bt = GUICtrlCreateButton('按钮',10,100,200,40)
  20. GUICtrlSetOnEvent($bt, "add");==>==>==>==>==>==>==>==>==>==>此行是问题的核心

  21. GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
  22. GUISetState(@SW_SHOW)
  23. While 1
  24.         Sleep(10)
  25. WEnd
  26. Func add()
  27.         _GUICtrlComboBox_SetCurSel($combo_array[1],1)
  28.         udf()
  29. EndFunc

  30. Func udf();本部分的代码已经写好了,不允许改动               
  31.         Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
  32.         GUICtrlSetData($lable,$temp)
  33. EndFunc

  34. Func QUIT()
  35.     Exit
  36. EndFunc   ;==>退出程序
复制代码
因为上面的代码,在执行 udf()的时候, @GUI_CtrlId  实际上已经变成按钮的id了,而不是我原设想的combo的id。



也就是这样的代码,并不能达到  和鼠标点击combo一模一样的效果:
  1. _GUICtrlComboBox_SetCurSel($combo_array[1],1)
  2.         udf()
复制代码



 楼主| 发表于 2019-1-12 21:18:17 | 显示全部楼层
实际上再简化下问题可能就是如何改变   @GUI_CtrlId 这个参数的值?
也就是怎么把第一个combo的id赋值给   @GUI_CtrlId
发表于 7 天前 | 显示全部楼层
fenhanxue 发表于 2019-1-12 21:18
实际上再简化下问题可能就是如何改变   @GUI_CtrlId 这个参数的值?
也就是怎么把第一个combo的id赋值给   ...

这样理解不知对不:
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <GuiComboBox.au3>
Opt("GUIOnEventMode", 1)

GUICreate("窗")

Local $n = 2;这里简化了模型,实际上n数字很大,例如 n= 100
Local $combo_array[1 + $n]
For $i = 1 To $n
        $combo_array[$i] = GUICtrlCreateCombo('', 150 * $i - 90, 10, 130, 30)
        ;GUICtrlSetOnEvent($combo_array[$i], "udf");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
        GUICtrlSetOnEvent($combo_array[$i], "add")
Next
;对$combo_array赋值        注意,这里的字符都是无规律的,
GUICtrlSetData($combo_array[1], '随机字符1|随机字符2|随机字符3')
GUICtrlSetData($combo_array[2], '随机字符21|随机字符25|随机字符26|随机字符28')
;校验
$lable = GUICtrlCreateLabel('显示选择的结果', 10, 50, 200, 20)
$bt = GUICtrlCreateButton('按钮', 10, 100, 200, 40)
GUICtrlSetOnEvent($bt, "add");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
GUISetState(@SW_SHOW)
While 1
        Sleep(10)
WEnd
Func add()
        Local $comboa = @GUI_CtrlId - 2
        If $comboa = "1" Then;combo信息
                MsgBox(0, "GUI_CtrlId", $comboa)
                _GUICtrlComboBox_SetCurSel($combo_array[1], 0)
                udf()
        ElseIf $comboa = "2" Then;combo信息
                MsgBox(0, "GUI_CtrlId", $comboa)
                _GUICtrlComboBox_SetCurSel($combo_array[1], 1)
                udf1()
        EndIf
EndFunc   ;==>add

Func udf();本部分的代码已经写好了,不允许改动
        Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
        GUICtrlSetData($lable, $temp)
EndFunc   ;==>udf
Func udf1();本部分的代码已经写好了,不允许改动
        Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
        GUICtrlSetData($lable, $temp)
EndFunc   ;==>udf1
Func QUIT()
        Exit
EndFunc   ;==>QUIT
 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 fenhanxue 于 2019-1-13 19:20 编辑
chzj589 发表于 2019-1-13 17:54
这样理解不知对不:

实际的源程序,控件非常多,combo的id其实也没什么规律,这个方法行是行的,就是得把所有的控件的编号全部都找出来并列举一遍,例如我有100个combo,那工作量就非常大啦。

我现在想来想去,可能我要问的问题是这样的:
已知两个控件ID:  $combo1  和  $bt1
求:
当鼠标点击 $bt1 后,如何让 @GUI_CtrlId  等于 $combo1
我们都知道,鼠标点击 $bt1 后, @GUI_CtrlId 肯定是等于 $bt1的,那么用哪些代码,可以让 @GUI_CtrlId 等于 $combo1


ControlClick  ?
GUICtrlSendMsg ?


ControlClick  好像不稳定,有时候会出现没有点上的情况

GUICtrlSendMsg  这个不知道具体的写法
发表于 7 天前 | 显示全部楼层
本帖最后由 chzj589 于 2019-1-14 09:40 编辑
fenhanxue 发表于 2019-1-13 19:10
实际的源程序,控件非常多,combo的id其实也没什么规律,这个方法行是行的,就是得把所有的控件的编号全 ...

不好意思。昨天晚上家里小孩在捣乱,没经过测试就帖上来。重发代码:


#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <GuiComboBox.au3>
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("窗")
Local $n = 2;这里简化了模型,实际上n数字很大,例如 n= 100
Local $combo_array[1 + $n]
;For $i = 1 To $n
;$combo_array[$i] = GUICtrlCreateCombo('', 150 * $i - 90, 10, 130, 30)
;GUICtrlSetOnEvent($combo_array[$i], "udf");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
;GUICtrlSetOnEvent($combo_array[$i], "add")
;Next
$combo1 = GUICtrlCreateCombo('', 30, 10, 130, 30)
;GUICtrlSetOnEvent(-1, "_idCombo");"add")
$combo2 = GUICtrlCreateCombo('', 180, 10, 130, 30)
;GUICtrlSetOnEvent(-1, "_idCombo1");"add")
;对$combo_array赋值        注意,这里的字符都是无规律的,
GUICtrlSetData($combo1, '随机字符1|随机字符2|随机字符3')
GUICtrlSetData($combo2, '随机字符21|随机字符25|随机字符26|随机字符28')
ControlCommand($Form1, "", 'ComboBox1', "SetCurrentSelection", 0)
ControlCommand($Form1, "", 'ComboBox2', "SetCurrentSelection", 0)
$lable1 = GUICtrlCreateLabel('显示选择的结果', 30, 50, 20, 30)
$com1 = _GUICtrlComboBox_GetCurSel($combo1)
GUICtrlSetData($lable1, $com1)
$lable2 = GUICtrlCreateLabel('显示选择的结果', 180, 50, 20, 30)
$com2 = _GUICtrlComboBox_GetCurSel($combo2)
GUICtrlSetData($lable2, $com2)
$lablea2 = GUICtrlCreateLabel('', 220, 50, 20, 30)
$sComboRead = _GUICtrlComboBox_GetCount($combo2)
GUICtrlSetData($lablea2, $sComboRead)
;校验
$lable = GUICtrlCreateLabel('显示选择的结果', 10, 90, 200, 30)
$bt = GUICtrlCreateButton('按钮', 10, 150, 200, 40)
GUICtrlSetOnEvent($bt, "_idComboa");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
GUISetState(@SW_SHOW)
While 1
        Sleep(10)
WEnd
Func _idComboa()
        ; 获取项目数
        ; MsgBox(0, "消息", "项目数量: " & _GUICtrlComboBox_GetCount($combo2))
        $sComboReada = _GUICtrlComboBox_GetCount($combo2)
        $sComboRead = GUICtrlRead($lable2)
        If $sComboRead = $sComboReada Then
                GUICtrlSetData($lable2, "")

        Else
                $t = GUICtrlRead($lable2) + 1
                GUICtrlSetData($lable2, $t)
                ControlCommand($Form1, "", 'ComboBox2', "SetCurrentSelection", $t)
                $temp = GUICtrlRead($combo2)
                GUICtrlSetData($lable, $temp)
                GUICtrlSetColor($lable, 0x009900); 背景色
                GUICtrlSetFont($lable, 10, 600, 0, "微软雅黑")
        EndIf
EndFunc   ;==>_idComboa
Func QUIT()
        Exit
EndFunc   ;==>QUIT


发表于 4 天前 | 显示全部楼层
chzj589 发表于 2019-1-13 19:55
不好意思。昨天晚上家里小孩在捣乱,没经过测试就帖上来。重发代码:

折腾来折腾去,变成这个样子。但是却学习了上下按钮控件的使用。


 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-1-20 23:03 , Processed in 0.100782 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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