aardio多窗口交互的方法
将窗体对象赋值到全局变量,就可以在其他代码文件中直接使用了。例如主窗体我们一般这样写:mainForm = win.form(text="使用选项卡控件";right=599;bottom=399)
注意一个程序中只有主窗体命名为 mainForm 。
但大多时候,我们应当把其他窗体对象赋值以局部变量,例如:var frmTabPage1 = win.form(text="选项卡的子窗口";right=599;bottom=399)
上面的 var 语句声明一个局部变量 - 局部变量限制了他的作用域在定义他的语句块中生效,不能在其他文件中访问该局部变量。
实际上全局变量要少用,全局的窗体对象更应该少用,每个窗体应当保持独立性。打个比方,一个程序小象一个小世界,各个子窗口就象各个小国家,国家之间要保持一定的独立性,国家与国家之间有什么事儿要沟通 - 你不能直接随意的冲过国界跑来跑去的玩儿(大家都这样搞,就象各个窗体的控件都这样搞,程序就会变的很混乱),你得经过外交部门。这个外交部门,在我们写程序的时候来讲,我们可以用以下几种方式来实现:
方式1、直接在 main.aardio 中创建全局变量,例如 main.aardio代码如下:
import win.ui; /*DSG{{*/ mainForm = win.form(text="使用选项卡控件";right=599;bottom=399) mainForm.add(tab={cls="tab";left=23;top=20;right=568;bottom=373;edge=1;z=1}) /*}}*/ frmTabPage1 = mainForm.tab.loadForm("\res\frmTabPage1.aardio"); frmTabPage2 = mainForm.tab.loadForm("\res\frmTabPage2.aardio"); myUserInfo = { username = "" ;//frmTabPage1.editUsername.text 的值 passeword = "" ;//frmTabPage1.editPassword.text 的值 webSite = "" ;//frmTabPage2.editWebsit.text 的值 } mainForm.show() 当然全局变量是所有加载的窗体可以直接访问的,例如在/res/frmTabPage1.aau中可以这样写: frmTabPage1.editUsername.oncommand = function(id,event){ if( event = 0x300/*_EN_CHANGE*/ ){ myUserInfo.username = frmTabPage1.editUsername.text; } }
方式2、公用类库的方式,例如我们新建一个用户库 叫 myUserInfo,里面的代码如下:
namespace myUserInfo{ username = "" ;//frmTabPage1.editUsername.text 的值 passeword = "" ;//frmTabPage1.editPassword.text 的值 webSite = "" ;//frmTabPage2.editWebsit.text 的值 } 那么在 /res/frmTabPage1.aardio 这个文件里就可以这么写,在修改文本框的时候及时更新公用的数据: import myUserInfo; frmTabPage1.editUsername.oncommand = function(id,event){ if( event = 0x300/*_EN_CHANGE*/ ){ myUserInfo.username = frmTabPage1.editUsername.text; } }
其他窗体要使用这个数据同样很简单,只要import myUserInfo; 就行了;
方式3、在控件值变更的时候调用 publish() 函数发布消息就行了,例如:
frmTabPage1.editUsername.oncommand = function(id,event){ if( event = 0x300/*_EN_CHANGE*/ ){ publish("界面上的用户名被改了",frmTabPage1.editUsername.text) } }
在其他窗体中就可以根据需要订阅此消息,例如:
subscribe("界面上的用户名被改了",function(值){ frmTabPage2.editUsername.text = 值 } )
示例代码