aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 13484|回复: 6

动态创建的控件数组响应事件

[复制链接]

1

主题

2

回帖

53

积分

一级会员

积分
53
发表于 2018-5-11 08:31:11 | 显示全部楼层 |阅读模式
在做一个串口操作的小工具,需要用到多个下拉框,而且这些下拉框都完成相同的事件响应,每个控件写一个相同的响应事件感觉有些傻,特向大家请教看是否有更简洁的写法,代码如下:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="端口配置";right=174;bottom=263)
  4. winform.add(
  5. button={cls="button";text="OK";left=9;top=225;right=55;bottom=251;z=9};
  6. button2={cls="button";text="Cancel";left=65;top=225;right=112;bottom=251;z=10};
  7. button3={cls="button";text="Clear";left=123;top=225;right=170;bottom=251;z=11};
  8. static={cls="static";text="端口0";left=17;top=9;right=67;bottom=32;font=LOGFONT(h=-16);transparent=1;z=1};
  9. static2={cls="static";text="端口1";left=17;top=36;right=67;bottom=59;font=LOGFONT(h=-16);transparent=1;z=2};
  10. static3={cls="static";text="端口2";left=17;top=63;right=67;bottom=86;font=LOGFONT(h=-16);transparent=1;z=3};
  11. static4={cls="static";text="端口3";left=17;top=90;right=67;bottom=113;font=LOGFONT(h=-16);transparent=1;z=4};
  12. static5={cls="static";text="端口4";left=17;top=117;right=67;bottom=140;font=LOGFONT(h=-16);transparent=1;z=5};
  13. static6={cls="static";text="端口5";left=17;top=144;right=67;bottom=167;font=LOGFONT(h=-16);transparent=1;z=6};
  14. static7={cls="static";text="端口6";left=17;top=170;right=67;bottom=193;font=LOGFONT(h=-16);transparent=1;z=7};
  15. static8={cls="static";text="端口7";left=17;top=197;right=67;bottom=220;font=LOGFONT(h=-16);transparent=1;z=8}
  16. )
  17. /*}}*/

  18. //批量添加下拉框控件
  19. var comboboxCtrls = winform.add({
  20.     [1]={cls="combobox";left=73;top=9;right=154;bottom=29;edge=1;group=1;items={};mode="dropdown";z=2};
  21.         [2]={cls="combobox";left=73;top=36;right=154;bottom=56;edge=1;group=1;items={};mode="dropdown";z=4};
  22.         [3]={cls="combobox";left=73;top=63;right=154;bottom=83;edge=1;group=1;items={};mode="dropdown";z=6};
  23.         [4]={cls="combobox";left=73;top=90;right=154;bottom=110;edge=1;group=1;items={};mode="dropdown";z=8};
  24.         [5]={cls="combobox";left=73;top=117;right=154;bottom=137;edge=1;group=1;items={};mode="dropdown";z=10};
  25.         [6]={cls="combobox";left=73;top=144;right=154;bottom=164;edge=1;group=1;items={};mode="dropdown";z=12};
  26.         [7]={cls="combobox";left=73;top=170;right=154;bottom=190;edge=1;group=1;items={};mode="dropdown";z=14};
  27.         [8]={cls="combobox";left=73;top=197;right=154;bottom=217;edge=1;group=1;items={};mode="dropdown";z=16};
  28. })

  29. eachComRead = function(){
  30.     import win.reg;
  31.     var b = {};
  32.     //获取电脑中串口号
  33.     var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM");
  34.     if( reg ){
  35.         for(name,value,t in reg.eachValue()){
  36.             table.push(b,value);
  37.         }
  38.         var i = 0;
  39.         return function(){
  40.                     i = i + 1;
  41.                     return b[ i ];
  42.                 };     
  43.     }else {
  44.         return null;
  45.     }   
  46. }

  47. winform.button2.oncommand = function(id,event){
  48.         winform.close()
  49. }

  50. winform.button3.oncommand = function(id,event){
  51.         for(i=1;8;1){
  52.                 comboboxCtrls[ i ].text = ""
  53.         }               
  54. }

  55. //想所有的combobox在同一个事件里做处理
  56. comboboxCtrls[1].oncommand = function(id,event){
  57.         win.msgbox(id,event)
  58. }


  59. init = function(){
  60.         var comTable = eachComRead()
  61.         if(comTable){
  62.                 for com in comTable{
  63.                         for(i=1;8;1){
  64.                                 comboboxCtrls[ i ].add(com)
  65.                     }
  66.                 }               
  67.         }
  68. }


  69. winform.show()
  70. init()
  71. win.loopMessage();
