找回密码  加入

AUTOIT CN

搜索
查看: 260|回复: 7

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

这样理解不知对不:

  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.         GUICtrlSetOnEvent($combo_array[$i], "add")
  12. Next
  13. ;对$combo_array赋值        注意,这里的字符都是无规律的,
  14. GUICtrlSetData($combo_array[1], '随机字符1|随机字符2|随机字符3')
  15. GUICtrlSetData($combo_array[2], '随机字符21|随机字符25|随机字符26|随机字符28')
  16. ;校验
  17. $lable = GUICtrlCreateLabel('显示选择的结果', 10, 50, 200, 20)
  18. $bt = GUICtrlCreateButton('按钮', 10, 100, 200, 40)
  19. GUICtrlSetOnEvent($bt, "add");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
  20. GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
  21. GUISetState(@SW_SHOW)
  22. While 1
  23.         Sleep(10)
  24. WEnd
  25. Func add()
  26.         Local $comboa = @GUI_CtrlId - 2
  27.         If $comboa = "1" Then;combo信息
  28.                 MsgBox(0, "GUI_CtrlId", $comboa)
  29.                 _GUICtrlComboBox_SetCurSel($combo_array[1], 0)
  30.                 udf()
  31.         ElseIf $comboa = "2" Then;combo信息
  32.                 MsgBox(0, "GUI_CtrlId", $comboa)
  33.                 _GUICtrlComboBox_SetCurSel($combo_array[1], 1)
  34.                 udf1()
  35.         EndIf
  36. EndFunc   ;==>add

  37. Func udf();本部分的代码已经写好了,不允许改动
  38.         Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
  39.         GUICtrlSetData($lable, $temp)
  40. EndFunc   ;==>udf
  41. Func udf1();本部分的代码已经写好了,不允许改动
  42.         Local $temp = _GUICtrlComboBox_GetEditText(@GUI_CtrlId);        UDF里面,我是通过        @GUI_CtrlId        来判断到底哪个combo被点击了。
  43.         GUICtrlSetData($lable, $temp)
  44. EndFunc   ;==>udf1
  45. Func QUIT()
  46.         Exit
  47. EndFunc   ;==>QUIT
复制代码
 楼主| 发表于 2019-1-13 19:10:44 | 显示全部楼层
本帖最后由 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  这个不知道具体的写法
发表于 2019-1-13 19:55:46 | 显示全部楼层
本帖最后由 chzj589 于 2019-1-14 09:40 编辑
fenhanxue 发表于 2019-1-13 19:10
实际的源程序,控件非常多,combo的id其实也没什么规律,这个方法行是行的,就是得把所有的控件的编号全 ...

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



  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. Opt("GUIOnEventMode", 1)
  5. $Form1 = 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. ;GUICtrlSetOnEvent($combo_array[$i], "add")
  12. ;Next
  13. $combo1 = GUICtrlCreateCombo('', 30, 10, 130, 30)
  14. ;GUICtrlSetOnEvent(-1, "_idCombo");"add")
  15. $combo2 = GUICtrlCreateCombo('', 180, 10, 130, 30)
  16. ;GUICtrlSetOnEvent(-1, "_idCombo1");"add")
  17. ;对$combo_array赋值        注意,这里的字符都是无规律的,
  18. GUICtrlSetData($combo1, '随机字符1|随机字符2|随机字符3')
  19. GUICtrlSetData($combo2, '随机字符21|随机字符25|随机字符26|随机字符28')
  20. ControlCommand($Form1, "", 'ComboBox1', "SetCurrentSelection", 0)
  21. ControlCommand($Form1, "", 'ComboBox2', "SetCurrentSelection", 0)
  22. $lable1 = GUICtrlCreateLabel('显示选择的结果', 30, 50, 20, 30)
  23. $com1 = _GUICtrlComboBox_GetCurSel($combo1)
  24. GUICtrlSetData($lable1, $com1)
  25. $lable2 = GUICtrlCreateLabel('显示选择的结果', 180, 50, 20, 30)
  26. $com2 = _GUICtrlComboBox_GetCurSel($combo2)
  27. GUICtrlSetData($lable2, $com2)
  28. $lablea2 = GUICtrlCreateLabel('', 220, 50, 20, 30)
  29. $sComboRead = _GUICtrlComboBox_GetCount($combo2)
  30. GUICtrlSetData($lablea2, $sComboRead)
  31. ;校验
  32. $lable = GUICtrlCreateLabel('显示选择的结果', 10, 90, 200, 30)
  33. $bt = GUICtrlCreateButton('按钮', 10, 150, 200, 40)
  34. GUICtrlSetOnEvent($bt, "_idComboa");==>==>==>==>==>==>==>==>==>==>此行是问题的核心
  35. GUISetOnEvent($GUI_EVENT_CLOSE, "QUIT")
  36. GUISetState(@SW_SHOW)
  37. While 1
  38.         Sleep(10)
  39. WEnd
  40. Func _idComboa()
  41.         ; 获取项目数
  42.         ; MsgBox(0, "消息", "项目数量: " & _GUICtrlComboBox_GetCount($combo2))
  43.         $sComboReada = _GUICtrlComboBox_GetCount($combo2)
  44.         $sComboRead = GUICtrlRead($lable2)
  45.         If $sComboRead = $sComboReada Then
  46.                 GUICtrlSetData($lable2, "")

  47.         Else
  48.                 $t = GUICtrlRead($lable2) + 1
  49.                 GUICtrlSetData($lable2, $t)
  50.                 ControlCommand($Form1, "", 'ComboBox2', "SetCurrentSelection", $t)
  51.                 $temp = GUICtrlRead($combo2)
  52.                 GUICtrlSetData($lable, $temp)
  53.                 GUICtrlSetColor($lable, 0x009900); 背景色
  54.                 GUICtrlSetFont($lable, 10, 600, 0, "微软雅黑")
  55.         EndIf
  56. EndFunc   ;==>_idComboa
  57. Func QUIT()
  58.         Exit
  59. EndFunc   ;==>QUIT
复制代码


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

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


 

本帖子中包含更多资源

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

x
发表于 2019-1-23 22:52:26 | 显示全部楼层
初始化一个函数=0保存状态,触发就=1  循环了写个判断$if=1 执行
 楼主| 发表于 2019-1-24 15:30:15 | 显示全部楼层
gzh888666 发表于 2019-1-23 22:52
初始化一个函数=0保存状态,触发就=1  循环了写个判断$if=1 执行

也是个思路,就是感觉这样改代码的工作量也有点大。。。
我在想有没什么办法,直接改变 @GUI_CtrlId 为我指定的控件id,这样是最省力的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-5-22 02:00 , Processed in 0.062500 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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