中国计算机报1998年第51期  

PB5.0的使用经验

陶雷

  PB作为C/S环境下数据库开发工具,其面向对象、可视化以及方便移植的特点引人注目,成为国内较为流行的微机应用程序开发工具之一。笔者在使用PB中,积累了一些体会和经验。

  1、控件的层次性引用

  引用本窗口中控件的属性,一般只需简单引用即可,如:text—1.caption=′w—1′,因为像text—1这样的控件名实际上是窗口级变量名。但我们常常需要在一个窗口中引用另一个窗口中控件的属性,这时必须从窗口一级开始显式引用,如:w—2.text—1.caption=′w—2′。这里有两个保留字可用,如w—2是w—1的父窗口,则可用parent指代;又如从与w—2相连的菜单脚本中引用,则可用parentwindow。要强调的是,为便于维护,根据“对谁操作代码寄生在谁的事件上”这一原则,最好不要跨窗口引用,而采取为要引用的窗口定义用户事件或窗口函数的办法,并在此窗口中激活或调用。

  2、控件脚本的继承关系及执行顺序

  对单个控件的继承,是继承了该控件的属性及脚本;对窗口这样的复合体继承,则是对应继承了其上一切控件的属性及脚本。对于继承到的控件,如不想要只能使其不可见或使不能,而不能进行删除;对于继承到的属性可以在定义或脚本中进行更改,如:this.caption=′w—2′;对于继承到的脚本,缺省的是采用扩展的方式,先执行继承到的脚本代码,然后执行子类扩展代码,即Compile菜单中的“Extend Ancestor Script”选项,如图:
pb107-1.jpg (12110 字节)
  可以选择同一菜单下“Override Ancestor Script”选项以覆盖祖先代码,仅执行后继代码。


  3、调用对象函数和事件


  在PB 5.0中,事件和函数的区别变得模糊,主要体现在:①事件可接收参数和返回值,当产生一个用户事件时,不必将它映射到一个pbm(pb message),这样就可以任意确定返回值和参数,而不仅是windows编程范畴长整型的wparam和lparam;②函数也可以异步执行。它们之间的主要区别是,对象函数有作用范围(public、private、protected)且可以重载,而事件都是公有的,且不能重载。总的来说,调用的语法一致,即:

  {objectname.} {type} {caltype} {when} functionname ( {argumentlist} )

  通过type区分是Function(缺省)还是Event;caltype取值为Static或Dynamic根据调用的代码是静态的编译代码还是运行时才能决定的动态代码来定;when取值为Trigger指定代码立即执行,否则为Post将脚本压入该对象事件队列队尾,适当时候执行。这三种关键字顺序不限,下举一例:

  声明一个类型为w—ancestorsheet的祖先窗口的实例变量iw—a:w—ancestorsheet iw—a

  某后裔窗口上定义了一个函数wf—export( ),但要在与祖先窗口相连的菜单项脚本中调用,则需用如下形式:iw—a.Dynamic wf—export( ) 引用祖先的函数和事件可采用相对较简单的语法:引用直接祖先的事件,可用保留字super,格式为call super::event,引用函数直接用格式function (argumentlist);引用任一层祖先窗口或用户对象上控件或用户对象的事件,格式为call ancestor′controlname/objectname::event,对于函数引用则采取如下格式ancestor::function(argumentlist)。


  4、过滤表达式构成及引号使用规则


  构成过滤表达式时,如用数据表中字段与变量相比较作为过滤规则,需要注意引号的使用。笔者在编程中就碰到了这样的问题,反复调试后始得其要领。定义数据表时,设表中一字段名为emp-id,类型为int型,则过滤表达式为:″emp-id=″+string(li-filter),其中局部变量li—filter为integer型(DBMS为Sybase SQL Anywhere);但如定义字段类型为char型,相应地局部变量ls—filter为string型,则过滤表达式必须为如下形式:″emp—id=′″+ls—filter+″′″,否则类型不匹配,不能得到正确结果。

  同样值得注意的是,PB 5.0虽然使我们能运用数据窗口数据表达式和属性表达式直接存取和设置数据窗口中的数据和属性,但属性表达式的值的数据类型为string型,即虽然对有些属性值的设置我们可直接用数字或布尔变量,但实际存储的都是数字字符或布尔量字符。所以在用作某些函数的参数时要注意转换为必需的数据类型,特别是在Describe()、Modify()函数的调用中。如下两行语句的区别:

  modstring=″emp—id.color=″+string(RGB(red—amount,255,255))

  modstring=″emp—id.color=′″+string(RGB(red—amount,255,255))+& ″~t IF(emp—status=~~′A~~′,″+string(RGB(255,0,0))+″,″+string(RGB(red—amount,255,255))注意IF函数首尾两个单引号,因为IF函数的结果是动态的,随emp—status的值而定,而第一行语句中string()、RGB()两个函数计算所得的结果是静态的可预知的。

  PB中可用双引号内嵌单引号以级联标注,也可用″~″,如上例中,前导的~说明后面紧跟的~′或~″是标注号。对于字符串表达式内本身有~的情况,则需用~~作前导,如:

  modstring=″emp—id.color=~″16777215~t IF(emp—status=~~ ~″A~~ ~″,255,16777215)~″ ″


  5、数据窗口列对象的可改性


  定义数据窗口时,特别是该数据窗口的列来源于两个或两个以上的数据表时,注意在数据窗口定义画板中检查列的tab值。因缺省时列的tab值全为0,即使在Specify Update Properties对话框中作了正确的设置,也不能对列进行修改。

 back.gif (1185 字节)