PB中PowerScript使用及注意

来源:互联网 发布:国泰安数据收费吗 编辑:程序博客网 时间:2024/05/10 22:57

[PB]-PowerScript

---------
帮助
F1:在Script画板中还可以使用F1键随时获得帮助。

Shift+F1:将光标放到不熟悉的Script语言元素上,然后使用Shift+F1键即可获得相关帮助。例如,当使用open函数时,一时记不起它的用法,可以将光标放在该函数位置,使用组合键即可打开关于open函数的帮助。在帮助窗口中可以将相关信息拷贝,然后复制到Script脚本中。

---------
注释
“//”:以“//”开头,后面是注释内容,在一行内书写下。这种注释方式不能在语句中间插入注释,只能是在一行的开头或一行的后面书写注释。Script画板中为这种注释方式提供了快捷方式,使用比较方便。

“/*……*/”:在“/*”和“*/”符号之间的为注释内容,可以多行书写注释。这种注释方式可以在语句的中间插入注释内容,一般用于书写内容比较多的注释。

---------
标识符的命名
变量作用域+变量类型+“_”+具有一定字面含义的名称
eg:string ls_rtncode //l:本的变量(local),s:字符(string),rtncode:返回值

---------
特殊ASCII字符
换行(Formfeed) ~f
新行 ~n
横向制表符 ~t
垂直制表符 ~v
回车 ~r
退格(Backspace) ~b
单引号 ~'
双引号 ~"
波浪号 ~~

任意字符都可以用~加上数字(该字符的ASCII值)来表示(十进制0-255<~xxx>、十六进制0-HFF<~hxx>、八进制0-377<~oxxx>)

---------
NULL值
NULL代表不知道或没有定义,和空值完全不同(空值表示已经有确定的值,此值为‘’)

string ls_null
SetNull(ls_null) //ls_null赋值为NULL
IsNull(ls_null) //判断ls_null取值是否为NULL

当字符串的连接运算中有Null时,取值也为Null
eg:string ls_firstname,ls_nickname,ls_name
ls_firstname = 'cwd'
setnull(ls_nickname)
ls_name = ls_firstname + ls_nickname //由于ls_nickname为null,则ls_name为null

---------
续行:
powerscript的续行符为‘&’
注意:不能在标识符或保留字的中间续行,在SQL语句中也不要使用续行,因为SQL语句使用‘;’作为语句结束,从SQL语句开始到‘;’符号之间的所有字符都认为是SQL语句,如果使用了‘&’就会产生错误

断句:
在一行中写多条语句,在语句之间用分号进行分隔
a = b + c ; g = h + j;cnt = a + g + cnt

---------
空白:
空白包括空格、Tab符、换行符和注释。除非空白被包括在引号中,否则编译器忽略空白,不考虑它们所占的空间。特殊情况下,短线“-”两端的空格不能被忽略,这时,短线加空格被处理成减号。

---------
运算符和表达式
PB提供四种运算符:算术运算符、关系运算符、逻辑运算符和连接运算符

1、算术运算符
+,-,*,/,^,……
当参加运算符的操作数类型不同时,PB自动进行类型转换。转换的原则是高精度类型优先。从高到低分别是:double,real,decimal,unsignedlong(long),unsignedinteger(integer)。除了自动类型转换时高级别优先外,还遵循如下原则:a、操作符+,-,*的最低精度为long类型能够,在进行这三种操作时,数据类型的转换级别低于long型的数据,其类型自动转换成级别至少不低于long型的数据类型,表达式返回结果的精度为long型。b、操作符/和^的精度为double型,所有类型的运算数据都转换成double,然后在进行计算,返回结果的精度也是double类型。c、当数据自动转换为低级别类型的数据时,遵循四舍五入的原则。

2、关系运算符
=,>,<,<>,>=,<=

关系运算符是用来比较数据的,可以对数值型数据操作,也可以对字符型数据操作,甚至还能操作数组。关系运算符构成的表达式返回值是True、False或者Null。

对数值类型的数据操作时,是用来比较数据的大小。当用来对字符型数据操作时,是用来比较字符在字典中的顺序,排在字典后面的比前面的“大”。