复制代码

4

主题

45

回帖

733

积分

三级会员

积分
733
发表于 2018-5-11 09:29:10 | 显示全部楼层
本来控件的响应是一个匿名函数,分别属于各自的命名空间,每次都添加一遍对于某些情况,如重复控件较多的情况下,是个麻烦事,如果你想实现都响应一个函数,那就把对应的oncommand写成一个单独的函数,利用迭代器或者for循环给每个控件的oncommand赋值即可。参照你的思路,我写了一个按钮的统一响应的例子,其他控件类似。

  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add()
  5. /*}}*/

  6. var test=function(id,event){
  7.     win.msgbox(owner.text)
  8.        
  9. }

  10. var comboboxCtrls = winform.add({
  11.                [1]={cls="button";left=73;top=9;right=154;bottom=29;edge=1;group=1;items={};z=2};
  12.           [2]={cls="button";left=73;top=36;right=154;bottom=56;edge=1;group=1;items={};z=4};
  13.           [3]={cls="button";left=73;top=63;right=154;bottom=83;edge=1;group=1;items={};z=6};
  14.          [4]={cls="button";left=73;top=90;right=154;bottom=110;edge=1;group=1;items={};z=8};
  15.         [5]={cls="button";left=73;top=117;right=154;bottom=137;edge=1;group=1;items={};z=10};
  16.         [6]={cls="button";left=73;top=144;right=154;bottom=164;edge=1;group=1;items={};z=12};
  17.         [7]={cls="button";left=73;top=170;right=154;bottom=190;edge=1;group=1;items={};z=14};
  18.         [8]={cls="button";left=73;top=197;right=154;bottom=217;edge=1;group=1;items={};z=16};
  19. })

  20. for(i=1;8;1){
  21.     comboboxCtrls[ i ].text="button"++i;//给控件批量命名
  22.     comboboxCtrls[ i ].oncommand=test//批量定义控件的命令响应函数
  23. }

  24. winform.show()
  25. win.loopMessage();
复制代码

1

主题

2

回帖

53

积分

一级会员

积分
53
 楼主| 发表于 2018-5-11 10:29:40 | 显示全部楼层
我心飞翔1995 发表于 2018-5-11 09:29
本来控件的响应是一个匿名函数,分别属于各自的命名空间,每次都添加一遍对于某些情况,如重复控件较多的情 ...

非常非常感谢,通过增加属性和绑定控件事件响应解决了这个问题。

1

主题

3

回帖

37

积分

新手入门

积分
37
发表于 2018-5-11 21:44:36 | 显示全部楼层
eachControl很好用
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add(
  5. button={cls="button";text="button";left=119;top=188;right=267;bottom=270;z=1};
  6. button2={cls="button";text="button2";left=328;top=222;right=476;bottom=304;z=2}
  7. )
  8. /*}}*/

  9. for(name,ctrl in winform.eachControl("button") ){
  10.         ctrl.oncommand = function(id,event){
  11.                 winform.msgbox(ctrl.text)
  12.         }
  13. }
  14. winform.show()
  15. win.loopMessage();
复制代码

38

主题

129

回帖

1045

积分

荣誉会员

积分
1045
发表于 2018-5-11 22:39:45 | 显示全部楼层
可以创建的时候绑定事件即可
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add()
  5. /*}}*/

  6. var btTab = {
  7.         cls="button";
  8.         text="button";
  9.         left=173;
  10.         top=40;
  11.         right=344;
  12.         bottom=77;
  13.         //z=1;
  14.         oncommand = function(id,event){
  15.                 owner.msgbox(owner.text);
  16.         }
  17. }

  18. for(i=1;5;1){
  19.         winform.add(
  20.                  ["button"++i] = table.clone(btTab);
  21.         )
  22.         btTab.text = "button"++i;
  23.         btTab.top += 42;
  24.         btTab.bottom += 42;
  25. }

  26. winform.show()
  27. win.loopMessage();
