窗体之间的通信,与模态窗体的通信的两种方式

By admin at 2018-02-11 • 0人收藏 • 441人看过

GIF.gif

父窗口代码如下:

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
2018-02-27   #1

以上这种方式有它的好处和弊端:

好处: 一对多, 凡是运行了的程序中有这个接收

subscribe()

的都会同一时间接收到消息.

弊端: 因为一对多,有时候处理不好,就会影响到其他调用的程序.....


于是,为了能避免这个问题,我们需要用函数调用形式来实现:

假设:有工程中有两个界面a和b , 界面b中可以定义一个窗体函数

//获取其他界面传递的参数
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中要是想调用这个窗体函数,只需要:

//调用模态形式弹出子界面
				var frmChild,wb = winform.loadForm("\界面窗口\子窗口\子流程浏览.aardio");
				frmChild.调用子程序(本行数据表);
				//console.dump(本行数据表)
				var ret = frmChild.doModal();
				if(ret){
					winform.流程编辑框.setItemText(ret,nmListView.iItem);	
				}

即: 加载b窗体为子窗体, 然后利用模态窗体等待返回之前,调用那个窗体函数即可.

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...