在条件判断语句中一定要注意,当参与关系运算的某操作数为Null时,返回值为空。

当两个字符类型的变量进行比较时,如果只关心它们的内容,不关心它们的大小写以及左右的空格,可以借助于函数。
Lower():返回字符串中每个字母的小写,不影响原字符串。
Upper():返回字符串中每个字符的大写,不影响原字符串。
LTrim():返回左侧没有空格、其余字符和被转换字符相同的字符串,不影响原字符串。
RTrim():返回右侧没有空格、其余字符和被转换字符相同的字符串,不影响原字符串。
Trim():返回左右两侧都没有空格、其余字符和被转换字符相同的字符串,不影响原字符串。

3、逻辑运算符
NOT,AND,OR

逻辑运算符用于形成布尔表达式,返回结果不是True就是False,肯定不会像关系运算符似的还有Null值。逻辑运算符可以对常量、变量、取值为布尔型的对象属性进行运算。

4、连接运算符
+;用来连接两个字符串或者两个blob类型的变量

运算符优先级
运算符 意义
+,- 一元加和一元减
^ 指数运算
*,/ 乘和除
+,- 加、减和连接
=,>,<,>=,<=,<>关系运算符
NOT 逻辑非
AND 逻辑与
OR 逻辑或

-----------------
基本语句
选择:
*在使用关系表达式作为判断条件时,一定不要忘记除了True、False,还有一个NULL的返回值。
<if>
if /*condition*/ then //if /*condition*/ then /*action*/
/*action*/
end if

if /*condition*/ then
/*action1*/
else
/*action2*/
end if

if /*condition1*/ then
/*action1*/
elseif /*condition2*/ then
/*action2*/
end if

if /*condition1*/ then
/*action1*/
elseif /*condition2*/ then
/*action2*/
else
/*action3*/
end if

<choose case>
choose case /*expression*/
case /*item*/
/*statementblock*/
end choose

choose case /*expression*/
case /*item*/
/*statementblock*/
case else
/*statementblock*/
end choose

循环:
<do>
do until /*condition*/
/*statementblock*/
loop

do while /*condition*/
/*statementblock*/
loop

do
/*statementblock*/
loop until /*condition*/

do
/*statementblock*/
loop while /*condition*/

<for next>
for /*varname*/=/*start*/ to /*end*/
/*statementblock*/
next

for /*varname*/=/*start*/ to /*end*/ step /*increment*/
/*statementblock*/
next

Call语句(具体见事件或函数的调用):
使用该语句可以在于对象的脚本中调用父对象中的脚本。
eg:
call w_main::open
call w_main.cb_close::clicked
当在于窗口中扩展父窗口的脚本时,PB自动为于窗口的脚本中插入如下语句:
call super::event_name
并且为该脚本生成一个名称为AncestorReturnValue的本地变量,使用该变量可以知道父脚本调用后的返回值。该变量的类型自动和父脚本返回值的类型一致,并且自动维护。当重载父窗口的脚本时,只有子窗口中的脚本使用了call语句,才能使用变量AncestorReturnValue。

continue语句:
该语句用在循环中,可以直接使用,没有任何参数。PowerBuilder在执行循环时如果遇到continue语句,就直接跳转到next或loop语句处,忽略当前循环中continue和next(或loop)之间的语句,然后继续执行循环语句。

exit语句:
该语句用在循环中,可以结束循环,执行紧跟在循环之外的语句。该语句也是直接使用,没有任何参数。

goto语句:
该语句可以将无条件改变语句的执行流程,跳转到指定的标号处。该语句有一个参数,用来指明要跳转到哪个标号处。

halt语句:
该语句可以结束应用程序的执行。当不带任何参数时,可以立即停止应用程序的执行;
当带参数close时,可以立即停止应用程序的执行,并执行应用close事件中的脚本,然后关闭应用。

return语句:
该语句可以立即停止事件脚本或函数的执行,如在事件的脚本中,则返回到等待用户动
作状态,在函数中则返回到调用函数的地方。它的语法是:
RETURN {expression}
在函数中,expression是任何表达式或取值,只要类型和函数定义中返回值的类型相同即可。

