前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

第3章 PowerBuilder编程 第3章 PowerBuilder编程 返回主页 上一章 下一章 3.1 PowerScript基本概念 3.2 数据类型 3.3 声明 3.4 运算符和表达式 3.5 基本语句 3.6 函数 3.7 结构 3.8 编写脚本 ☆进入DOS状态 ☆写字版 ☆绘图板 ☆进入Editplus 3.1 PowerScript基本概念 本章开头 下一节 PowerBuilder 中使用的编程语言是PowerScript。它不是简单的第四代语言,而是一种高级的结构化的编程语言。我们使用PowerScript 编写应用程序中,使用的函数和事件处理程序。如果以前你使用过其他高级语言的话就会发现PowerScript 十分简单易学。它的许多语言成份与大多数高级编程语言很相似,比如PowerScript 和C C++均使用//和/**/来注释程序行。 书写PowerScript 程序时格式相当自由,每一行中的空格缩进等均被编译器忽略。利用这个特性我们可以编写出结构清晰易于阅读和理解的应用程序。 PowerScript 与众不同之处在于它提供了一套完整的嵌入式SQL 语句,开发人员能够像使用其他语言成分比如赋值语句那样使用它们,而且需要的话也可以使用特定数据库管理系统专用的SQL 语句,这就大大增强了程序操纵和访问数据库的能力。需要嵌入式SQL 语句时,无须逐字键入,你可以利用PowerBuilder 提供的可视化工具生成嵌入式SQL语句,然后把它粘贴到程序中。 丰富的数据类型和众多的函数,进一步提高了PowerBuilder 8 的适应性和灵活性。 PowerScript 不仅支持常规的数据类型,同时也支持用于处理多媒体数据的二进制大对象。当然它也完全支持对象类型。 在代码编写方面,PowerBuilder 8 提供了许多增强功能,比如开发人员期待已久的自动代码补充功能、编程窗口中的上下文相关帮助功能,实现了新的例外处理语句,给开发人员提供了处理例外错误的新途径此外PowerBuilder 8 还提供了拖放编写代码特性,进一步提高了应用程序的开发效率。 总而言之,熟练地掌握PowerScript 语言,是灵活高效地开发高质量PowerBuilder 应用程序的基本要求。本章介绍PowerScript 语言的概念语法以及用法。 3.1.1 注解 注解行用来书写说明,它有两种写法: 以“//”开头,其后书写注释内容,常用于单行注释。 “/*…*/”中间的部分为注释,便于多行说明。 例如: //这是一个单行注释 Integer i i = i+1 /*这是多行注释 这是多行注释 这是多行注释 这是多行注释*/ 3.1.2 标识符 标识符是指在脚本中使用的变量、标号、窗口、控制、菜单以及引用的对象的名称。它的命名规则有: 1.必须一字母开头 2.最长40个字符,并且中间不能插入空格。 3.不区分大小写,但为了写作规范,最好按照PB习惯,一个标识符中既有大写也有小写,使程序可读性增强。 4.表示符可以有字母、数字和如下的特殊字符组成:短划线“-”、下划线“_”、美元符号“$”,号码符号“#”和百分符号“%”。 例如:butName,main_win,code2都是合适的标识符。 3.1.3 特殊字符 在字符串当中可以包括特殊字符。它们的写法如下: 新行(NEWLINE):~n 制表符(TAB):~t 垂直制表(VERTICAL TAB):~v 回车(CARRIGE RETURN):~r 换页(FORMFEED):~f 退格(BACKSPACE):~b 双引号:~" 单引号:~' 弯曲符:~~ 3.1.4 保留字 保留字是指被POWER BUILDER内部使用,而不能作为标识符的单字,它们有: alias,and,autoinstantiate,call,case,choose,close,commit,connect,constant,continue, create,cursor,declare,delete,describe,descriptor,destroy,disconnect,do,dynamic,else, elseif,end,enumerated,event,execute,exit,external,false,fetch,first,for,forward,from, function,global,goto,halt,if,immediate,indirect,insert,into,intrinsic,is,last,library, loop,next,not,of,on,open,or,parent,post,prepare,prior,private,privateread,privatewrite, procedure,protected,protectread,protectwrite,prototypes,public,readonly,ref,return, rollback,rpcfunc,select,selectblob,shared,static,step,subroutine,super,ssytem, systemread,systemwrite,then,this,to,trigger,true,type,until,update,updateblob,using, varibles,while,with,within,_debug 3.1.5 代词 3.1.5.1 this 代名词this代表窗口、用户对象、菜单、应用对象或者控制对象自身。比方说,在一个静态文本控件的click事件脚本中敲入这样的代码: this.text="您好",静态文本上面的文本就会改变为“您好”。 3.1.5.2 Parent Parent可以在窗口的控制、用户定制对象和菜单的程序中使用。当在窗口的控制当中使用Parent的时候,Parent指向包容该控制的窗口。比方说如果把下面的语句写入某窗口的一个按钮的CLICKED事件的脚本当中的话,那么在用户单击这个按钮的时候,就会关闭这个窗口。 3.1.5.3 ParentWindow ParentWindow只能在菜单的脚本当中使用,它代表运行时菜单所在的窗口,例如:在一条菜单命令的脚本中输入这样的代码的话将会关闭菜单所在的窗口。 Close(ParentWindow) 3.1.5.4 Super 在编写控制或者对象的子对象的脚本的时候,可以调用祖先的脚本,用户可以直接使用祖先对象的名称调用它们,也可以使用Super来引用直接双亲。例如要调用父类的Clicked事件可以这样写: CALL Super::Clicked 需要注意的是,用户只能在祖先的直接后代的函数和事件当中使用Super,否则编译器将返回语法错误。 调用父类对象函数的语法为: Super::函数名(参数) 调用父类事件的语法为: Call Super::事件名 或 Super::Event 事件名 3.1.6 续行和断句 大多数情况之下,每一条语句占据一行,可以有的时候会遇到语句超长或者希望多写几行的情况,这时就需要用到续行符&如果行尾的字符恰好是&,那么下一行自动是本行的继续行。 例子: IF num1 = 5 AND & num2 = 6 THEN num3 = 7 如果要将一个长字符串分为多行的时候,仅仅需要在行末加入&,编译器就会认为下一行的内容也是这个字符串的内容。 例子: astring = abcdefghi& jklmnopqrstuvwxyz 需要注意的是使用这种方法将会把续行符前面的和继续行初始处的空格或者TAB都作为字符串的的一部分,如果希望避免这种情况,可以使用下面的这种格式: astring = abcdefghi& +jklmnopqrstuvwxyz 3.1.7 语句分隔符 我们提倡一行写一条语句。如果一行要写多条语句,可以用语句分隔符“;”,即英文分号。如: a=2;b=3;c=4;d=a+b+c+d 3.1.8 空值 空值(NULL)是在与数据库交换数据的时候使用的一种特殊值。这与空字符、数值零、和日期00-00-00-00不同。空值既不是零,也不是非零的任何数值。PowerBuilder的所有数据类型都支持空值,但PowerBuilder并不将空值作为缺省值,例如,说明变量时,PowerBuilder把0赋给数值型变量,把False赋给布尔型变量,把空串("")赋给字符串变量。变量被赋予空值的途径有两条:1、从数据库中读到空值;2、使用SetNull()函数赋值。 3.2 数据类型 上一节 下一节 本章开头 与其他编程语言相似,PowerBuilder 8 也有数据类型的概念,并且数据类型十分丰富,包括标准数据类型、Any 数据类型、系统对象数据类型和枚举类型四大类。程序中通过数据类型限定变量的取值范围。在PowerScript 中我们使用数据类型来说明变量或数组。实际上每个变量都有所属的数据类型。 3.2.1 标准数据类型 PowerBuilder 支持的标准数据类型共有14 种如下表所示: 在访问数据库中的数据时,要注意PowerBuilder数据类型与数据库数据类型的匹配,同样的名称两者的取值范围可能不同,例如,在Microsoft SQL Server中,Integer类型定义为32位带符号整数,范围从-2,147,483,648到+2,147,483,647,而PowerBuilder中,Integer类型定义为16位带符号整数,范围从-32768到+32767。实际上SQL Server的Integer类型定义与PowerBuilder的Long数据类型相匹配。 除了上面讲到的标准数据类型外,PowerBuilder还提供了一个Any类型,Any类型是种可变的数据类型,它像变色龙一样,程序中给它赋什么类型的值,它将变成什么类型。Any类型可以接受标准数据类型、结构类型、对象、以及数组等各种类型。 与说明标准数据类型的变量相似,说明Any类型变量。要想知道Any类型变量中保存数据的类型,可以使用函数ClassName(),例如: any la_spreadsheetdata//说明Any类型变量 la_spreadsheetdata = ole_1.Object.cells(1,1).value //赋值 CHOOSE CASE ClassName(la_spreadsheetdata) //判断Any类型变量的数据类型 CASE "integer" ... CASE "string" ... END CHOOSE Any类型虽然增加了灵活性,但同时也存在一些潜在的不安全因素。使用Any类型时应该注意如下几点:Any类型变量参加运算时,必须保证其值的数据类型正确且符合运算符的要求,例如,A、B、C是三个Any类型的变量,下述语句: Any C C=A+B 在A、B的值类型同为数值或字符串时,语句能够正确执行;如果其中一个为数值,另一个为字符串,程序在运行时将出错。 在使用Any类型变量前必须首先赋值。 当函数原型中不允许Any类型作为函数参数时,需要使用数据类型转换函数进行类型转换,否则,即使Any类型变量中包含正确类型的数据,也将产生诸如“ Unknown function”或“Function not found”之类的编译错误,原因在于PowerBuilder是面向对象的编程环境,它通过函数名、参数类型和参数个数来确定将使用哪个函数。 对已知数据类型的变量,应该避免使用Any类型,原因是: 1、对Any类型变量,PowerBuilder在运行时而不是编译时确定变量的实际类型,因此将耗费更长的时间,影响程序运行效率,特别是在循环体中使用Any类型变量时更是如此; 2、编译器不对Any类型进行正确性检查,错误只在运行时才会发现,而运行时期的错误难以查找出错原因。 3.2.2 系统对象数据类型 在PowerBuilder 中,窗口、菜单、各种控件都是系统对象,每一种系统对象实际上都是定义在PowerBuilder 内部的一种数据类型。一般情况下,我们不必把这些对象当作数据类型来考虑,而只需在相应画笔中定义它们即可。 利用系统对象类型可以说明对象数据类型变量,例如: window mywin //说明窗口变量 menu mymenu //说明菜单对象变量 如果窗口中有多个按钮,你的应用程序需要跟踪用户最近单击的按钮时,可以按下述方式编写程序: // 在窗口中说明实例变量LastClicked commandbutton LastClicked // 在窗口上每个按钮的Clicked事件处理程序中写上如下代码 // 登记用户最近单击的按钮 LastClicked = This 要想查看PowerBuilder都支持那些系统对象以及它们之间的继承关系,使用对象浏览器(Object Browser)是条简单有效的途径。查看系统对象继承关系的方法是: 1.单击画笔栏的“Browser(对象浏览器)”图标,系统打开“Browser”对话框; 2.单击“System”标签; 3.右击左边的列表框,系统显示一个弹出菜单; 4.选择“Show Hierarchy”菜单项; 5.再次右击左边的列表框,从弹出菜单选择“Expand All”菜单项,系统显示各对象的继承关系。 3.2.3 枚举类型 枚举类型是PowerBuilder 定义的特殊常量,常用于系统定义函数的参数,也能够用于指定对象或控件的属性。与其它编程语言(比如C或C++)不同,在PowerBuilder 中开发人员不能定义自己的枚举类型,而只能按系统要求使用它。枚举类型实际上是一组值,每个值都以英文单词开始,以感叹号(!)结束,例如,定义多行编辑框对齐方式的枚举类型为Alignment ,其取值为: Center! Justify! Left! Right! 程序中可以使用赋值语句给Alignment类型的变量或属性赋值,例如,下述语句将多行编辑框mle_1的对齐方式设置为居中对齐: mle_1.Alignment = Center! 使用枚举类型的好处是直观、准确,便于编译器进行强数据类型检查。查看系统都有哪些枚举值的方法是: 1.单击画笔栏的“Browser(对象浏览器)”图标,系统打开“Browser”对话框; 2.单击“Enumerated”标签,系统分类列出各种枚举类别; 3.在左边列表框中选择要查看的枚举值类别,然后双击右边树型列表中的“Properties”,该类别的枚举值即被显示出来。 3.3 声明 上一节 下一节 本章开头 PowerBuilder中,在使用变量之前,都要首先予以说明。变量说明的格式很简单,语法为: 数据类型 变量名[=初值][,变量名[=初值] ?] 一次说明多个变量时,变量名之间用逗号(,)分隔,变量名用前面讲到的标识符表示。例如, Integer 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,其初值使用字符串类型变量的缺省值空串("") Blob型变量说明的语法为: Blob [{大小}] 变量名 说明Blob型变量时,可用大括号括起一个整数,该整数指明Blob变量以字节为单位的长度,缺省该项时,默认长度为0,且系统会根据实际数据自动调整其长度。例如: blob{100} ib_Emp_Picture //说明一个长度为100的blob型实例变量 blob ib_Picture //说明一个缺省长度为0的blob型变量 需要注意的是,blob型变量不能设置初值。 Dec型变量说明的语法为: Dec| Decimal [{精度}] 变量名[=初值] 其中,精度是个整数,指定小数点后的数字位数,如果未指定精度,则以赋值时给定精度为准。例如: decimal{2} sc_Amount //小数点后两位数字 dec{4} lc_Rate1, lc_Rate2 //说明两个小数点后四位数字的变量 dec lc_Result //说明一个精度未定的变量 lc_Result = sc_Amount*sc_Amount //变量lc_Result的精度成为小数点后四位数字 PowerBuilder 中,我们也可以使用数组,数组代表一系列具有相同类型的变量,它们共用一个变量名,通过下标访问数组中的每个元素。要说明一个数组变量,只需在标识符后跟上方括号,方括号内填上数组元素个数即可,例如: 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} 动态数组可按相同的方法赋初值。 数组中,大括号只能用于赋值,不能用于比较操作,下面的比较方法是错误的: Integer anArray[3] = {1,2,3} If anArray = {1,2,3} Then ... End If 纠正上述错误的方法之一是说明另外一个数组,然后进行比较,例如: Integer anArray[3] = {1,2,3} Integer anArgs[3] = {2,3,4} If anArray = anArgs Then ... End If 变量的作用域 作用域定义变量在什么范围内有效。PowerBuilder的变量作用域共有四种:全局变量、实例变量、共享变量和局部变量。不同作用域的变量需要在不同的位置说明,下面分别予以介绍。在编程窗口、窗口画笔、用户对象画笔或菜单画笔中,选择“Declare”菜单中的“Global Variables”、“Instance Variables”和“Shared Variables”可以分别声明全局、实例和共享这三类变量。 全局变量 全局变量在整个应用程序中都可访问,它的作用域是整个应用程序 。 实例变量 实例变量与对象相关联,只有在该对象的事件处理程序或函数中才能使用为该对象定义的实例变量。实例变量在它所关联的对象被打开时创建,被关闭时消失。 共享变量 共享变量是一种静态变量,这不仅意味着它所在的对象关闭后再次打开时,共享变量依然保持对象关闭时的值,而且还意味着同一个类多个实例中的同名共享变量保持相同的值。 局部变量 局部变量在使用它的事件处理程序或函数中说明,其作用域仅限于说明它的程序段,在该程序段的任何地方均可访问局部变量,但其它程序段都不能访问本程序段中的局部变量。运行程序后,进入某个程序段时,系统自动为局部变量分配内存,退出程序段时,局部变量占用的内存被释放。 3.4 运算符和表达式 上一节 下一节 本章开头 运算符代表了符号化的运算,PowerScript利用运算符构成表达式,完成一定的运算。PowerScript支持的运算符可分为四种类型: 算术运算符 关系运算符 逻辑运算符 连接运算符 与我们日常使用的四则运算符相似,运算符也有优先级,运算符的优先级定义表达式的运算次序。下面介绍PowerScript运算符及其优先级。 3.4.1 算术运算符 算术运算符用于完成数学运算。下表列出了PowerScript算术运算符及其示例。 为了书写方便和提高程序的运行效率,PowerScript还提供了一组扩展的算术运算符(与C++中使用的算术运算符相同),它们只需要一个操作数,下表列出了PowerScript扩展算术运算符及其示例。 如果PB.INI文件[pb]节中DashesInIdentifiers选项等于1(这是PowerBuilder的缺省设置),在使用减号(-)、负号(-)、减1(--)运算符时,必须在这些运算符的两边都加上个空格,否则将产生编译错误,原因在于PowerBuilder把这些符号当成了标识符的一部分,将它们解释成了变量名。 3.4.2 关系运算符 关系运算符用于比较两个操作数(可以是数值类型,也可以是其它数据类型),比较的结果为下述三个值之一:TRUE、FALSE、NULL。下表列出了PowerScript关系运算符及其示例。 关系运算符不仅能够用于数值比较,而且同样可以应用于字符串的比较。字符串比较时,一个字符一个字符地按字符的ASCII码比较大小。例如,逻辑表达式: "abc"="abc" 的运算结果为True,逻辑表达式: "abc"="Abc" 的运算结果为False。 在进行字符串比较时,应该注意到这些运算符进行的是区分大小写的比较,也就是说,"A"不等于"a"。需要时可使用PowerScript的字符串操作函数进行适当的转换,这类函数包括:Upper()——转换成大写、Lower()——转换成小写、RightTrim()——删除右部空白、LeftTrim()——删除左部空白、Trim()——删除两端空白。 3.4.3 逻辑运算符 逻辑运算符用于构成其结果为TRUE或FALSE的逻辑表达式。 下表列出了PowerScript逻辑运算符及其示例。 3.4.4 连接运算符 连接运算符只有一个,就是符号“+”,用于把两个String型或Blob型变量的内容连接在一起,形成新的字符串或Blob型数据。例如: string TestTest = "北京" + "海淀" // Test中包含"北京海淀" string Lname, Fname, FullNameFullName = Lname + ', ' + Fname //在两个字符串中间加上逗号。 下面的例子从文件中读取Blob型数据,并把结果拼在一起: integer i, fnum, loops blob tot_b, b FOR i = 1 to loops bytes_read = File Read(fnum, b) tot_b = tot_b + b NEXT 3.4.5 运算符的优先级 在表达式中,运算按运算符的特定次序进行,这一次序就是运算符的优先级。当然,使用括号可以改变表达式的运算次序,下表列出了运算符的优先级。 3.5 基本语句 上一节 下一节 本章开头 3.5.1 赋值语句 赋值语句可以把一个表达式的结果或者变量和常量的值,赋给一个变量或者对象的属性或成员变量。赋值语句的格式是: variablename = expression 其中variablename代表变量名,expression代表表达式,它将表达式的值赋给等号左边的变量。例如: string = abc ainteger = 6 使用赋值语句也可以为数组变量赋值。例如: integer aarray[] aarray = {1,2,3,4,5,6} 在变量和数组之间也可以使用赋值语句复制数据: array1 = array2 POWER BUILDER也提供了一些类似于C语言的单目运算符。我们使用一个表格进行说明: 运算符 例子 等价于 ++ I++ I = I + 1 -- I-- I = I - 1 += I+=6 I = I + 6 -= I-=6 I = I - 6 *= I*=6 I = I * 6 /= I/=6 I = I / 6 ^= I^=6 I = I ^ 6 3.5.2 条件语句 IF … THEN 语句是一个选择分支结构。它有单行和多行两种格式。 3.5.2.1 单行IF … THEN语句 单行IF … THEN语句的语法格式为: IF condition THEN action1 [ELSE action2] 其中condition 是一条表达式,action1和action2是一条语句。如果condition结果为TRUE,action1将被执行,否则action2将被执行。例如: IF BOOL THEN NUM = 1 ELSE NUM = 2 3.5.2.2 多行IF …THEN语句 多行IF … THEN语句的语法格式为: IF condition1 THEN action1 [ELSEIF condition2 THEN action2 …] [ELSE action3] END IF 其中condition1和condition2是条件表达式,action1、action2和action3是一条或者多条语句。 本语句的执行过程为:计算条件表达式condition1,如果它的结果为TRUE,则执行action1,然后略过在它后面在END IF之前的语句,离开IF...THEN语句;如果condition1的值为FALSE,则计算条件表达式condition2, 如果结果为TRUE,则执行action2,然后略过在它后面和END IF之前的语句,……,如果条件表达式的结果都为FALSE,并存在ELSE子句,则action3被执行。 例子: IF BOOL1 THEN NUM = 1 ELSEIF BOOL2 THEN NUM =2 ELSE NUM = 3 END IF 3.5.3 多重分支语句 CHOOSE CASE控制结构根据测试值决定程序执行方向,它是一个条件多分支结构。CHOOSE CASE的语法格式为: CHOOSE CASE testexpression CASE expressionlist Statement [CASE expressionlist Statement ......] [CASE ELSE Statement] END CHOOSE testtexpression代表测试值,不同的测试值引发不同的语句的执行。expressionlist代表判断表达式,它可以用以下的几种形式: 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后面的语句。 例子: CHOOSE CASE num CASE 6 num = 7 CASE IS> 36 num = 36 CASE ELSE num = 56 END CHOOSE 3.5.4 循环语句 3.5.4.1 FOR NEXT FOR...NEXT是一个计数循环体。使用该语句可以是循环体中的语句被执行规定的次数。该语句的语法格式为: FOR varname = start TO end [step increment] statement NEXT 其中,varname 代表循环变量,start、end分别为初值和终值,increment为步长增量,缺省值为1。在使用FOR NEXT语句的时候应该注意,varname是integer型,end0的值不能取得过大,以防超出integer的取值范围,造成溢出。 例子: integer array1[16] FOR I = 1 to 16 array1[I] = I NEXT 3.5.4.2 DO…LOOP DO…LOOP是一个通用的循环语句。它包括四种形式: 1 DO UNTIL … LOOP DO UNTIL … LOOP的语法格式为: DO UNTIL condition statements LOOP 其中condition代表循环进行的条件,statements表示循环执行的语句。DO UNTIL语句执行循环体的语句直到UNTIL后面标明的条件表达式结果为TRUE,如果在第一次该计算表达式时结果即为FALSE,则循环体中的语句不会被执行。 2 DO WHILE … LOOP DO WHILE … LOOP的语法格式为: DO WHILE condition statements LOOP 其中condition代表循环进行的条件,statements表示循环执行的语句。DO WHILE语句在WHILE后的表达式结果为TRUE时,执行循环体中的语句,如果第一次对表达式求值的结果即为FALSE,则循环体中的语句不会被执行。 3 DO … LOOP UNTIL DO … LOOP UNTIL的语法格式为: DO statements LOOP UNTIL condition 其中condition代表循环进行的条件,statements表示循环执行的语句。LOOP UNTIL语句在UNTIL后表达式结果为FALSE是执行循环体中的语句,直到表达式结果为TRUE时结束,但是循环体中的语句至少被执行一次。 4 DO … LOOP WHILE DO … LOOP WHILE的语法格式为: DO statements LOOP WHILE condition 其中condition代表循环进行的条件,statements表示循环执行的语句。LOOP WHILE 语句当WHILE后面的条件表达式的结果为TRUE的时候,执行循环体中的语句,如果表达式计算结果为FALSE,循环结束,但至少被执行一次。 3.5.4.3 CONTINUE 在DO…LOOP或者FOR…NEXT语句循环体当中,遇到CONTINUE语句的时候,将不执行在CONTINUE后面和循环结束之前的语句,开始新一轮循环。例如在下面的例子中,如果NUM1的值大于36,则执行函数FUNCTION1。 FOR NUM1 = 1 TO 56 IF NUM1 <= 36 THEN FUNCTION1()ELSE & CONTINUE NEXT 3.5.4.4 EXIT语句 在DO...LOOP或者FOR...NEXT语句循环体当中,使用EXIT可以跳出循环。 例子 FOR I = 1 TO 36 IF ARRAY[I] THEN EXIT NEXT 3.5.6 GOTO语句 GOTO语句控制程序流程,其语法格式如下: GOTO Label 其中label代表语句标号,其命名应符合标号的命名规则。 例子: LABEL1: NUM ++ …… GOTO LABEL1 3.5.7 CREATE和DESTROY语句 3.5.7.1 CREATE CREATE语句生成对象实例变量,在生成以后,可以用点运算符引用对象的成员。CREATE语句返回一个可在变量中保存的对象实例句柄。CREATE语句有两种语法格式: objectvariable = CREATE objecttype objectvariable = CREATE USING objecttypestring objectvariable 持有该对象实例,objecttype代表对象类型,objecttypestring是保存需要创建的对象类型名称的字符串。 使用CREATE语句可以创建包括标准类用户对象在内的类用户对象,例如mailSession或者Transaction对象。不过,系统已经为标准用户对象Message、Error、Transaction、DynamicDescriptionArea、DynamicStagingArea提供了一个实例,如果需要多于一个的的实例,可以使用CREATE语句创立更多的实例。 标准数据类型和结构体不用CREATE创立。当对象的AutoInstantiate属性被设置为TRUE的时候,不需要使用CREATE语句。可视对象实例不使用CREATE语句创立,而使用OPEN函数。使用CREATE语句的第二种语法格式可以在应用中动态地选择对象类型,并创建它的实例。通常在使用继承对象实例初始化祖先对象的时候,使用此CREATE语句格式, 使用CREATE语句创建实例对象,在使用完该对象之后,要用DESTROY命令销毁对象实例。 例子: torus obj1,obj2 torus_ancestor obj_ancestor obj1 = CREATE torus obj2 = CREATE torus obj_ancestor = CREATE USING obj1 3.5.7.2 DESTROY DESTROY语句释放由CREATE创建的实例,释放之后该对象实例不能再被引用。DESTROY语句的语法格式为: DESTROY OBJName 需要注意的是,在某些情况之下,用户可能需要销毁自己并未创建的Dwobject或者OLEObject对象实例。其原因是:在引用到DataWindow、DWojbect或者OLEObject对象的成员函数或者属性的时候,POWER BUILDER会动态地创立和释放响应对象实例,但是如果用户自己建立了对嵌入对象的引用,而不是调用其本身的成员函数和属性的话,等于重载了内部动态对象,因此用户需要负责释放该对象。 3.5.8 HALT语句 HALT语句用于终止应用程序的运行。该语句的语法为: HALT [CLOSE] 遇到不包含CLOSE选项的HALT语句时,应用程序立即终止。当包含CLOSE的时候,应用先执行CLOSE事件所对应的处理程序,然后再终止应用程序。 3.5.9 RETURN语句 RETURN语句用于从脚本中返回调用程序。其语法格式为: RETURN [EXPRESSION] 其中EXPRESSION代表该脚本的返回值。 3.6 函数和事件 上一节 下一节 本章开头 3.6.1 函数和事件的基本概念 1 事件:对象或控件内可以触发一段程序的一个动作。(用户事件、系统或内置事件) 2 函数:是完成一个特定处理的程序或子程序。(系统函数、对象函数、用户定义函数、) 全局函数、局部外部函数、全局外部函数、远程过程调用 3 事件和函数的比较 相同点 1 都有参数和返回值。 2 静态或动态调用对象的函数和事件(全局或系统函数不能动态调用)。 不同点 事件只与对象相关,函数可以是全局的,也可以是对象的一部分。 调用一个未定义的事件不会产生错误,调用一个未定义函数会产生错误。 函数可以限定访问级别,事件不可以。 覆盖祖先的函数必须重定义。 3.6.2 调用函数和事件 调用函数和事件的语法格式是: {对象名.} {type} {calltype} {when} name ({参数}) 其中: Type: function/event Calltype:static/dynamic When: trigger/post 例如: charnum = Asc(“x”) //字符x的ascii值转换为整数 rb_1.event clicked() Parent.f1() 3.6.3 调用祖先对象中的函数和事件 语法格式为: Super::wf_myfunc() W_ancestor::event closequery() 3.6.4 关于系统函数 数值函数 字符串函数 日期时间函授数 Blob函数 文件操作函数 …(参见P80-81) 3.7 结构和对象 上一节 下一节 本章开头 3.7.1 结构 由一组类型不同的变量组成,并统一命名。组成结构的各个变量称为结构的分量。 结构分量是标准数据类型、对象类型或另一结构。 结构变量 定义的结构作为新的数据类型,用来定义结构变量 结构名 结构变量名 str_emp s_emp1, s_emp2 3.4.2 对象 对象是面向对象程序设计的核心概念。一个对象可以拥有若干属性,以及一系列的对这些属性进行操作的方法。一个对象可以通过若干个接口同其它的对象进行相互的作用,共同完成一项工作。当对象被定义好之后,它就拥有了活力,就能够完成一定的功能。我们给出一个对象的定义之后,就可以根据需要多次使用,而不需要做任何额外的工作,这就大大提高了脚本的重用性和易维护性。POWER BUILDER 提供了用户对象这个特性,很好的支持了对象化程序设计。 PB对象分为: 系统对象(可视对象、非可视对象) 用户对象(可视对象、非可视对象) 在PB上选择“新建”,再选择PB OBject选项卡,如图 双击相应的图标,可以开始建立对应的用户对象。 可视用户对象是具有某些特点的可重用的控件或控件的集合(标准standard、定制custom、外部external)。所谓可视用户对象就是可重用的具有某种行为的一个或一组控件。下面举一个例子,定义一个用户对象。 除了可视的用户对象之外,PowerBuilder还提供了一种不可视的用户对象:类用户对象。它也具有非常广泛的应用领域。比方说,在制作一个商用数据库软件的时候,经常会使用某些商业规则对数据进行重复地计算和处理。如果我们定义一个用户对象,由它来管理这套数据处理的办法,那就会使程序的设计工作方便很多。 3.8 编写脚本 上一节 本章开头 通过前面的例子我们已经基本知道怎样编写脚本。这里只作课堂演示 (课堂演示) 返回主页 上一章 下一章