第1 章 PowerScript 语言
一、续行
PowerScript 的续行符为符号&,它放在一行的末尾指示下一行是当前行的继续;
例如:我们可以把语句
MessageBox("SQL 语句出错","出错编号="+String(SQLCA.SQLCode))
书写在两行上
MessageBox("SQL 语句出错","出错编号="+&
String(SQLCA.SQLCode))
在嵌入式SQL 语句中,无须使用续行符因为这类语句均以分号; 作为语句的结束,我们可以把一条SQL 语句写成多行。
二、多语句
想在一行中写上多条语句,那么在语句之间用分号进行分隔;
例如:
a=b+c;g=h+j;cnt=a+g+cnt
三、注释
行注释以双斜线//开始其后书写注释内容到行尾结束;
例如:
//这是一条行注释
Open(w_main) //打开主窗口
块注释以符号/*开始到符号*/结束,不管其中夹了多少东西它们都是注释;
例如:
/*
函数返回值为
0——正常
-1——出错
*/
四、标识符
标识符是程序中用来代表变量、标号、函数、窗口、菜单、控件、对象等名称的符号,PowerBuilder中标识符遵从下述规则:
1、必须以字母或下划线开头;
2、最长40 个字符且中间不能插入空格;
3、保留字不能用做标识符,因为它们已有特殊的含义;
4、标识符不区分大小写,PART、Part、part是一个标识符;
PowerBuilder文档声称标识符的长度限制为40 个字符,实际上标识符的长度最大可达99 个字符;
五、特殊Ascii码字符
字符串中可以包括特殊的ASCII 码字符,它们不能使用常规的输入方法直接输入,需要使用其他字符来代替常用的特殊字符;
可如下表所示:
特殊字符 | 表示方法 |
新行Newline | ~n |
制表符Tab | ~t |
垂直制表Vertical Tab | ~v |
回车Carrige return | ~r |
换行Formfeed | ~f |
退格Backspace | ~b |
双引号" | ~" |
单引号' | ~' |
波浪号~ | ~~ |
十进制形式的ASCII 码 | ~000到~255 |
十六进制形式的ASCII 码 | ~h00到~hFF |
八进制形式的ASCII 码 | ~000到~255 |
六、空值NULL
空值是PowerBuilder与数据库交换数据时使用的一种特殊值,代表数据未定义、不确定,它与空字符串、数值零以及日期00-00-00 的意义完全不同。
使用SetNULL()设置空值,使用isnull判断是否为空值,PowerBuilder 的所有数据类型都支持空值;
七、代词
PowerBuilder提供了四个代词,分别为:This、Parent、ParentWindow 和Super 其中前三个代词应用广泛,下面简单介绍一下这些代词的意义和用法:
This | 代表窗口用户对象菜单应用对象或控件本身,即代表正在为之编写事件处理程序的对象; |
Parent | 指当前控件所在的窗口; |
ParentWindow | 运行时菜单所在的窗口,该代词只能在菜单的事件处理程序中使用; |
Super | 在编写控件或对象的子对象时,子对象中可以调用父对象的事件处理程序。程序中既可直接利用父对象的名称调用它们,也可以使用Super 代词来引用; |
八、对象属性、函数和事件的引用方法
在PowerScript 中访问对象的属性、函数、事件的方法很简单,就是使用圆点作为标记符,访问对象属性的格式为:
对象名.对象属性
程序中访问对象的函数与事件的格式为
{ objectname.} { type } { calltype } { when } functionname ( { argumentlist } )
其中大括号所括成分根据情况可以省略各成分的意义为:
objectname 对象名
type 取值为 FUNCTION 或EVENT 用于指明访问函数还是事件,缺省值为FUNCTION;
calltype 用于指明PowerBuilder 查找函数的时机,有效取值为: <1> STATIC 缺省值 编译时查找函数若不存在产生编译错误 <2> DYNAMIC 程序运行时查找函数若不存在产生运行错误
when 用于指明函数或事件是立即执行还是当前程序段执行完毕后执行,取值为 <1> TRIGGER 缺省值 立即执行 <2> POST 当前程序段执行完毕后执行
functionname 指明调用的函数或事件名称
argumentlist 给出函数或事件的参数
以上标红区域建议使用缺省值;
九、标准数据类型
PowerBuilder 支持的标准数据类型共有14 种,如表所示:
数据类型 | 意义 | 示例 |
Blob | 二进制大对象,用于存储大量数据例如图像大文本等 | |
Boolean | 布尔型变量只有两个可能取值TRUE 或FALSE | FALSE |
Character Char | 单个ASCII 字符 | A |
Date | 日期,包括年1000-3000 月01-12 日01-31 | 2020-04-20 |
DateTime | 日期及时间,仅用于访问数据库的DateTime 型数据 | 2020-04-20 15:52:32 |
Time | 24 小时制时间包括小时00~23 分00~59 秒 00~59 以及秒的小数位最多六位范围,从00:00:00到23:59:59:999999 | 13:32:18:123456 |
Decimal Dec | 带符号十进制数,最大18 位精度 | 8754625.8635 |
Double | 带符号浮点数15 位有效数字范围从2.2E-308 到1.7E+308 | 6.324E+5 |
Integer Int | 16 位带符号整数范围从-32768 到+32767 | 7688 |
UnsignedInteger UnsignedInt Uint | 16 位无符号整数范围从0 到65535 | 5234 |
Long | 32位带符号整数范围从-2,147,483,648 到+2,147,483,647 | 4688243 |
UnsignedLong Ulong | 32 位无符号整数范围从0 到4,294,976,295 | 54234850 |
Real | 带符号浮点数精度6 位范围从1.17E-38 到3.4E+38 | 3.5E+5 |
String | 字符串类型,用于存储任意的ASCII 字符 16 位环境中字符串的长度在0 到60,000 之间 32 位环境中长度在0到2,147,483,647 之间 程序中直接写字符串时用单引号' 或双引号" 将字符串括起来 | "计算机" |
标红色数据类型非常用,一般字符串选择String、Dec,数字选择Uint、Ulong、long、int ,日期时间类选择datetime、date。Any 类型一般不使用,不同类型之间的转换可以直接使用数据类型名(值)去做转换。
十、对象数据类型
在PowerBuilder中窗口、菜单、各种控件都是系统对象,每一种系统对象实际上都是定义在PowerBuilder内部的一种数据类型。利用系统对象类型可以说明对象数据类型变量,例如:
window mywin //说明窗口变量
menu mymenu //说明菜单对象变量
如果窗口中有多个按钮,您的应用程序需要跟踪用户最近单击的按钮时,可以按下述方式编写程序
// 在窗口中说明实例变量LastClicked
commandbutton LastClicked
// 在窗口上每个按钮的Clicked 事件处理程序中写上如下代码
// 登记用户最近单击的按钮
LastClicked = This
十一、枚举类型
枚举类型是PowerBuilder定义的特殊常量,常用于系统定义函数的参数,也能够用于指定对象或控件的属性。在PowerBuilder中开发人员不能定义自己的枚举类型,只能按系统要求使用它。
枚举类型实际上是一组值,每个值都以英文单词开始,以感叹号! 结束。
十二、变量声明
PowerBuilder 中所有变量在使用之前(除系统预定义的五个全局变量)都要首先予以说明,简单的变量说明采用下述语法:
数据类型 变量名{=初值}{ 变量名{=初值} … }
需要一次说明多个变量时,变量名之间用逗号, 分隔,变量名用前面讲到的标识符表示,例如:
Integer i // 说明一个整型变量i
Real a,b,c //说明三个实型变量a,b,c
String my_home //说明一个字符串变量my_home
在说明变量的同时,我们可以同时指定变量的初值,例如:
Integer ii_total=100 //说明整型变量ii_total 并赋予初值100
String ls_city="北京",ls_County //说明变量ls_city 并赋初值,说明变量ls_County其初值使用字符串类型变量的缺省值空串""
<1>Blob 型变量说明的语法为:
Blob {{大小}} 变量名 //其中第一层大括号表示可以省略其中的成分
说明Blob型变量时,可用大括号括起一个整数,该整数指明Blob变量以字节为单位的长度,缺省该项时默认长度为0,且系统会根据实际数据自动调整其长度,例如:
blob{100} ib_Emp_Picture //说明一个长度为100 的blob 型实例变量
blob ib_Picture //说明一个缺省长度为0 的blob 型变量
//需要注意的是blob 型变量不能设置初值
<2>Dec 型变量说明的语法为:
Dec| Decimal {{精度}} 变量名{=初值}
其中第一层大括号表示可以省略,其中的成分精度是个整数,指定小数点后的数字位数,如果未指定精度则以赋值时给定精度为准,例如:
decimal{2} sc_Amount //小数点后两位数字
dec{4} lc_Rate1, lc_Rate2 //说明两个小数点后四位数字的变量
十三、数组声明
数组代表一系列具有相同类型的变量,它们共用一个变量名,通过下标访问数组中的每个元素。要声明一个数组变量,只需在标识符后跟上方括号,方括号内填上数组元素个数即可。例如:
Integer person[30] //说明了整型数组person,它有30 个元素,下标从1 到30;
当然我们也可以指定数组下标的变化范围,例如:
Integer Num[3 To 10] //下标从3 变化到10 共8 个元素
如果在说明数组时方括号内未填数字,则说明一个动态数组,运行时系统根据需要调整数组元素个数。
程序中通过下标访问数组元素,例如:
person[10]=5 //将person 数组的第10 个元素赋值5
除了一维数组外也可以使用多维数组,说明时维数之间用逗号分隔,例如:
real lr_Array[10,10] //说明一个二维数组共10X10 个元素
char ls_3dArray[2,3,4] //说明一个三维数组共2X3X4 个元素
在说明数组的同时我们也可以给数组赋初值例如
real lr_Array5[5]={1.2,2.1,5.6,4.8,6.9}
下面的赋值方法也是有效的
real lr_Array5[5]
lr_Array5[5]={1.2,2.1,5.6,4.8,6.9}
动态数组可按相同的方法赋初值。
十四、常量
在编写代码时对应用程序不应该修改的数据说明成常量是个好办法,说明常量时需要使用CONSTANT关键字,其语法为:
CONSTANT 数据类型 常量名 = 常量值
其中
CONSTANT 是关键字说明常量时照样书写
数据类型为除Blob 类型之外的任意标准数据类型,并且对Decimal 类型常量来说可以使用大括号来指定精度
常量名是个标识符应该尽量采用意义明确的标识符表示
常量值是应用程序赋给该常量标识符的值,根据数据类型的不同使用不同的表达方式
下面是常量说明的几个示例
CONSTANT string LS_HOMECITY = "北京"
CONSTANT real LR_PI = 3.14159265
CONSTANT date LD_BIRTHDAY = 1998-05-14
CONSTANT time LT_RISETIME = 07:10:29
十五、外部函数说明
带返回值的外部函数的说明语法为实际说明时应该写为一行
{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1,...,
{ REF } datatypen argn } ) LIBRARY "libname" ALIAS FOR "extname"
不带返回值的外部函数的说明语法为实际说明时应该写为一行
{ access } SUBROUTINE name ( { { REF } datatype1 arg1, ...,
{ REF } datatypen argn} ) LIBRARY "libname" ALIAS FOR "extname"
其中:
access 是可选项,只有以局部方式说明外部函数时才需要该选项。access 指定函数的访问范围有效值为Public、Protected或Private,缺省值为Public
Public 说明的外部函数在应用程序的任何地方都可以调用
Private 说明的外部函数只能在说明该外部函数的对象的事件处理程序或用户自定义函数中使用,不能在该对象的后继对象中调用以这种方式说明的外部函数
Protected 说明的外部函数只能在说明该外部函数的对象以及该对象的后继对象的事件处理程序或用户自定义函数中使用
FUNCTION 或SUBROUTINE 说明的外部函数是函数还是过程函数(有返回值过程、无返回值)
returndatatype 指明外部函数的返回值类型
name 是外部函数的名称应该使用动态链接库中的外部函数名
参数前的REF 关键字指明该参数采用引用方式传递,此时外部函数可以修改该参数的值。省略REF关键字时参数采用传值方式传递外部函数,不能修改参数的值。
datatype1 arg1 到datatypen argn 指明参数的类型和参数名称、参数个数及类型,由具体的外部函数决定
libname 指明外部函数所在的动态链接库的名称,LIBRARY 是个关键字需要照原样书写。Microsoft Windows 下的动态链接库的扩展名一般为DLL 或EXE。UNIX 下的共享库的扩展名通常是.so
ALIAS FOR "extname" 是可选子句它为当前说明的外部函数起个别名,代码中可以直接使用该别名引用。
应用程序在运行时按下述次序查找动态链接库:
当前目录
Windows 目录
Windows System 目录
DOS 路径中指定的目录
示例:
下面的说明让应用程序能够调用WIN32 下动态链接库 WINMM.DLL中的播放声音的外部函数:
FUNCTION boolean sndPlaySoundA (string SoundName, uint Flags) LIBRARY "WINMM.DLL"
FUNCTION uint waveOutGetNumDevs () LIBRARY "WINMM.DLL"
在16 位平台上相同函数的说明为
FUNCTION boolean sndPlaySound (string SoundName, uint Flags) LIBRARY "mmsystem.dll"
FUNCTION uint waveOutGetNumDevs () LIBRARY "mmsystem.dll"