窗体之间的通信,与模态窗体的通信的两种方式
By
admin
at 2018-02-11 • 0人收藏 • 2554人看过
父窗口代码如下:
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();
模态窗口代码如下:
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;
1 个回复 | 最后更新于 2018-02-27
登录后方可回帖
以上这种方式有它的好处和弊端:
好处: 一对多, 凡是运行了的程序中有这个接收
subscribe()
的都会同一时间接收到消息.
弊端: 因为一对多,有时候处理不好,就会影响到其他调用的程序.....
于是,为了能避免这个问题,我们需要用函数调用形式来实现:
假设:有工程中有两个界面a和b , 界面b中可以定义一个窗体函数
那么这个时候,界面a中要是想调用这个窗体函数,只需要:
即: 加载b窗体为子窗体, 然后利用模态窗体等待返回之前,调用那个窗体函数即可.