-------------
函数的访问权限:
Access选择该函数的访问权限有3种:
Public类型的函数在应用中的任何脚本中都可以被访问
Private类型的函数只能在定义该函数的窗口(或用户对象)中才能被访问到
Protected类型的函数在定义该函数的窗口(用户对象)和该窗口的继承窗口中都可以被访问到。
eg:在窗口w_main中有public类型的函数f_pubfun()和private类型的函数f_prifun(),则在其他窗口中可以用w_main.f_pubfun()调用到此函数,而不能用w_main.f_prifun()调用到此函数

函数的参数:
参数的传递有3种方式
By value传递方式是拷贝原变量,不影响原变量
By reference实际是传逐变量的指针,函数中对该参数的修改都影响原变量
Read-only方式传递的参数在函数中被当做常量,因为不拷贝原变量,该参数传递方式对于某些变量的执行效率比Byvalue方式要高。

-------------
MessageBox(title,text{,icon{,button{,default}}})
title:信息窗口标题
text:提示信息
icon:使用的图标 StopSign!、Information!、Exclamation!、Question!、None!
button:提供哪些按钮OK!、OKCancel!、YesNo!、YesNo!、YesNoCancel!、RetryCancel!、AbortRetryIgnore!
defaule:用来确定信息提示窗口上的默认按钮
MessageBox(title,text):默认为Information!、OK!
函数messagebox()中,如果要显示的信息是NULL时,提示窗口不会显示

-------------
以下函数经过修改可以支持双字节和混合字节

<SBCS> <DBCS>
file filew
left leftw
lefttrim lefttrimw
match matchw
mid midw
pos posw
right rightw
righttrim righttrimw
trim trimw

-------------
数组
数组可以逐个元素赋值,也可以整体赋值。给数组整体赋值要注意以下几点:
1、不管说明类型的数组(包括any类型的),在整体赋值时,数组元素只能赋给相同类型的数据,如下面的赋值都是错误的:
string lsa_array[3] = {1,'2',3}
any la_array[3] = {123,'another',date("1981/02/17")}
2、多维数组的存取是列优先的,注意整体赋值以后哪个元素和哪个值对应,尤其是多维数组时,如,intlia_array[3,2] = {1,2,3,4,5,6}声明数组后,该数组各元素的取值情况是:
a[1,1] = 1 a[1,2] = 4
a[2,1] = 2 a[2,2] = 5
a[3,1] = 3 a[3,2] = 6
*a[3,2]:3行2列
*列优先指的是先赋值给每行的第1列,再赋值给每行的第2列,……
3、可以用数组给另一个数组整体赋值,因为数组在内存中的存放是线性的,所以不同维数的数组间可以赋值,并且不管它们的元素个数是否相等。如,下面的赋值语句都是正确的:
string a1[4],a2[8 to 65],a3[2,45,8 to 12],a4[10,10,10,10]
……//单个数组赋值
a1 = a2;a1 = a3;a1 = a4
a2 = a1;a2 = a3;a2 = a4
a3 = a1;a3 = a2;a3 = a4
a4 = a1;a4 = a2;a4 = a3
**any类型是一种比较特殊的数据类型,当定义了any类型的数组时,该数组中的不同元素可以赋给不同的数据类型的数据。但是,只能使用单个元素逐一赋值的方法,而不能整体赋值。如,下面给any类型数组的赋值语句是正确的:
any laa_array[3]
laa_array[1] = 123
laa_array[2] = 'another'
laa_array[3] = date('1981/02/17')

使用函数UpperBound()和LowerBound()函数分别获得数组的上标和下标

-------------
指代词 使用位置 含义

窗口中的控件 窗口
parent 可视用户对象中的控件 用户对象
菜单 上一级菜单

this 窗口、定制用户对象、应用对象、控件 对象或控件自身

parentwindow 菜单(只能用于菜单) 运行时菜单所在的窗口

子对象或控件 父对象或控件
super 子窗口或用户对象 直系祖先
子窗口或用户对象中的控件 用户对象的直系祖先

