Database 版 (精华区)
发信人: lizhenguo (夸父·追日), 信区: Database
标 题: 23
发信站: 哈工大紫丁香 (2001年09月26日18:45:35 星期三), 站内信件
bbs.hit.edu.cn
PowerBuilder专栏
[回到开始][上一层][下一篇]
----------------------------------------------------------------------------
----
发信人: carsam (独自偷...), 信区: Database
标 题: PowerBuilder应用开发系列讲座 (23)
发信站: 逸仙时空 Yat-sen Channel (Wed Jan 5 12:31:59 2000), 站内信件
PowerBuilder应用开发系列讲座 (23)
----------------------------------------------------------------------------
----
函数与事件
函数与事件
在PowerBuilder5.0的PowerScript语言中,对于函数和事件的处理有了新的拓展。我们曾
在关于PowerBuilder的面向对象特性中介绍过,PowerBuilder的对象由3部分内容组成:属
性、函数和事件。而在5.0中,对于这部分理论进行了调整:将函数和事件进行了同化,统
称为方法(Method )。在Script中调用函数和调用事件的方法进一步接近,事件也可带有
参数,并具有返回值。
函数和事件即统称方法,调用的语法为:
{ objectname.} { type } { calltype } { when } functionname ( { argumentlist
} )这些参数的说明如下:
type :所调用方法的类型,可以是EVENT或FUNCTION,其中FUNCTION为缺省。
calltype :所调用的类型,可以是动态(关键词为DYNAMIC)或静态(关键词为STATIC),其中
STATIC为缺省。
when :调用的时间,POST或TRIGGER,其中TRIGGER为缺省。
当然,并不是所有的选项都是有意义的。比如我们不会去调用一个动态的PowerScript对
象函数。只有在用户自定义函数中,我们才可能动态调用一个函数。
允许对函数的调用采用Post方式是5.0的新特点。当函数以这一方式被调用时,系统将这
一函数放在了这个对象的消息队列的末尾,当前面的所有消息都执行了以后,这一函数才
被调用。采用这种方式调用函数,仍可以传递参数,却无法得到返回值。如:
// 合法语句
POST wf_calculate(x,y)
// 非法语句
Statue = Woo.cb_1.POST EVENT Clicked()
关键词STATIC是表示现在所调用的方法和所使用的参数在编译时是存在的。如:
STATIC EVENT ue_validates(ls_name, li_id)
如果关键词DYNAMIC出现在这一行调用的函数中,PowerBuilder在编译这一行代码时将不
检查这个方法和所用参数的有效性,只是到了运行时,系统才会到PBD的库中去搜索这个方
法。
当在运行中需要根据当前不同情况的上下文调用不同的对象函数时,我们会用到这一关键
词。例如:
PowerObject lpo
lpo = dw_1
lpo.dynamic show()
在运行前,也许我们还无法了解要对哪个对象进行show()的操作,只能等到运行时才能确
定操作对象。如果在上述的语句中我们去掉关键词dynamic,系统编译将出现错误,因为P
owerObject对象类并没有show这个对象函数。一般来说,Dynamic关键词只有在调用多态
方法时才可能用到,这实际上也是进一步拓展了PowerBuilder的面向对象的特性。
不过我们在调用方法时使用STATIC这一关键词,一般也只是为了系统在编译时对所引用的
方法进行一下语法检查,以确保引用的正确性。如果我们在运行时改变了方法的对象名称
,系统将调 用改变后的对象的方法。
我们来做这样一个实验:
在窗口中我们声明一个实例变量:
CommandButton icb
在窗口中有两个按钮,在第一个按钮cb_1的constructor事件中键入:
icb = this
在clicked事件中键入:
icb.resize(200,100)
窗口的第二个按钮cb_2的clicked事件中编码如下:
icb = this
当这个窗口运行时,在cb_2的构造事件中变量icb引用定为cb_1。如果这时我们首先点击
第一个按钮,这个按钮的clicked事件被触发,调用icb.resize()函数,该按钮的尺寸将随
之改变。我 们点击一下cb_2后,再按动第一个按钮,这时会发现,cb_2的尺寸也改变了。
因为在我们按下第二个按钮后icb的引用赋值已经改变为cb_2。
在PowerBuilder5.0所包括的Anchor Bay Nut Company的sample application这一实例中
就使用了一个动 态调用函数的实例。m_datareview_framemenu是一个祖先菜单类,它的
后继菜单类有m_datareview_custsheet、m_datareview_ordsheet等,分别为w_datarevi
ew_custsheet、w_datareview_ordsheet等窗口所拥有,这些窗口是MDI下的不同表单,对
这些表现不同信息的表单进行输出(export)操作是各不相同的,因此各自的窗口分别有不
同的多态函数wf_export处理各自的输出操作。可是在对m_datareview_framemenu菜单的
m_export项编码时,我们无法知道当前激活的表单是哪一个,所以我们只能动态地调用这
个窗口函数:
guo_global_vars.ish_currentsheet.DYNAMIC wf_export()
其中guo_global_vars.ish_currentsheet的值是当前活动表单的引用,而这个值在声明时
却只能声明作为这些表单共同的祖先类w_datareview_frame的引用,因为这个祖先窗口是
没有wf_export这个窗口函数的,所以我们必须使用DYNAMIC这个关键词。这个例子在abn
c_rev.pbl库中可以找到,有兴趣 的人员可以好好理解一下。如果PowerBuilder没有这
个调用动态函数的功能,那么我们只能采用其它方法替代,如:
1.在祖先窗口w_datareview_frame中定义一个空白的wf_export()函数;
2.使用SWITCH CASE语句来决定调用哪个窗口函数。
显然第二种方法不是一个好的面向对象的程序设计。
函数和事件的区别
到目前为止,函数和事件仍存在着一些差异,它们表现在:
1.事件只与对象有关,而函数既包括对象函数,也有一部分是全局的。
2.在PowerBuilder中,事件和函数的搜索顺序不同。
3.在运行时,用户调用了一个未定义的事件,系统将不会产生任何错误;但是调用了未
定义函数,系统将触发错误。
4.函数可以重载,而事件不能。
5.对自定义的函数,可以指定其访问范围,如public、private、protect等;但是事
件不能,其访问范围全部为public。
6.可以很容易地在继承对象中扩展或覆盖祖先对象事件中的代码;但是在后继对象中
对函数进行覆盖就很困难了,必须重新定义这个函数。
限于篇幅,我们只能对第二条作进一步说明:
由于函数是支持重载的,当代码调用一个函数时,系统将本着兼容匹配的原则,搜索要调用
的函数,因此当调用重载函数时,一定要指明参数的类型。例如数据窗口表达式的返回值
是ANY型的,应当这样明确指出:
wf_process_search(string(dw_1.object.name[3]))
而不要笼统写成:
wf_process_search(dw_1.object.name[3])
另一方面,PowerBuilder的事件是不支持重载的,但是后继对象的事件却可以扩展祖先对
象的同一事件。系统搜索到要调用的对象事件后,还要继续上溯寻找它的祖先,直到祖先
事件的代码为空或被覆盖了为止,并要首先执行其祖先代码。
究竟是在函数中还是在事件里编写应用中的复杂的商业逻辑,这只是一个编程风格问题,
一般对系统的运行效率不产生任何影响。
此外要说明的是,以上所谈到的在5.0中新增加的语法功能是4.0以下版本的超集,也就是
说,这种方法兼容了以往调用函数和触发事件的语法,以保证PowerBuilder新版本的兼容
性。PowerBuilder5.0中仍然支持以往的TriggerEvent()函数、PostEvent()函数和关键
词CALL语句,只是以前的触发事件的方法无法在其中加入参数。
--
我想自由自在地飞......
飞过大海...
飞过沙漠...
飞翔在星的夜空......
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 202.116.90.29]
----------------------------------------------------------------------------
----
[回到开始][上一层][下一篇]
欢迎访问Cterm主页
--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.433毫秒