780 likes | 963 Views
第 8 章 PowerScript 语言. PowerScript 语言 Powerbuilder 是事件驱动的应用程序,事件发生时要处理的事情需要靠写程序来完成。那么,在 powerbuilder 中的编程语言是什么呢?就是我们将要学习的 powerscript 语言。 Powerscript 语言的语法与 C 语言十分类似。
E N D
第8章 PowerScript 语言 • PowerScript 语言 • Powerbuilder是事件驱动的应用程序,事件发生时要处理的事情需要靠写程序来完成。那么,在powerbuilder中的编程语言是什么呢?就是我们将要学习的powerscript语言。Powerscript语言的语法与C语言十分类似。 • PB是用来对数据库进行操作的工具,这就要求powerscript语言与其它语言相比应有较强的数据库操作能力。Powerbuilder语言支持SQL语言,而且还提供了一套完整的嵌入式的SQL语句,这就大大的增强了程序操纵和访问数据库的能力。
8.1 Powerscript基础 • 一、标识符 • 标识符是程序中用来代表变量、标号、函数、菜单、控件、对象等名称的符号。 • 标识符的命名规则: • 必须以字符或下划线开头 • 由字母、数字、下划线、短横线、#、¥、%、组成 • 不是powerscript保留字,指在powerbuilder中有特殊意义的字符,例如this,parent,super等,见书上附录。 • 不区分大小写 • 最长40个字符
正确的标识符: rv f_add button#1 _specialid 错误的标识符: total book this parent abc>cde 2x 特别注意: 短横线与减号是同一个字符,在表达式中使用减法运算符时,必须在减号的两边加上两个空格。 i=i-1 错误 i=i - 1
二、标签 • 标签允许用户在一个程序内跳到某个点执行,它用于GOTO语句。标签就是一个标识符后跟一个冒号(:),用户可以在一个脚本内放入任意数目的标签,但每个标签都必须是唯一的,用户可以跳到当前局部作用域内的某个标签。 例如下面的语句,来求1到10的和。 Int i,s s=0 i=1 Lab1: s=s+i i=i+1 If i<10 then Goto lab1 End if
三、运算符 • 运算符代表了对一个或两个操作数所进行的运算。在powerscript中有四类运算符:算术运算符、关系运算符、逻辑运算符以及连接运算符。 1)算术运算符 算术运算符用于进行数学计算 + - * / ^ c=a+b c=a - b c=a*b c=a/b c=a^b
2)关系运算符 关系运算符在两个操作数之间进行比较,关系运算的结 果可以为TRUE、FALSE、NULL = 等于 >= 大于等于 > 大于 <小于 <=小于等于 <>不等于 if a>b then c=b else c=a end if
3)逻辑运算符 逻辑运算符用于形成布尔表达式,这些表达式的值是TRUE或FALSE NOT !非 AND &&与 OR ||或
4)连接运算符 连接运算符(+)用于连接两个变量的内容,着两个变量必须是string或bolb数据类型。 String s1,s2 s1=’first’ s2=’ second’ s1=s1+s2 进行运算之后s1的值为”first second”
5)表达式中运算符优先级 ^ *、/ +、- =、>=、>、<、<>、<= NOT AND OR
四、连续字符串 多数情况下,每条语句占据一行,但有时语句会超长,需要将语句分成几行。 连续符(&)可用于在多行间延伸语句和字符串。 If a>b and b>c and& c<10 then c=a+b End if
五、空值(NULL) 是powerbuilder与数据库交换数据时使用的一种特殊值,代表数据未定义,不确定,与空字符串、空字符、数值0以及日期00-00-00的意义完全不同。 测试空值的方法 isnull( )返回布尔值TRUE、FALSE 设置一个变量为空的方法 setnull()
六、代词 powerscript提供了4个代词,分别是:this、parent、parentwindow和super。常用的代词是前面的3个。使用代词主要是为了增加程序的通用性,不受所指代的控件或对象的名称发生变化的影响。 This:代表窗口、用户对象、菜单、应用对象或控件本身,即代表正在为之编写脚本的对象。 Parent:指当前控件的窗口。 Parentwindow:代表运行时菜单所在的窗口,该代词只能在菜单的事件处理程序中使用。 Super:只有在处理继承时才使用代词super,super用于引用后代对象的祖先。
使用代词是为了使我们的程序更容易维护。 • 例如下列窗口w_1 W_1 在cb_close的clicked事件中: close(w_1) 与 close(parent) 作用相同
七、对象 • powerbuilder对象就是一个应用程序的组件,(例如,我们常用的窗口、菜单、函数、结构、查询、应用程序等)这些对象都有许多属性、事件及函数。 • 属性:用于描述对象的特性例如显示方式,大小、位置、是否可见等。例如窗口的名字、窗口的坐标等。
八、事件 • 当对某个对象执行某些操作时就会触发事件。用户为事件所编写的脚本确定进行什么样的处理进行响应。 Powerbuilder常用的事件提供了一些缺省的代码,例如当用户打开一个窗口时,PB处理所有窗口控件的创建和屏幕的绘制。例如用户在窗口上单击鼠标左键时,便会触发该窗口的LBUTTONDOWN事件。
8.2 数据类型 • 与其它语言一样,powerbuilder也有数据类型,而且数据类型十分丰富,包括标准数据类型、枚举类型、系统对象数据类型三大类,在程序中通过数据类型限定变量的取值范围。
一、标准数据类型 • 在powerbuilder中可以使用的标准数据类型在许多不同的编程语言和数据库服务器都是通用的。标准数据类型包括数值型、字符型、日期型、布尔型等一些最基本的数据类型。其名称、含义及示例见表:
一、标准数据类型 • 数据类型转换函数 char () 将bolb integer 或string转换成char dec() 将string转换成decimal double() 将 string 转换成double integer() 将string 转换成integer long( ) 将string转换成long 例如,书上计算器程序中将单行编辑框中的值转string( ) 将bolb,date,datetime、数值和time转换成string 换为数值型: dec(sle_1.text)
二、枚举类型 • 枚举类型是powerbuilder定义的特殊常量,常用于对象或控件的属性、系统函数的参量等。但用户不能定义自己的枚举类型,而只能按系统的要求使用它。枚举类型实际上是一组值,每个值都以英文单词开始,以!结束。例如:yesno!,okcancel!。 • messagebox("提示","是否存盘?",QUESTION!,OKCANCEL!)
三、系统对象的数据类型 在powerbuilder中,窗口、菜单、各种控件都是系统对象,每一种系统对象实际上是定义在powerbuilder内部的一种数据类型。通常是可视化的生成这些对象。在需要动态的处理菜单、窗口、控件时需要定义这些变量。例如menu,window window activesheet activesheet = w_frame.GetActiveSheet() 得到框架窗口的活动表单窗口
8.3 变量声明 • 无论是常量符号还是变量在使用前都要进行声明。 • 一、声明常量 • CONSTANT datatype constname=value • 其中,datatype为数据类型,constname为常量名,value为常量值。 • 例如: • CONSTANT string is_str=“北京” • CONSTANT real lr_pi=3.1415926
8.3 变量声明 • 二、变量声明 在powerbuilder中,所有变量在使用之前,都要首先予以说明。系统预定义的五个全局变量除外(SQLCA,SQLDA,SQLSA,ERROR,Message)。 格式: 数据类型 变量名{=初值} integer i=0 real a,b,c integer person[30] integer name[3 to 10]
二、变量的作用域 变量的作用域表示如何访问变量,在什么地方可以访问。 在powerbuilder中有4种不同范围的变量:全局,实例,共享,局部 • 全局变量 可以在整个应用程序内访问并存储在应用程序对象中,在设计应用程序时应尽量使公共变量的数目最小,因为在任何地方都有可能改变变量的值,会给程序的调试和维护带来困难。不利于对象的封装性。
二、变量的作用域 • 实例变量 实例变量是在一个对象中(应用程序、窗口、用户对象或菜单)内定义,可以在该对象的任何地方访问。这些变量应在对象创建时初始化,随着对象取消,实例变量也消失。 例如,在w_1中定义实例变量: integer I 在w_1之外引用该变量时: w_1.i=1
二、变量的作用域 • 共享变量 共享变量在对象中定义与对象的类关联,当对象消失后,共享变量的值依然保留直至应用程序关闭。 • 局部变量 局部变量就是在脚本层定义的变量,作用域在脚本内部。 对一个变量的搜索次序: 局部变量 共享变量 全局变量 实例变量
二、变量的作用域 • 作用域 • 全局变量(Global) • 可在整个应用程序内被访问 • 存储在应用程序对象中 • 共享变量(Shared) • 在对象内定义 • 可在对象内部任何地方被使用 • 同一个类的所有实例共享这种变量 • 实例变量(Instance) • 在对象内定义 • 可在对象内部任何地方被使用 • 实例变量的值不能与同一类的另外实例所共享 • 局部变量(Local) • 在脚本内定义的变量 • 只在脚本内部有效 • 变量的优先级 • 由高到低依次为:局部变量→实例变量→全局变量→共享变量
三、数组 powerbuilder提供两种,一维数组和多维数组。 一维数组既可以固定大小,也可以是无界。 多维数组必须有一维固定大小。 • 一维数组 string str[30] string str[3 to 30] 固定大小,任何在此之外的索引引用都会产生一个错误。
三、数组 • 无界数组 没有定义索引作用域的一维数组,无界数组索引从1开始,在第一次创建时上索引为0,下索引为1。 Integer a[] 任何大于1的引用都是合法的。 a[200]=100 生成200个元素,第200个元素为100,其它为0 a[250]=50 再向数组追加50个元素 访问数组作用域之外的元素将引起错误。 例如 integer i[] i[100]=0 If i[101]>0 then 访问数组作用域之外的元素会引起错误 End if
8.4 powerscript语句 一、赋值语句 赋值语句可以把一个表达式的结果或者变量和常量的值,赋给一个变量或者对象的属性或成员变量。赋值语句的格式是: 变量名 = 表达式 将表达式的值赋给等号左边的变量。例如: str = ‘abc’ i = 6 使用赋值语句也可以为数组变量赋值。例如: integer aarray[] aarray = {1,2,3,4,5,6} 在变量和数组之间也可以使用赋值语句复制数据: array1 = array2
8.4 powerscript语句 二、条件语句 IF … THEN 语句是一个选择分支结构。它有单行和多行两种格式。 1、 单行IF … THEN语句 单行IF … THEN语句的语法格式为: IF 条件 THEN 语句1 [ELSE 语句2] 其中条件是一条表达式,如果条件成立结果为执行语句1,否则执行语句2将被执行。
条件 语句1 语句2 8.4 powerscript语句 例如: IF num<20 THEN NUM = 1 ELSE NUM = 2 或 if num<20 then num=1 else num=2 end if
条件1 T 语句1 F 条件2 T 语句2 F ….. ….. 语句N 8.4 powerscript语句 2、 多行IF …THEN语句 多行IF … THEN语句的语法格式为:条件1语句1条件2语句2TTFF语句N…..….. IF 条件1 THEN 语句1 ELSEIF 条件2 THEN 语句2 … ELSE 语句n END IF
8.4 powerscript语句 其中条件1和条件2是条件表达式,语句1、语句2和语句n是一条或者多条语句。 本语句的执行过程为: • 计算条件表达式条件1,如果它的结果为TRUE,则执行语句1,然后略过在它后面和END IF之前的语句,离开IF...THEN语句; • 如果条件1的值为FALSE,则计算条件表达式条件2, 如果结果为TRUE,则执行语句2,然后略过在它后面和END IF之前的语句, • ……, • 如果条件表达式的结果都为FALSE,并存在ELSE子句,则语句n被执行。
8.4 powerscript语句 例子: int score string grade if score>=85 then grade=”A” else if score>=75 then grade=”B” else if score>=60 then grade=”C” else grade=”D” end if
8.4 powerscript语句 三、 CHOOSE CASE CHOOSE CASE控制结构根据测试值决定程序执行方向,它是一个条件多分支结构。CHOOSE CASE的语法格式为: CHOOSE CASE 测试值 CASE 表达式1 语句1 CASE 表达式2 语句2 ...... CASE ELSE 语句n END CHOOSE
8.4 powerscript语句 判断表达式可以用以下的几种形式: 1.用逗号分割的数据,例如:1,2,3,4,5,6, 2.用TO表示一个区间,例如:1 TO 60 3.用IS代表测试值,并辅以关系操作符,例如:IS >20 4.使用以上的三种方法的综合,用逗号分隔,例如:6,6 TO 16,IS > 36 在CHOOSE CASE语句中至少包括一条CASE,并且使用END CHOOSE作为结尾。POWER BUILDER将逐条地查找CASE,如果找到与测试值匹配的判断表达式的时候,就执行该CASE后面的语句,然后转向指向END CHOOSE后的第一条语句。如果包含CASE ELSE,在未发现任何匹配CASE条件的时候,执行CASE ELSE后面的语句。
8.4 powerscript语句 例子: CHOOSE CASE score CASE is>=85 grade = “A” CASE 75 TO 84 Grade=”B” CASE 60 to 74 Grade=”C” Case else Grade=”D” END CHOOSE
8.4 powerscript语句 四、 FOR NEXT循环 FOR...NEXT是一个计数循环体。使用该语句可以是循环体中的语句被执行规定的次数。该语句的语法格式为: FOR 循环变量= 初值 TO 终值 [step 步长] 执行循环体 NEXT
循环变量=初值 F • 循环变量在终值和初值之间 T 执行循环体 Next后面的语句 循环变量=循环变量+步长 8.4 powerscript语句
8.4 powerscript语句 步长增量缺省值为1。在使用FOR NEXT语句的时候应该注意,循环变量是integer型,终值的值不能取得过大,以防超出integer的取值范围,造成溢出。 例子:1. integer array1[16] FOR i = 1 to 16 array1[i] = i NEXT
8.4 powerscript语句 2.求1—16所有奇数的和 integer i,s s=0 for i=1 to 16 if Mod(i, 2)=1 then s=s+i end if next 其中mod()是powerscript的求余函数: mod(x,y) 返回x/y的余值
8.4 powerscript语句 也可以 integer i,s s=0 for i=16 to 1 step –1 if mod(i,2)=1 then s=s+i end if next 上例也可以换一种做法: integer i,s s=0 for i=1 to 16 step 2 s=s+i next
T 条件 F 执行循环体 Loop后的语句 8.4 powerscript语句 四、 DO…LOOP循环 DO…LOOP是一个通用的循环语句。它包括四种形式: 1.DO UNTIL … LOOP 根据条件执行循环体Loop后的语句FT DO UNTIL … LOOP的语法格式为: DO UNTIL 条件 循环体 LOOP
8.4 powerscript语句 • 其中条件代表循环进行的条件表达式,循环体表示循环执行的语句。DO UNTIL语句执行循环体的语句直到UNTIL后面标明的条件表达式结果为TRUE,如果在第一次该计算表达式时结果即为TRUE,则循环体中的语句不会被执行。
8.4 powerscript语句 例子:我们使用do_loop来做上述求1—16所有奇数的和 int i,s s=0 i=1 do untile i>16 s=s+i i=i+2 loop
8.4 powerscript语句 2.DO WHILE … LOOP条件执行循环体Loop后的语句TF DO WHILE … LOOP的语法格式为: DO WHILE 条件 循环体 LOOP 其中条件代表循环进行的条件表达式,循环体表示循环执行的语句。DO WHILE语句在WHILE后的表达式结果为TRUE时,执行循环体中的语句,如果第一次对表达式求值的结果即为FALSE,则循环体中的语句不会被执行。
8.4 powerscript语句 Integer i=1 Integer s=0 DO while i<=16 s=s+i i=i+2 LOOP F 条件 T 执行循环体 Loop后的语句
执行循环体 条件 F T Loop后的语句 8.4 powerscript语句 3. DO … LOOP UNTIL条件执行循环体Loop后的语句 DO … LOOP UNTIL的语法格式为: do 循环体 LOOP UNTIL 条件
8.4 powerscript语句 其中条件代表循环进行的条件表达式,循环体表示循环执行的语句。DO LOOP UNTIL语句在UNTIL后表达式结果为FALSE时执行循环体中的语句,直到表达式结果为TRUE时结束,但是循环体中的语句至少被执行一次。 Integer i=1 Integer s=0 Do s=s+i i=i+1 Loop until i>16
执行循环体 条件 T F Loop后的语句 8.4 powerscript语句 4 DO … LOOP WHILE DO … LOOP WHILE的语法格式为:条件执行循环体Loop后的语句TF DO 循环体 LOOP WHILE 条件