this:
用于引用当前对象。代表脚本所在的对象。
当有同名的全局变量和实例变量时,PB将会首先找到全局变量,需要引用本地变量,就必须使用指代词this

parent:
用于引用包含当前对象的父对象(放置该对象的窗口或用户对象)。在窗口或用户对象的控件中,parent指代窗口或者用户对象;在菜单中,parent指代包含当前菜单项的上一级菜单。
在定制的用户对象内,使用parent的任何控件都是引用用户对象本身,而不是引用放置用户对象的窗口;需要访问用户对象的父对象(放置该对象的窗口或者用户对象)时不能使用parent了,只能使用getparent()函数。close(getparent(parent))

parentwindow:
只用在菜单中。用来指代在运行时和菜单所联系的窗口
注意:parentwindow.st_1.text="Test"是错误的。
在菜单项中的编程推荐方法:在菜单项中触发父窗口的某个事件,通过窗口的事件脚本让窗口自己来修改自己的内容

super:
该指代词只有在处理继承时才使用,用来引用后代对象的祖先。使用祖先名称也可以引用,但是更为通用的是Super。例如,想调用父对象的Clicked事件处理程序时,子对象中可以这样写:
CALL Super::Clicked
当调用在子类中被重载的父对象的函数时,也可以使用super来指代父对象,例如,子对象重载了父对象的函数f_func(),在子对象中调用父对象的f_func()函数的语句可以这样编写:
Super::f_func()

----------
变量的作用域:全局、实例、共享、本地
全局变量:可以在应用程序的任何地方访问,独立于其他任何的PowerBuilder对象。全局变量没有存取权限修饰,只能是public类型的。

实例变量:实例变量是属于对象的,和对象相关联,对象打开时,实例变量才创建,对象关闭时,实例变量也就消失了。不是所有的PowerBuilder对象都可以拥有实例变量,应用对象、窗口、用户对象和菜单可以拥有实例变量,在这些对象以及它们的控件中可以访问实例变量,也可以在定义实例变量时指定访问权限。

共享变量:共享变量不属于对象的实例,属于对象的定义。每个对象实例对变量的修改都影响该变量在其他该对象实例中的取值。和实例变量一样,只有应用对象、窗口、用户对象或者菜单可以拥有共享变量,在这些对象及它们的控件中可以访问该变量。和实例变量相比较,它们有以下的区别:
同一对象的多个实例中,实例变量互不影响,共享变量互相影响;
共享变量只有private存取权限,并且在声明时不能使用存取权限;实例变量可以有多种存取权限,并且声明时可以使用存取权限;
某对象打开时,实例变量重新取初始值,共享变量仍然保留上次关闭时的取值。利用共享变量的这一特性,可以保存同一窗口的不同创建操作之间的信息。

本地变量:
本地变量的作用范围是声明该变量的脚本范围内,出了定义,它的脚本就不能访问了。它是临时的变量,当脚本执行时为这些变量分配内存空间,脚本执行完毕,这些变量就不存在了。本地变量没有权限修饰。


四种作用域的变量的访问顺序:本地变量、共享变量、全局变量、实例变量
当存在同名而不同作用域的变量,而又想访问搜索顺序靠后的变量时,可以使用一些修饰符来访问。
全局变量的修饰符是两个连写的冒号“::”,实例变量是变量所属实例的名称,共享变量是变量所属定义的名称,本地变量不使用任何修饰符。
注意:通过匈牙利命名法可以避免这种情况。


变量声明
[存取权限:]数据类型 变量名称[=初始值]{[,变量名称[=初始值]]}

在声明变量的同时可以给变量赋值,如果不赋值,PowerBuilder将其值置为该类型的默认值,不同类型的默认值不同。如string类型默认值为空(是“”而不是NULL),integer类型的默认值为0

在变量声明时,应该注意不要将today()、now()函数的执行结果赋值给变量,除非希望获取编译的时间,否则程序执行不会得到预期的效果
eg:string ls_today = string(today(),'yyyy-mm-dd')
st_1.text = ls_today //不会在st_1.text中显示运行时的时间
应改为:
string ls_today
ls_today = string(today(),'yyyy-mm-dd')
st_1.text = ls_today //st_1.text中正确显示运行时的时间
应该PB编译为变量赋值为编译时刻的时间,以后在运行变量也不会重新获得取值了


