PowerScript 语句一
详细阐述 PowerScript 语句的语法格式及其在脚本中的使用方法。
一、赋值语句
赋值语句能够把一个表达式的结果或者变量和常量的值赋给一个变量或某对象的属性或成员变量。赋值语句的语法格式为:
variablename = expression
其中 variablename 代表变量名,expression 代表表达式,它将表达式的值赋给等号左边的变量。例如:
ls_str = " E&E " li_num = 1
PowerBuilder 还提供了一些类似 C 语言中单目操作符的简化算术赋值符号,如表 7.1 所示。
简化算术赋值符号只能用在单纯赋值语句中,不能当做操作符使用,例如,下面的例子是不正确的:
int i,j i = 12 j = i++ // 无效
下面的例子把++当做赋值语句使用,因而是正确的:
int i,j i = 12 i ++
二、CALL
CALL 语句在继承对象中调用祖先对象的脚本。用户在继承对象的事件中不但可以调用祖先的用户对象、菜单对象或窗口对象的脚本,而且可以调用祖先窗口或用户对象中的控件。CALL 语句的语法格式为:
CALL ancestorobject[`controlname]::event[(argument)]
其中,ancestorobject 指明祖先对象的标识名,controlname 是控件的名字,event 和 argument 代表被调用的事件及其参数列表。如果事件定义的参数在调用的时候没有 argument,则空值作为默认值传递。
新版本的语法允许用户触发(trigger)或者告知调用(post)祖先的事件,但是不能调用祖先控件中的脚本。
下面语句调用祖先窗口中事件的脚本:
CALL w_emp::Open
下面一条语句调用祖先窗口中控件的事件脚本:
CALL w_emp`cb_close::Clicked
在某些情形下,用户可以使用代名词 Super 调用父类对象的事件或函数。
三、CONTINUE
在 DO...LOOP 或 FOR...NEXT 语句循环体中,遇到 CONTINUE 语句时,将不执行在 CONTINUE 之后和循环结束之前的语句,开始新一轮循环。例如在下面的例子中,如果 li_count 大于 20 则 li_b 不再增加:
INTEGER li_a=0, li_b=0 FOR li_count = 1 TO 100 li_a++ IF li_count>15 THEN CONTINUE li_b++ NEXT
结果,在上面的循环结束后,li_a 等于 100,li_b 等于 15。
四、CREATE
CREATE 语句生成对象实例。在生成以后,可以用点操作符引用对象的成员。CREATE 语句返回一个可在变量中保存的对象实例句柄。CREATE 语句有两种语法格式:
objectvariable = CREATE objecttype objectvariable = CREATE USING objecttypestring
objectvariable 持有该对象实例;objecttype 代表对象类型;objecttypestring 是保存需要创建的对象类型的字符串。
使用 CREATE 语句可以创建包括标准类用户对象在内的类用户对象,例如 mailSession 或者 Transaction对象。不过,系统已经为标准用户对象 Message , Error , Transaction , DynamicDescriptionArea ,
DynamicStagingArea 提供了一个实例,如果需要多个实例,可以使用 CREATE 语句创立更多的实例。
标准数据类型和结构体不用 CREATE 语句创立。当对象的 AutoInstantiate 属性被设置为 TRUE 时,不需要使用 CREATE 语句。可视对象实例不使用 CREATE 语句创立,而使用 OPEN()函数。
使用 CREATE 语句的第二种语法格式是可以在应用中动态地选择对象类型,并创建它的实例。通常在使用继承对象实例初始化祖先对象时,使用此种 CREATE 语句格式,它可以在运行时在继承对象的多个实例中选择其一用来初始化祖先对象。例如 uo_desc1 和 uo_desc2 都是 uo_ance 的继承对象,在应用中使用 IF...THEN语句实现选择不同的继承对象初始化 uo_ance:
uo_a uo_ance string ls_name IF ... THEN ls_name="uo_desc1" ELSE ls_name="uo_desc2" END IF uo_ance = CREATE USING ls_name
用户在使用 CREATE 语句生成实例后,应该使用 DESTROY 语句释放该对象实例,以保证该实例所占用的内存资源得以重新利用。
下面是一个创建事务对象的例子:
transaction DBTran DBTran = CREATE transaction DBTran.DBMS = "OBDC"
在创建对象后,可以使用点操作符调用该对象的公有成员函数:
myObject uo_Obj string ls_Obname envirment luo_env GetEnvirment(luo_env) IF luo_env.Win31 = TRUE THEN ls_Obname = "uo_Obj_descendant16" ELSE ls_Obname = "uo_Obj_descendant32" END IF uo_Obj = CREATE USING ls_Obname uo_Obj.SomePerformance()
五、DESTROY
DESTROY 语句释放由 CREATE 创建的实例,释放之后该对象实例不能再被引用。DESTROY 语句的语法格式为:
DESTROY objectvariable
在应用结束时,系统自动释放全部对象实例。不过在对象实例未释放之前,它仍然占用系统资源,因此,如果重复地使用 CREATE 而不使用 DESTROY 语句,将会大量占用系统资源而导致资源耗尽。
六、EXIT
DO...LOOP 语句或 FOR...NEXT 语句中,使用 EXIT 可以跳出循环。在下例中,当 Flag[count]为空值时,跳出循环:
DO WHILE count<=50 IF IsNull(Flag[count]) THEN EXIT count++ LOOP
七、GOTO(不建议使用)
GOTO 语句控制程序流程,其语法格式如下:
GOTO label
其中 label 代表语句标号,其命名应符合标号的命名规则。 例如,使用 GOTO 语句实现无条件转移至标号 NetScape:
GOTO NetScape …… NetScape: ……
八、HALT
HALT 语句用于终止应用程序运行。该语句的语法为:
HALT [CLOSE]
遇到不包含 CLOSE 选项的 HALT 语句时,应用程序立刻终止。当包含 CLOSE 时,应用先执行 Close 事件所对应的处理程序,然后再终止应用程序。
在下面的例子中,当条件满足时,在执行完 Close 事件后,退出应用程序:
IF sle_pass<>PassWord THEN HALT CLOSE
九、RETURN
RETURN 语句用于从脚本中返回调用程序。其语法格式为:
RETURN [expression]
其中 expression 代表该脚本的返回值。例如:
IF amount>=100 THEN RETURN -1 ELSE RETURN amount END IF
十、THROW
该语句主要用于触发用户自定义的异常处理。其语法为:
THROW exlvalue
其参数如表 7.2 所示。
跟在保留字 THROW 之后的变量,必须是一个有效的对象实例,或者是能生成由 Throwable 类型衍生过来的有效对象实例的语句。例如,可以使用下面的表达式:
THROW create ExceptionType
在这里,异常是一个 Throwable 类型的对象。
如果想实现一个没有实例化的对象的异常处理,用户不会得到所需的异常信息,因为所得到的惟一异常信息是 NullObjectError 的错误。
在一个方法的脚本中,用户可以抛出(Throw)一个在方法原型中声明的或是在 TRY-CATCH 程序段中处理的异常处理。如果用户试图对一个没有在 Throws 方法原型中说明,并且在 TRY-CATCH 程序段中没有提及的用户自定义的异常事件进行处理,则 PowerScript 的编译器会给出一个错误信息。
当一个 RuntimeError 错误——或由 RuntimeError 产生的错误——被抛出,一个包含行号信息的实例变量就会被放到 THROW 语句出现的地方。如果该错误被纠正并再一次进行,该信息必须被特别地设为 NULL,否则不会更新。
十一、THROWS
该语句的功能是声明一个用于方法触发的异常类型。这是方法原型的一部分。其语法为:
methodname ( {arguments} ) THROWS ExceptionType
{ ,ExceptionType, ... }
参数如表 7.3 所示。
该语句只能够在内部使用。
用户不能在 PowerBuilder 事件的脚本中格式化或另外添加 THROWS 从句。但是可以在任何函数或不是用 pbm event ID 定义的用户事件中添加一个 THROWS 从句。
在脚本编辑的视图中的 Prototype 区域,用户可以从系统树上把一个异常对象拖动或下拉到 Throws 框中,来实现在一个方法的 THROWS 从句中加入 Throwable 类型的对象;或者直接在 Throws 框中输入用户对象的
名称。如果需要加入多个对象的名称,可以使用逗号隔开对象名。当采用拖动的方法加入对象时,PowerBuilder会自动地以逗号来隔开它们。
THROWS 从句的显示。一个方法的 THROWS 从句指能够在本方法脚本编译的 Throws 框中显示出来。
用户可以使用脚本视图中最左边的图钉按钮来显示或隐藏包含 Throws 框的 Prototype 区域。在浏览器、函数列表视图或系统树中,THROWS 从句并不是作为方法的原型来显示的。
用户加入到 THROWS 从句中的异常对象通常都是用于进行某种检验的。PowerBuilder 的编译器会自动检验一个方法的脚本语言中 throw 的用户自定义对象是否和该方法的 THROWS 从句中的定义相符合。
PowerBuilder 会自动地将 RuntimeError 对象或其他对象加到方法的 THROWS 从句中,因此用户不必再手动进行添加。
如果在给定方法的 THROWS 从句中选择了一个高级的异常对象或错误类型,用户就可以在该方法的脚本中添加任何低级的异常对象或错误,但是要除去那种冒险隐藏起从低级异常对象或错误获得的有用信息的情况。
十二、TRY…CATCH…FINALLY
该语句的功能是生成 exception 的独立代码,在遇到某个类型的 exception 时确定该干什么,并且允许用户在遇到或没遇到 exception 时关闭一个文件或网络连接(并将对象返回到原始状态)。
其语法如下:
TRY statementClauseT
{CATCH(ThrowableTypeexIdentifier)statementClauseC}
{...}{FINALLY statementClauseF }END TRY
参数如表 7.4 所示。
不仅在 TRY,CATCH 或 FINALLY 从句中具有带状说明,而且在 Java 中也有。语法的这种带只用于说明包含它们的从句在 TRY 程序段中是可以省略的。
TRY 程序段主要用于可能会抛出一个 exception 的独立代码。关键字 TRY 和 CATCH(或在没有 CATCH从句的情况下,关键字 TRY 和 FINALLY)之间的语句,会无条件地执行,一直到整个程序段的语句执行结束或本程序段中的其他语句产生一个用于 throw 的 exception。
使用一个或多个 CATCH 从句处理 TRY 程序段中抛出的 exceptions。在 throw exception 的事件中,只有在抛出的 exception 和跟在保留字 CATCH 后的标识符是同一种类型或是其派生类型时,TRY 从句才能够停止执行,然后执行 CATCH 从句。
如果抛出的 exception 和这个标识符不是同一种类型或不是其派生类型,exception 就不会被这个 CATCH从句处理。Exception 会继续展开外部嵌套的 TRY-CATCH 程序段的调用堆栈(但是在展开该堆栈之前,TRY程序段最初的 FINALLY 从句会被执行)。如果没有外部嵌套的程序段,就会激发应用对象标准的 SystemError事件。
如果没有 exception 被抛出,程序会继续执行存在的 FINALLY 从句的入口;如果不存在,程序将执行END TRY 语句之后的程序行。