转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(23)         

PowerBuilder应用开发系列讲座(23)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:972 更新时间:2009/4/24 21:43:49
函数与事件

  在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,系统编 鱿执砦?因为PowerObject对象类并没有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_datareview_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这个关键词。这个例子在abnc_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语句,只是以前的触发事件的方法无法在其中加入参数。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台