复制代码

点评

同意: 5.0
同意: 5
  发表于 2018-5-12 10:42

0

主题

13

回帖

145

积分

培训班

积分
145
发表于 2018-5-13 17:06:04 | 显示全部楼层
用类写了一个:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="端口配置";right=174;bottom=263;max=false)
  4. winform.add(
  5. btnCancel={cls="button";text="Cancel";left=64;top=226;right=111;bottom=252;z=10};
  6. btnClear={cls="button";text="Clear";left=119;top=226;right=166;bottom=252;z=11};
  7. btnOK={cls="button";text="OK";left=9;top=226;right=55;bottom=252;z=9};
  8. static={cls="static";text="端口1";left=17;top=9;right=67;bottom=32;font=LOGFONT(h=-16);transparent=1;z=1};
  9. static2={cls="static";text="端口2";left=17;top=36;right=67;bottom=59;font=LOGFONT(h=-16);transparent=1;z=2};
  10. static3={cls="static";text="端口3";left=17;top=63;right=67;bottom=86;font=LOGFONT(h=-16);transparent=1;z=3};
  11. static4={cls="static";text="端口4";left=17;top=90;right=67;bottom=113;font=LOGFONT(h=-16);transparent=1;z=4};
  12. static5={cls="static";text="端口5";left=17;top=117;right=67;bottom=140;font=LOGFONT(h=-16);transparent=1;z=5};
  13. static6={cls="static";text="端口6";left=17;top=144;right=67;bottom=167;font=LOGFONT(h=-16);transparent=1;z=6};
  14. static7={cls="static";text="端口7";left=17;top=170;right=67;bottom=193;font=LOGFONT(h=-16);transparent=1;z=7};
  15. static8={cls="static";text="端口8";left=17;top=197;right=67;bottom=220;font=LOGFONT(h=-16);transparent=1;z=8}
  16. )
  17. /*}}*/

  18. //创建类
  19. cmbCls = class {
  20.             cls="combobox";left=73;top=9;right=154;bottom=29;edge=1;group=1;items={};mode="dropdown";
  21.             oncommand = function(id,event){
  22.                     if( event = 0x1/*_CBN_SELCHANGE*/ ){
  23.                                          ..win.msgbox( "选取了"++owner.selText );
  24.                          }
  25.              }
  26. }

  27. //批量创建控件
  28. for(i=1;8;1){       
  29.             var cmbObj = cmbCls();
  30.             cmbObj.text = "";
  31.             cmbObj.top += 27*(i-1);
  32.             cmbObj.bottom += 27*(i-1);
  33.            
  34.         winform.add(
  35.                 ["combobox"++i] = cmbObj;
  36.         )
  37. }

  38. eachComRead = function(){
  39.     import win.reg;
  40.     var b = {};
  41.     //获取电脑中串口号
  42.     var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM");
  43.     if( reg ){
  44.         for(name,value,t in reg.eachValue()){
  45.             table.push(b,value);
  46.         }
  47.         var i = 0;
  48.         return function(){
  49.                     i = i + 1;
  50.                     return b[ i ];
  51.                 };     
  52.     }else {
  53.         return null;
  54.     }   
  55. }

  56. winform.btnCancel.oncommand = function(id,event){
  57.         winform.close();
  58. }

  59. winform.btnClear.oncommand = function(id,event){
  60.                 for(i=1;8;1){
  61.                         winform["combobox"++i].text = "";
  62.                 }
  63. }

  64. init = function(){
  65.         var comTable = eachComRead();
  66.         if(comTable){
  67.                 for com in comTable{
  68.                         for(i=1;8;1){
  69.                                 winform["combobox"++i].add(com);
  70.                             }
  71.                 }               
  72.         }
  73. }

  74. winform.show();
  75. init();
  76. win.loopMessage();
复制代码
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-10-4 19:43 , Processed in 0.057978 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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