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