变量的存取权限
全局变量:public
共享变量:private
本地变量:没有存取权限
实例变量:
访问权限:
(1)public:默认的访问权。任何脚本都可以访问有该访问权的变量,在声明变量外面的脚本中,可以使用界定符号点(.)来访问。
(2)protected:声明变量的对象中的脚本以及子对象的脚本可以访问这种权限的变量。
(3)private:只有声明变量的对象中的脚本才能访问这种变量,子对象也无法访问。
读权限:
protectedread:只有声明变量的对象中的脚本和子对象可以读取该变量的值。
privateread:只有声明变量的对象中的脚本可以读取该变量的值,子对象也无法读取。
写权限:
protectedwrite:只有声明变量的对象中的脚本和子对象可以修改该变量的值。
privatewrite:只有声明变量的对象中的脚本可以修改变量的值。

----------
数据类型
在PB中,数据类型分为四类:标准数据类型、any数据类型、系统对象数据类型、枚举类型。

1、标准数据类型
数据类型 描述(声明时的默认值)
Blob 二进制大型对象,用来存储大量数据,如图像、大文本、Word文档。(空的blob)
Boolean 布尔型,取值要么为True,要么为False。(False)
Char/charater 单个ASCII字符。(空(""))
Date 日期,由完整的年月日组成,格式取决于操作系统的设置.(1900-01-01)
DateTime 日期及时间,用于和数据库的datatime类型数据交互。(1900-01-01 00:00:00)
Decimal/dec 有符号十进制数,最大18位宽。(0)
Double 有符号浮点数,精度15位,范围为2.2E-308到1.7E+308。(0)
Integer/int 16位有符号整数,范围为-32768到+32767。(0)
Long 32位有符号整数,范围为-2,147,483,648到+2,147,483,648。(0)
Real 有符号浮点数,精度6位,范围为1.17E-38到3.4E+38。(0)
String 由任何ASCII字符组成,宽度为0到2,147483,647(16位PowerBuilder最多是59999)。(空(""))
Time 24小时格式的时间值:小时、分、秒以及秒的分数.(00:00:00)
UnsignedInteger 16位无符号整数,范围为0到65535。(0)
UnsignedLong 32位无符号整数,范围为0到4,294,967,295。(0)

在和数据库打交道时,一定要注意,有时相同的数据类型可能取值范围有所不同。例如,在SQL Server中,integer类型的数据为32位,取值范围比PowerBuilder中的integer取值大。

数据类型转换函数
函数 参数类型 返回值类型
Char Blob,Integer,String Char
Dec String Decimal
Double String Double
Integer String Integer
Long String Long
Real String Real
Date DateTime Date
DateTime Date,Time DateTime
String Blob,Date,DateTime,Time,数值类型 String
Time DateTime Time

2、any数据类型
在编译时不确定类型,只有在运行赋值时才能确定类型
any la_str
la_str = 'string'
messagebox('',la_str) //出错
messagebox('',string(la_str)) //通过

3、系统对象数据类型
系统对象类型的变量是一种特殊的变量。在PowerBuilder的环境中可以设计窗口、菜单、应用对象,可以在窗口中放置像命令按键、列表框等控件,这些都是系统对象。可以像定义标准变量那样定义一个系统对象变量。例如:CommandButton lo_MyButton

查看系统对象数据类型:打开Browser画板,单击system属性页,在窗口左面单击鼠标右键弹出菜单中的“show hierarchy”,选中最上面的“powerobject”,使用鼠标右键弹出菜单中的“expand all”,就可以看到PB中所有的系统对象及其继承关系。

4、枚举型
枚举型变量是一种只能由脚本读取而不能修改的变量,一般用做函数的参数或者PowerBuilder系统对象的属性。不同于其他语言的枚举型,在PowerBuilder中,开发人员不能定义自己的枚举型变量,只能使用系统中提供的枚举型变量。它的取值范围是固定的一组值,用英文字母后加一个感叹号(!)表示

