窗体之间的通信,与模态窗体的通信的两种方式
By admin at 2018-02-11 • 0人收藏 • 1623人看过
父窗口代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import win.ui; /*DSG{{*/ mainForm = win.form(text= "与模态窗口相互通信演示" ;right= 372 ;bottom= 292 ) mainForm.add( button={cls= "button" ;text= "打开模态子窗口并附带参数" ;left= 197 ;top= 19 ;right= 360 ;bottom= 88 ;z= 3 }; edit={cls= "edit" ;text= "你好啊,模态子窗口?" ;left= 20 ;top= 18 ;right= 187 ;bottom= 85 ;edge= 1 ;multiline= 1 ;z= 1 }; edit2={cls= "edit" ;left= 18 ;top= 107 ;right= 359 ;bottom= 186 ;edge= 1 ;multiline= 1 ;z= 2 }; edit3={cls= "edit" ;left= 16 ;top= 214 ;right= 359 ;bottom= 279 ;edge= 1 ;multiline= 1 ;z= 4 } ) /*}}*/ mainForm.button.oncommand = function (id,event){ var frmChild,wb = mainForm.loadForm( "\筛选器\testaa.aardio" ); publish( "窗体之间传参" ,mainForm.edit.text) var chstr = frmChild.doModal(); mainForm.edit3.text =chstr } subscribe( "接收一个窗口销毁" , function (...){ mainForm.edit2.text = ... } ) mainForm.enableDpiScaling(); mainForm.show(); return win.loopMessage(); |
模态窗口代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import win.ui; /*DSG{{*/ var winform = win.form(text= "模态子窗口" ;right= 326 ;bottom= 274 ;parent=...) winform.add( button={cls= "button" ;text= "关闭模态窗口并附带返回值" ;left= 12 ;top= 197 ;right= 312 ;bottom= 258 ;z= 2 }; edit={cls= "edit" ;left= 12 ;top= 13 ;right= 315 ;bottom= 185 ;edge= 1 ;multiline= 1 ;z= 1 } ) /*}}*/ winform.beforShowWindow = function (shown,status){ subscribe( "窗体之间传参" , function (str){ winform.edit.text = str; } ) } winform.beforeDestroy = function (){ publish( "接收一个窗口销毁" , '我是模态窗口销毁时候的返回消息:\r\n' ++ winform.edit.text) } winform.button.oncommand = function (id,event){ winform.endModal( '我是点击了关闭模态窗口的返回消息:\r\n' ++ "你好啊主窗口,我是模态窗口关闭附带的返回值." ) } winform.enableDpiScaling(); winform.show(); win.loopMessage(); return winform; |
aardio
1 个回复 | 最后更新于 2018-02-27
admin
2018-02-27 #1
以上这种方式有它的好处和弊端:
好处: 一对多, 凡是运行了的程序中有这个接收
subscribe()
的都会同一时间接收到消息.
弊端: 因为一对多,有时候处理不好,就会影响到其他调用的程序.....
于是,为了能避免这个问题,我们需要用函数调用形式来实现:
假设:有工程中有两个界面a和b , 界面b中可以定义一个窗体函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //获取其他界面传递的参数 winform.调用子程序 = function (tab){ //第五项需要字符串转换为table表 eval_retTable5 = eval(tab[ 5 ]); //复制获得的表给此界面初始化表 retTable = table.clone(tab); var str = eval_retTable5[ "调用子程序" ]; for (i= 1 ;winform.子流程列表.count; 1 ){ if (winform.子流程列表.getItemText(i, 1 ) == str){ winform.子流程列表.selIndex = i; winform.子流程列表.setFocus() winform.子流程列表.ensureVisible(); break ; } } } |
那么这个时候,界面a中要是想调用这个窗体函数,只需要:
1 2 3 4 5 6 7 8 | //调用模态形式弹出子界面 var frmChild,wb = winform.loadForm( "\界面窗口\子窗口\子流程浏览.aardio" ); frmChild.调用子程序(本行数据表); //console.dump(本行数据表) var ret = frmChild.doModal(); if (ret){ winform.流程编辑框.setItemText(ret,nmListView.iItem); } |
即: 加载b窗体为子窗体, 然后利用模态窗体等待返回之前,调用那个窗体函数即可.