选择显示字体大小

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,系统编 鱿执砦?因为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语句,只是以前的触发事件的方法无法在其中加入参数。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons