1、第二章第二章第二章第二章 PowerScript PowerScript PowerScript PowerScript 语言语言语言语言2.1 PowerScript基础2.2 数据类型2.3 变量声明及作用域2.4 运算符及表达式2.5 PowerScript语句2.6 几个常用的标准函数2.7 编辑代码2.8 应用程序编程实例本章主要内容2.1.1 注释单行注释用“/”。多行注释用“/*/”。/这是一个计算器程序Decimal add1 /add1表示中间结果/*flag=1表示按下的数字是前面数字的一部分flag=0表示按下的数字是一个新的数字的开始*/Int flag2.1 Powe
2、rScript基础标识符是程序中用来代表变量、标号、函数、窗口、选单、控件、对象等名称的符号标识符的命名规则如下。(1)必须从字母或下画线开头。(2)由字母、数字、下画线_、短横线-、¥、#、%组成。(3)不能是PowerScript保留字(见附录)p432。(4)不区分大小写。(5)最长40个字符。2.1.2 标识符一组正确的标识符:rv /返回值f_add /函数Button#1 /按钮一_SpecialID /以下画线开头下面的标识符写法是错误的:Total book /标识符中间不能有空格THIS /误用保留字THISabcdef /标识符中间有非法字符 2x /以数字开头注意:短横线
3、与减号是同一个字符2.1.2 标识符可以将一条语句分成几行,这时就需要用到续行符&,将语句串起来。例如:IF side1=5 AND&side2=6 THEN area=5*7相当于 IF side1=5 AND side2=6 THEN area=5*7注意:不能在标识符或保留字的中间续行。2.1.3 续行符字符串中可以包括特殊的ASCII码字符,它们不能使用常规的输入方法直接输入,需要使用其他字符来代替。2.1.4 特殊字符字 符功 能n换行r回车t制表符单引号”双引号“波浪号000到255十进制形式的ASCII码所代表的字符h00到hFF十六进制的ASCII码所代表的字符o00到o377
4、八进制的ASCII码所代表的字符。这里是字母o,不是数字0MessageBox(学生信息,n姓名 t性别 t专业名+&n刘敏 t男 t计算机科学与技术)运行后的结果如图所示:2.1.4 特殊字符 2.2.1 标准数据类型标准数据类型包括数值型、字符型、日期型、布尔型等一些最基本的数据类型。其名称、含义及示例见表2.22.2.2 枚举类型枚举类型是定义的特殊常量,常用于对象或控件的属性、系统函数的参数等。枚举类型实际上是一组值,每个值都以英文单词开始,以感叹号(!)结束,例如:yesno!、Exclamation!等。2.2 数据类型【例2.2】枚举类型的使用。MessageBox(学生信息,保
5、密资料,Exclamation!,YesNo!)2.2 数据类型变量在程序运行过程中被赋值,在执行各种运算和变量在程序运行过程中被赋值,在执行各种运算和控制时其值可以改变。控制时其值可以改变。数据类型 变量名=初值例如:String my_homeInteger i=9 Real a,b,c 若未指定初值,系统将赋以默认值。对数值型变量其默认值为零。字符型变量其默认值为空字符或空串“”。例p172.3 变量声明及作用域2.3.1 变量声明数据类型 数组名=初值Integer person3 /有person1、person2、person3 三个元素Integer num3 to 5 Real
6、 a2,2 /有a1,1、a1,2、a2,1、a2,2Integer person 在定义变量的同时,可以同时指定变量的初值。String city=“南京”,countryInteger person3=3,8,9Integer person2,3=1,2,3,1,2,32.3.2 数组的声明 用户可以使用数组来表示一系列具有相同类型的变量,这些具有相同类型的变量共用一个变量名赋值语句的使用示例一。area=3.14*r*r赋值语句的使用示例二。Int s s=1,3,5,6,8赋值语句的使用示例三。String s=“You got a job”String s=You got a job
7、 String s=You got a job /同时使用多个单引号时需使用转义字符赋值语句的使用示例四。Integer x,y,z=20022.3.3 赋值语句空值NULL是PowerBuilder与数据库交换数据时使用的一种特殊值,代表数据未定义、不确定,它与空字符串、空字符、数值零以及日期00-00-00的意义完全不同。空值既不是零,也不是非零的任何数值。2.3.4 空值变量被赋予空值的途径有如下两条。(1)从数据库中读到空值。(2)使用SetNull()函数赋值。例1:String person /person=SetNull(person)/person值为NULL例2:Intege
8、r x,y,z=2002Setnull(y)测试变量或表达式是否为空值时,使用函数IsNullIF IsNull(a)THEN 2.3.4 空值Local变量在事件和函数中定义的变量都是Local变量,它的作用范围仅在所在的事件和函数内,在别的事件和函数中不起作用。Instance变量Instance变量的作用范围不仅在所在对象的全部事件及函数,而且包括该对象的所有控件的事件及函数。可以说是一种局部的“全局变量”。2.3.5 变量作用域有4种不同范围的变量:Local、Instance、Global、SharedGlobal变量Global变量的作用域是整个应用程序,所以必须特别小心。一般说来
9、,使用Global变量不是一个好的习惯,它会降低程序的可靠性。Shared变量属于一个对象且可以被该对象的所有实例引用,即共享变量为该对象的多个对象实例共享当一个实例关闭时,赋给共享变量的值不变,当再打开时,继续使用关闭前的值对于同一对象的所有对象实例,共享变量值始终一致2.3.5 变量作用域2.4 运算符及表达式运 算 符含 义示 例+加c=a+b-减c=a-b 减号两边加空格*乘c=a*b/除c=a/b乘方(幂)c=ab a的b次方2.4.1 算术运算符 在表达式中,乘方高于乘、除,乘、除高于加减。同级运算遵循自左至右的原则a+等价于a=a+1a-等价于a=a-1a+=b*c等价于a=a+
10、b*ca-=b+4等价于a=a-(b+4)a*=c+d等价于a=a*(c+d)a/=c+d等价于a=a/(c+d)a=c+d等价于a=a(c+d)2.4 运算符及表达式 PowerScript还提供了一组扩展的算术操作符(与C语言中使用的算术运算符相同):+-+=-=/=*=boat=boat 结果是TrueboAt=boat 结果是False7大于IF ab+3 THEN=等于IF p+q=w*t THEN小于IF ac THEN不等于IF a*bt+8 THEN=大于等于IF a=b THEN=小于等于IF a-10 AND a50 OR a,=,=,关系运算符7 NOT 逻辑非8 AND
11、 逻辑与9 OR 逻辑或2.5 PowerScript语句格式1:IF condition THEN ELSE格式2:IF condition THEN ELSE END IF在条件语句中,ELSE子句是可选的。2.5.1 分支语句1IF条件语句(1)IF a3 AND a=0 THEN t=3+b ELSE t=3 b (3)IF r0 THEN area=3.14*r*r l=2*3.14*r ELSE area=0 END IF 2.5.1 分支语句例例1 1:从单行编辑框中输入考分,按:从单行编辑框中输入考分,按“输入输入”按钮再根据考分显按钮再根据考分显示及格或不及格。示及格或不及格
12、。Integer sInteger ss=integer(sle_1.text)s=integer(sle_1.text)/sle_1 text/sle_1 text单行编辑框文本单行编辑框文本If s 60 thenIf s=90 then St_1.text=优 elseif s=80 then St_1.text=良elseif s=70 then St_1.text=中elseif s=60 then St_1.text=及格else St_1.text=不及格end if2.5.1 分支语句2CHOOSE语句CHOOSE CASE test_expressionCASE expres
13、sion_list1 Statements1CASE expression_list2 Statements2CASE expression_listn Statementsn CASE ELSE Statements n+1END CHOOSE其中expression_List形式如下。单个值由逗号隔开的若干个值 如:1,3,5,7某一区间:例如1 to 8,b to h IS表达式:例如IS30 混合:例如2,4,7 to 15,IS202.5.1 分支语句2.5.1 分支语句CHOOSE CASE执行过程2.5.1 分支语句CHOOSE CASE score CASE IS=90 Gra
14、de=ACASE 80 TO 89 Grade=BCASE 70 TO 79 Grade=CCASE 60 TO 69 Grade=DCASE ELSE Grade=EEND CHOOSE举例:例3:从单行编辑框中输入考分,按“输入”按钮后,再根据考分显示优、良、种、及格或不及格。(用choose case重写例2)integer fString sf=integer(sle_1.text)CHOOSE CASE f CASE IS=90 /改进 90 to 100 S=优 CASE 80 TO 89 S=良 CASE 70 TO 79 S=中 CASE 60 TO 69 S=及格 CASE
15、0 TO 59 S=不及格 CASE ELSE S=输入错,请重新输入!END CHOOSESt_1.text=string(S)2.5.2 循环语句格式:FOR v=s TO e STEP i NEXT1FOR循环语句【例2.4】FORNEXT语句的使用。求s135799。创建工作空间和应用程序,然后PowerBuilder应用程序的命令按钮Clicked事件脚本编辑区编写“计算”按钮的脚本如下:Integer nInt in=0FOR i=1 TO 99 STEP 2n=n+iNEXTsle_2.text=String(n)2.5.2 循环语句2.5.2 循环语句格式1:DO UNTIL
16、conditionLOOP当条件为False时,执行循环体;为True时退出循环。2DOLOOP循环2.5.2 循环语句Integer nInt i=1n=0DO UNTIL i99n=n+ii=i+2LOOPsle_2.text=String(n)【例2.5】DO UNTILLOOP循环语句的使用。求s135799。创建工作空间和应用程序,然后PowerBuilder应用程序的命令按钮Clicked事件脚本编辑区编写“计算”按钮的脚本如下:格式2:DO WHILE condition LOOP当条件为True时,执行循环体;为False时退出循环。2.5.2 循环语句2.5.2 循环语句【例
17、2.6】DO WHILELOOP循环语句的使用。求s135799。Integer nInt ii=1n=0DO WHILE i99sle_2.text=String(n)2.5.2 循环语句格式4:DO LOOP WHILE condition先执行循环体,然后判断条件。当条件为True时,执行循环体;为False时退出循环。2.5.2 循环语句【例2.8】DOLOOP WHILE循环语句的使用。求s135799。Integer nInt ii=1n=0DOn=n+ii=i+2LOOP WHILE i=99 sle_2.text=String(n)3CONTINUE语句格式:CONTINUE只
18、能用于DOLOOP和FORNEXT语句中遇到CONTINUE语句,将不执行CONTINUE语句后面的语句,回到循环条件处继续执行。2.5.2 循环语句【例2.4】FORNEXT语句的使用。求s135799。Integer nInt in=0FOR i=1 TO 99 if mod(i,2)=0 then continue n=n+iNEXTsle_2.text=String(n)2.5.2 循环语句4EXIT语句格式:EXIT只能用于DOLOOP和FORNEXT语句中,遇到EXIT语句,将结束循环,跳到LOOP或NEXT后面的语句去执行。2.5.2 循环语句格式:GOTO 语句标号转到语句标号
19、处继续执行,程序中应避免使用GOTO语句。例如:i=1BEGINLOOP:/语句标号 sum+=arri /等价于语sum=sum+arrii+=1 IF i=50 THEN GOTO BEGINLOOP/转到BEGINLOOP标识的位置继续执行 2.5.3 GOTO语句返回和中止语句 有Return、Halt语句 两种。wReturn语句用于从脚本中返回调用程序。wHalt语句用于中止应用程序的执行。返回和中止语句 例1:点击按钮反复显示“单数”“双数”提示:使用实例变量定义实例变量:(Instance Variables)Integer flag在cb_1的clicked事件中编写如下脚本
20、:if flag=1 then this.text=单数flag=2elsethis.text=双数flag=1end if 应用举例 例2:动画字符串。在窗口事件mousemove编写intifor i=1 to 100cb_1.x=mod(cb_1.x+10,parent.width)next例3:你笨吗?在窗口事件mousemove编写如下脚本:intxp,ypxp=mod(xpos+rand(1600),this.width)yp=mod(ypos+rand(1500),this.height)cb_1.x=xpcb_1.y=yp 应用举例格式:MessageBox(title,tex
21、t,icon,button,default)各参数的含义title:String类型,指定消息对话框的标题。text:指定消息对话框中显示的消息,该参数可以是数值数据类型、字符串或boolean值。icon:枚举类型,可选项,指定要在该对话框左侧显示的图标。值为:Information!(默认值),StopSign!,Exclamation!,Question!,None!。信息图标 停止图标 惊叹号图标 问号图标 无图标2.6 几个常用的标准函数2.6.1 MessageBox函数button:枚举类型,可选项,指定显示在该对话框底部的按钮。值为:OK!“确定”按钮 OKCancel!“确定
22、”、“取消”按钮 YesNo!“是”、“否”按钮 YesNoCancel!“是”、“否”、“取消”按钮 RetryCancel!“重试”、“取消”按钮 AbortRetryIgnore!“终止”、“重试”、“忽略”按钮default:数值型,可选项,指定作为默认按钮的按钮编号,按钮编号自左向右依次计数,默认值为1。函数执行成功时返回用户选择的按钮编号(例如1、2、3等),发生错误时返回-1。2.6.1 MessageBox函数2.6.1 MessageBox函数【例2.9】MessageBox函数的使用。创建工作空间和应用程序,然后在工作空间窗口“w_1”的Open事件脚本编辑区编写“应用”的
23、脚本如下:Int retret=MessageBox(这是一个例子,是否要存盘?,Question!,YesNoCancel!,3)IF ret=1 THENDw_1.update()ElseIF ret=2 THEN RETURNEND IFEND IF格式:Open(window_name)打开窗口并触发窗口的Open事件。2.6.2 Open函数Open函数用来打开一个PowerBuilder窗口。格式:Close(window_name)先触发窗口的CloseQuery事件,CloseQuery事件的返回值不等于1,则再触发Close事件、关闭窗口并释放窗口以及窗口上的控件所占据的内存
24、。若CloseQuery事件的返回值等于1,则不会关闭窗口。因此,我们可以在窗口的CloseQuery事件中,编写代码询问用户是否要关闭窗口。2.6.3 Close函数Close函数用来关闭一个PowerBuilder窗口。2.6.3 Close函数创建工作空间和应用程序,然后在PowerBuilder应用程序的命令按钮Clicked事件脚本编辑区编写“关闭”按钮的脚本如下:Close(parent)/退出当前窗口格式:Run(appl)或 Run(appl,state)参数appl是个字符串,指明要运行的应用程序名,若不含路径名,则默认为当前路径。参数state是个枚举类型,用以指明开始运行
25、时的窗口状态,有3个值可选,Maximized!:最大化窗口;Minimized!:最小化窗口;Normal!:正常大小窗口(原始窗口),正常大小窗口为默认值。2.6.4 Run函数2.6.4 Run函数【例2.11】Run函数的使用。创建工作空间和应用程序,然后PowerBuilder应用程序的Open事件脚本编辑区编写“应用”的脚本如下:Run(C:WINDOWSsystem32calc.exe“,normal!)/这里使用的是Windows XP sp2操作系统在PowerBuilder中,编辑代码首先选定要编辑代码的对象,然后选定事件,再在Script窗口中编辑代码,或者用鼠标右键单击
26、要编辑代码的窗口或控件,将出现一个弹出式选单,选择Script,系统将打开Script窗口,并在窗口显示最后一次编辑的事件的代码。若事件都没有代码,则选择最常用的事件,供用户输入代码。用户可以选择所要的事件。2.7 编辑代码2.8 应用程序编程实例【例2.12】用PowerBuilder 10.0制作计算器应用程序。计算器的外观如图所示。2.8 应用程序编程实例在F盘上创建一个目录workspace,用于存放计算器应用。创建计算器的具体步骤如下。1创建计算器应用 创建计算器应用的步骤如下。(1)创建新的工作空间。单击“New”图标按钮,打开“New”对话框;选择“Workspace”页,单击“
27、OK”按钮,弹出保存文件对话框,选择到新建的目录F:workspace,输入文件名为“Calculator.pbw”。(2)创建新的应用。单击“New”图标按钮,打开“New”对话框;选择“Target”页中的“Application”,单击“OK”按钮,弹出保存文件对话框,选择到新建的目录F:workspace,输入文件名为“Calculator”,单击“Finish”按钮,系统自动用上面输入的应用名称加上扩展名“.pbl”和“.pbt”,组成库名Calculator.pbl以及目标文件名Calculator.pbt。2.8 应用程序编程实例(2)在窗口的属性(Properties)卡的Ge
28、neral页中,在“Title”栏中输入窗口标题“计算器”,将MaxBox和Resizable复选框不选中,其余使用默认值;保存窗口对象,取名为w_calculator。2创建计算器窗口和设置窗口属性创建计算器窗口和设置窗口属性的具体方法如下。(1)单击New图标按钮,打开“New”对话框;选择“PB Object”页,双击“Window”图标,创建一个新窗口对象并进入窗口画板。2.8 应用程序编程实例3声明几个变量在“Script”脚本区左上边的下拉列表框中选择“(Declare)”,然后在下面的脚本区中编写代码如下:Decimal add1Char s1Boolean flag其中,add
29、1保存中间结果;s1保存按下的运算符;flag 是一个标志位,flag=false表示按下的数字是前面数字的一部分,flag=true表示按下的数字是一个新的数字的开始。如图2.21所示。4在窗口中布置显示数值的单行编辑框控件单击选单“Insert|Control|SingleLineEdit”,然后在窗口上单击,就会出现一个单行编辑框,其名称为sle_1,删除“Text”栏中的“none”,选中“DisplayOnly”属性,在单行编辑框的边沿拖动,调整其尺寸。2.8 应用程序编程实例图2.21 声明几个变量2.8 应用程序编程实例5在窗口中布置10个数字按钮和小数点按钮首先制作数字“1”按
30、钮,单击选单“Insert|Control|CommandButton”,然后在窗口上单击,就会出现一个命令按钮,其名称为cb_1,在“Text”栏中输入“1”,单击“Other”页,单击该页下部的“Pointer”下拉列表框的“”小三角,选择列出的“HyperLink!”手指形图标,在按钮的边沿拖动,调整好尺寸,然后为按钮编写程序脚本,单击数字“1”按钮,按鼠标右键,弹出子选单,单击“Script”选项(如图2.22所示),光标自动跳到脚本编辑区,可以看到默认的按钮事件为“Clicked”,输入如下代码:IF flag THENsle_1.text=flag=falseEND IFsle_1
31、.text=sle_1.text+THIS.text2.8 应用程序编程实例保存已完成的工作。由于10个数字按钮以及小数点按钮的“Clicked”事件的脚本都一样,外观也仅有Text属性不同,所以可以用控件完全复制的方法来快速地创建其他按钮。具体操作是单击数字“1”按钮,然后同时按Ctrl+C组合键复制到剪贴板,再同时按Ctrl+V组合键进行粘贴,这时两个按钮控件重叠在一起,用鼠标将cb_2拖开,并将cb_2的Text改为“2”,数字“2”按钮就制成了,包括脚本也被复制了。再用“粘贴”的方法,类似数字“2”按钮的制作一样,可以很快地制作出其他数字按钮和小数点按钮。6、*、/运算符按钮的制作首先
32、制作“”运算符按钮,它与数字按钮仅外观类似(Text属性不同,其余属性相同),脚本完全不同。可以先用外观复制的办法制作“”按钮控件,即单击一个数字按钮,然后同时按Ctrl+T组合键,这时,在数字按钮的下方会新出现一个按钮,系统自动为其起名cb_i,i为1、2、3、4。将新按钮Text栏中的内容改为“”号,编辑新按钮的“Clicked”事件脚本如下:2.8 应用程序编程实例CHOOSE CASE s1CASE*sle_1.text=String(dec(sle_1.text)*add1)CASE/sle_1.text=String(add1/dec(sle_1.text)CASE+sle_1.t
33、ext=String(dec(sle_1.text)+add1)CASE-sle_1.text=String(add1-dec(sle_1.text)END CHOOSEAdd1=Dec(sle_1.text)s1=THIS.textflag=true保存已完成的操作。由于4个运算符按钮的“Clicked”事件的脚本都一样,所以可以用控件完全复制的方法来创建其他运算符按钮。操作过程与数字按钮类似。2.8 应用程序编程实例7“清除”按钮的制作用外观复制的方法复制出一个按钮,将其Text栏中的内容改为“清除”,在其“Clicked”事件中输入以下脚本:sle_1.text=Add1=0s1=fla
34、g=true保存已完成的工作。8“”按钮的制作用Ctrl+C复制“+”按钮,再用Ctrl+V组合键粘贴出一个按钮,将其Text栏中的内容改为“”,将按钮的“Default”属性选中,这样当按下Enter键时,自动执行“”按钮的“Clicked”事件的代码。修改原“Clicked”事件的最后3行脚本,“=”键完整的脚本为:2.8 应用程序编程实例CHOOSE CASE s1CASE*sle_1.text=String(dec(sle_1.text)*add1)CASE/sle_1.text=String(add1/dec(sle_1.text)CASE+sle_1.text=String(dec(sle_1.text)+add1)CASE-sle_1.text=String(add1-dec(sle_1.text)END CHOOSEflag=trues1=保存添加了控件的窗口对象,关闭窗口。9编写“应用”的脚本在树状窗口中,双击“应用”Calculator,弹出应用画板。这时在事件下拉列表框中对应的是“Open”事件。在下面空白的脚本编辑区中编写“Open”事件的脚本:Open(w_calculator)保存并关闭应用画板,计算器已经制作完毕。单击“Run”图标按钮,就可以运行计算器程序了。2.8 应用程序编程实例实验内容:实验2本章实验