在Browser画板中可以查看系统中所有的枚举型变量及其取值。操作步骤是,进入Browser画板,打开enumerated属性页,在窗口左面选中要查看的枚举型,在窗口的右面“properties”上双击鼠标左键或者使用鼠标右键弹出菜单项“expand all”,这时显示左面选中的枚举型所有的可能取值。

-------------
调用函数和事件的完整语法格式
{ objectname.} { type } { calltype } { when } name ( { argumentlist } )
objectname:代表函数和事件所在的对象
type:可以选择event或function(默认)中的一个关键字
calltype:是关键字dynamic或static(默认)中的一个
when:代表post或trigger(默认)
name:是被调用的函数或事件名
argumentlist:是事件或函数的参数
*注意:
1、{}表示可选
2、type、calltype、when的顺序可任意
3、调用自身的函数或事件时(如在窗口事件中)可以省略{objectname.}或可以用指代词this.
4、(对3的补充)调用窗口中的函数时(如在放置在窗口上的按钮的clicked事件中)由于是窗口的函数可以省略{objectname.}或可以用指代词parent.(注意不能用this.)


调用祖先对象中的函数和事件
{ objectname. } ancestorclass ::{ type } { when } name ( { argumentlist } )


子函数中如果有代码(包括注释)则不会再执行父函数中的代码


事件和函数调用的实例:
eventName:表示事件名,funName:表示函数名,参数略
ancestorName:祖先对象名
{}表示可以省略
/表示也可以使用另一个

1、在窗口事件中调用
1.1、本窗口中的事件
当前事件:{this.}event eventName - 若此事件中有祖先代码,则先执行祖先代码,再执行当前代码。
祖先事件:super::event eventName - 只执行此事件中的祖先代码。
1.2、本窗口中的函数
当前函数:{this.}{function} funName - 若无当前代码,则执行祖先代码,否则执行当前代码(与事件不同)。
祖先代码:super/ancestorName::{function} funName - 只执行此函数中的祖先代码。
1.3、本窗口按钮中的事件
当前事件:cb_1.event eventName() - 先执行祖先代码,再执行当前代码
祖先事件:?无法跳过当前代码只调用祖先代码?
1.4、其他窗口中的事件
当前事件:若w_other打开,则w_other.eventeventName
若未打开,则window w_1
w_1 = create w_other
w_1.event dynamic eventName
祖先事件:?无法跳过当前代码只调用祖先代码?
1.5、其他窗口中的函数
当前函数:若w_other打开,则w_other.{function}funName
若未打开,则window w_1
w_1 = create w_other
w_1.{fuction} dynamic funName
祖先函数:?无法跳过当前代码只调用祖先代码?
1.6、其他窗口按钮中的事件
当前事件:w_other必须打开,w_other.cb_1.eventeventName
祖先事件:?无法跳过当前代码只调用祖先代码?
1.7、全局函数
funName

2、在窗口-按钮事件中调用
2.1、本窗口中的事件
当前事件:w_1/parent.event eventName
祖先事件:?无法跳过当前代码只调用祖先代码?
2.2、本窗口中的函数
当前函数:w_1/parent.{function} funName
祖先代码:?无法跳过当前代码只调用祖先代码?
2.3、本窗口按钮中的事件
其他按钮:cb_1.event eventName() - (?祖先不行?)
本按钮祖先:super::event eventName
2.4、其他窗口中的事件
同1.4
2.5、其他窗口中的函数
同1.5
2.6、其他窗口按钮中的事件
同1.6
2.7、全局函数
同1.7

3、在窗口函数中调用
3.1、本窗口中的事件
同1.1
3.2、本窗口中的函数
同1.2
3.3、本窗口按钮中的事件
同1.3
3.4、其他窗口中的事件
同1.4
3.5、其他窗口中的函数
同1.5
3.6、其他窗口按钮中的事件
同1.6
3.7、全局函数
同1.7

4、在其他函数中调用
4.1、窗口中的事件
同1.4
4.2、窗口中的函数
同1.5
4.3、窗口按钮中的事件
同1.6
4.4、其他全局函数
同1.7

-------------

 

0 0