北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
写作说明
本电子图书由北京达通兴电脑科技开发有限公司郭宝利先生编写。该书编写,充分尊重
了 PB 初学者的需求,提炼了本人多年的开发经验,从多个角度详解介绍了 PB 的核心函数。
相信该书对 PB 初学者和部分提高者有一定的帮助。
所谓核心函数,是 PB 的常用的重要函数。随着 PB 从 3.0 到 10.0 的版本升级,这些函
数始终保留,并且部分函数的功能得到了进一步的扩充。这些函数都是核心函数。通过对这
些函数的深入掌握,不仅可以具备开发 PB 应用程序的基础,并且可以促进深刻立即 PB 编
程的核心思想,为初学者打好 PB 核心知识架构,为以后自学 PB 奠定好基础。
很多初学者刚开始自学 PB 时热情高涨,并且也感觉比较简单,但是深入者很少,至终
者更少。我认为,关键就是没有构建起 PB 核心知识架构,也就是没有抓住重点。本书的学
作目的之一就是要为初学者培养核心知识架构。
PB 的核心知识架构,除了重点函数之外,还有相关的一些开发理念,关键的开发步骤
等。在随后我公司提供的另外一本电子图书(暂定书名为《例说
会详细介绍。《例说 PB 软件项目开发》是该电子图书的姊妹篇,本电子图书中用到的函数,
在《例说 PB 软件项目开发》中的软件开发中都会用到。(题外话:《例说 PB 软件项目开发》
的特点是,以项目开发为主线组织编写,对项目开发中用到的 PB 核心知识进行详细介绍,
同时还介绍了设计工具 PowerDesigner、安装盘制作工作 InstallShield、帮助制作工具 HTML
WorkShop 等等,是软件开发人员的实用读物。)
PB 软件项目开发》)中将
本电子图书是郭宝利先生独立编写,没有参考任何网上资料。在你转载时,务必要著名
出处,并且保证该文档的完整性。对于出版图书成篇摘抄者,请务必征得本人同意。各大出
版社本人还有有若干熟悉的编辑。
鉴于本电子图书不是通过严格的 4 审出版的,本人不保证该书中存在若干别字、错字,
工作紧张,本人只是尽量减少这些错误。至于技术问题,本人都进行过认真严格的核实,以
确保本免费电子图书有较高的质量。如果你有好的意见或者建议,可以直接和我联系:
电话:010-81692157,13910229071
邮箱:gbl88@sohu.com
QQ:123367042
Skype:PowerBuilders
本人所在公司:北京达通兴电脑科技开发有限公司
另外,我公司提供 PowerBuilder 系列培训,并且承接各种软件项目,欢迎合作。详细内
容请浏览网站:www.study01job.com。
郭宝利 2005.7.2 北京
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
1. MessageBox
函数作用:显示一个信息提示窗口。该窗口中的标题、图标、内容和按钮都可以通过参数指
定。提示窗口的样式如图 1 所示。清楚了提示窗口的构成,非常有利于记忆该
函数的语法。
函数语法:MessageBox ( title, text {, icon {, button {, default } } } )
图 1 提示窗口样式
Title:窗口标题,String 类型的数据。如果该参数取值为 Null,则不显示
提示窗口。
Text:窗口中要显示的内容,String 类型的数据。如果该参数取值为 Null,
则不显示提示窗口。这两个函数是必需的,使用更多的参数可以提供更多
的控制。
Icon:窗口中显示的图标的样式,为枚举类型的数据。可用的类型和对应
的图标样式如表 1 所示:
枚举取值
图标样式
序号
1 Information!
2 StopSign!
3
4
Exclamation!
Question!
5 None!
无
Button:显示哪些命令按钮,枚举类型。可用的取值有:
OK! OKCancel!
YesNoCancel! RetryCancel!
AbortRetryIgnore!
YesNo!
Default:希望成为缺省命令按钮的编号。最左侧按钮的编号为 1,往右依
次加 1。
返 回 值:如果执行成功,则返回用户选择的命令按钮的编号(1,2 或者 3);执行失败则
返回-1;如果有参数为 Null,则函数返回 Null。
代码实例:
例子 1,最简单的用法:
MessageBox(‘提示’,’数据保存成功。’)
例子 2,3 个参数的:
MessageBox(‘提示’,’按回车键将关闭系统……’,StopSign!)
例子 3,多个命令按钮的:
integer li_flag
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
li_flag = MessageBox(‘提示’,’数据尚未保存,是否继续关闭窗口?’,&
Question!,YesNo!,2)
Choose case li_flag
Case 1 //选择‘是’,继续关闭窗口
Return 0
Case 2 //选择‘否’,不再关闭窗口
Return 1
End choose
2. SetFocus
函数作用:指定的控件或者对象获得焦点。获得焦点的对象或者标题栏为蓝色,或者控件有
明显的边框。Drawing 类型的对象不能获得焦点,所以不能在
Rectangle、RoundRectangle 等控件上使用该函数。
line、Oval、
函数语法:objectname.SetFocus ( )
其中,ObjectName 是要设置焦点的控件或者对象的名称。
返 回 值:如果执行成功,则返回 1,执行错误返回-1。如果对象 Objectname 为 Null,则返
回 Null。
代码实例:
例子 1,窗口上:
w_main.SetFocus()
例子 2,命令按钮:
cb_save.SetFocus()
例子 3,数据窗口:
dw_1.SetFocus()
3. TriggerEvent
函数作用: 触发指定对象的指定事件,并且立即执行该事件中的脚本。注意该函数和
PostEvent 的区别。PostEvent 不是立即执行,TriggerEvent 是立即执行触发事件
的脚本。
函数语法:objectname.TriggerEvent ( event {, word, long } )
objectname:PB 中任何对象或者控件,只要有可以触发的事件就可以。
event:要触发的事件。可以是枚举类型或者 String 类型。PB 提供的事件
可以使用枚举或者 String 类型来表示,比如 Clicked!或者‘Clicked’都可
以代表 Clicked 事件;自定义的用户事件只能使用 String 来表示。需要注
意的是,这里的事件应该提供了脚本。
word:该参数不是必需的。当需要传递数据给被触发的事件时使用 word
和 long 参数。这两个参数都可以传递 long 类型的数据,但是参数 long 还
可以传递 string 类型的数据,而该参数仅能传递 long 类型的。如果使用
了该参数,在被触发的事件中使用 Message.WordParm 接收传递过去的数
据。如果不使用该参数传递数据而是使用参数 long 进行传递,则将该参
数设置为 0。
long:该参数也不是必须的,用来传递 long 或者 string 类型的数据。使用
Message.LongParm 接收传递的数据。当传递
Message.LongParm 中 保 存 的 是 所 传 数 据 的 存 储 地 址 , 必 须 使 用
string(XX,’address’)来读取该地址中的 string 类型数据。
类型的数据时,对象
string
返 回 值:Integer 类型。如果返回 1,表示该函数执行成功;如果指定事件中没有脚本或者
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
函数执行错误,则返回-1。当任意参数为 Null 时,函数返回 Null。
代码实例:
例子 1,触发缺省事件:
cb_1.TriggerEvent(Clicked!)
等价于:
cb_1.TriggerEvent(“Clicked”)
例子 2,触发用户自定义事件:
w_main.TriggerEvent(“ue_open”)
例子 3,传递信息和接收信息:
w_main.TriggerEvent(“ue_open”,0,’test’)
在用户自定义事件 ue_open 中接收数据:
string ls_msg
ls_msg = String(Message.LongParm,’address’)
例子 4,传递 long 数据:
w_main.TriggerEvent(‘ue_open’,100,0)
在用户自定义事件 ue_open 中接收数据:
long ll_msg
ll_msg = Message.WordParm
4. Close
函数作用:关闭指定的窗口,并且释放窗口以及窗口上控件所占用的资源。该函数执行时,
首先执行窗口的 CloseQuery 事件脚本,然后关闭窗口,然后执行该函数所在事
件中的其它脚本。一定注意这个顺序。窗口关闭后,窗口中的属性、控件、实
例变量等都不可用。执行了该函数后,如果希望还能够阻止窗口的关闭,可以
在窗口的 CloseQuery 中返回 1。
函数语法:Close ( windowname )
windowname:要关闭的窗口的名称。
返 回 值:Integer 类型。如果返回 1,表示该函数执行成功;如果函数执行错误,则返回-1。
当任意参数为 Null 时,函数返回 Null。
代码实例:
例子 1,以下代码在命令按钮‘关闭’的 Clicked 事件中,执行会发生错误:
close(parent)
messagebox('',this.text)
//控件已经不可用,该语句执行错误。
例子 2,以下代码在窗口的 CloseQuery 事件中,当执行函数 Close 之后触发该事
件,如果用户回答为‘No’则取消关闭:
IF MessageBox('关闭', '真的要关闭吗?', Question!, YesNo!) = 2 THEN
//如果选择‘No’,则停止关闭
RETURN 1
END IF
5. SQLCA
6. connect;
7. Open
函数作用:打开指定的窗口。如果希望同一个窗口打开多个,则只能使用语法格式二。
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
函数语法:格式一:Open ( windowvar {, parent } )
格式二:Open ( windowvar, windowtype {, parent } )
windowvar:要打开的窗口名称,可以是在 Window 画板中设计的窗口的名称,
也可以是指定类型的窗口变量。
windowtype:一个 String 类型的变量,取值是已经设计好的窗口的名称。使用
该参数,直到程序运行的时候才确定要打开的窗口,所以可以提高程序的灵活
性。
parent:当 windowvar 参数指定的窗口是 Child 或者 Popup 类型时,应该指定
一个窗口作为当前 windowvar 的父窗口。如果不指定父窗口,则最近打开的窗
口作为当前打开窗口的父窗口。
返 回 值:如果执行成功,则返回 1,执行错误则返回-1,任何参数为 Null,则返回 Null。
代码实例:
例子 1,格式一:
open(w_main)
例子 2,格式一:
w_main lw_ToOpen1
w_main lw_ToOpen2
Open(lw_ToOpen1) //打开窗口 w_main
Open(lw_ToOpen2) //再打开一个 w_main 窗口
例子 3,格式一:
Open(w_msg,w_main) //打开窗口 w_msg,并且将 w_main 设置为它的父窗口
例子 4,格式二:
String ls_ToOpen
Windowlw_WinToOpen
select winname into :ls_ToOpen where ywmc = :ls_ywmc;
Open(lw_WinToOpen,ls_ToOpen)
//根据业务名称打开窗口
例子 5,格式二:
window w_stock_win[ ]
string w_stock_type[4]
w_stock_type[1] = "w_stock_wine"
w_stock_type[2] = "w_stock_scotch"
w_stock_type[3] = "w_stock_beer"
w_stock_type[4] = "w_stock_soda"
FOR n = 1 to 4
Open(w_stock_win[n], w_stock_type[n])
NEXT
8. halt close
9. ProfileString
函数作用:从指定的配置文件中获取 String 类型的数据。配置文件按照节、关键字来组织。
学习该函数,首先应该熟悉配置文件的格式。可以在你的计算机中随便查找一
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
个后缀为 ini 的文件,打开观察一下文件的格式。以下是典型的配置文件格式:
[database]
dbms=syc enterprise server
logid=sa
其中,database 为‘section’(节),dbms 为‘key’(键),syc enterprise server
是键 dbms 的取值。和该函数语法类似的还有 PorFileInt,用来从配置文件中读
取 Integer 类型的数据;函数 SetProfileString 用来设置配置文件。
函数语法:ProfileString ( filename, section, key, default )
filename:配置文件的名称,可以包含完整的路径信息。如果没有指定路径信
息,则使用操作系统的搜索路径查找指定的配置文件。不区分大小写。
section:从配置文件的指定节中读取信息。不区分大小写。
key:要读取信息的键名称。不区分大小写。
default:当指定的 filename、section、key 中任意一个没有找到时,或者读取的
数据不能转换成 string 类型时,函数则返回该参数指定的数据。
返 回 值:String 类型的数据,最长为 4096 个字节。如果能够正确读取指定配置文件中、
指定节的、指定键的取值,则返回该键的取值,否则返回参数 default 指定的数
据;如果执行错误,则返回‘’;如果任意参数为 Null,则返回 Null。
代码实例:
例子 1:
if ProfileString("C:\PROFILE.INI", "Department", "Name", "None") &
= "Marketing" then Open(w_marketing)
例子 2:
sqlca.dbms = ProfileString("setup.ini", "database", "dbms", "None")
Disconnect
IsRowModified
10.
11.
函数作用:该函数是数据窗口对象函数,不能在 PowerScript 中直接使用。该函数用来判断
指定数据行的数据是否被修改过,通常只在 Detail 节中使用该函数。经常在计
算域中使用该函数,根据返回值决定计算域中显示的内容;也可以为列的某属
性设置表达式,使用该函数,比如设置列的背景颜色时使用该函数,可以让修
改过的数据和没有修改过的显示不同的背景颜色。
函数语法:IsRowModified({rowno})
rowno:可选参数,要判断数据是否修改过的数据行的行号。如果省略该参
数,则用来判断计算列所在的数据行。
返 回 值:Boolean 类型。如果数据修改过,则返回 True,否则返回 False。
代码实例:
例子 1:
IsRowModified()
上面代码等价于:
IsRowModified(GetRow())
12. IsRowNew
函数作用:该函数是数据窗口对象函数,不能在 PowerScript 中直接使用。该函数用来判断
指定数据行的数据是否是新数据行,通常只在 Detail 节中使用该函数。经常在
计算域中使用该函数,根据返回值决定计算域中显示的内容;也可以为列的某
属性设置表达式,使用该函数,比如设置列的背景颜色时使用该函数,可以让
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
新增加的数据行和老的数据行显示不同的背景颜色。
函数语法:IsRowNew({rowno})
rowno:可选参数,要判断数据是否新增加的数据行的行号。如果省略该参
数,则用来判断计算列所在的数据行。
返 回 值:Boolean 类型。如果是新增加的数据行,则返回 True,否则返回 False。
代码实例:
例子 1:
IsRowNedw()
上面代码等价于:
IsRowNew(GetRow())
13. 数据窗口中的 if 函数
函数作用:根据条件表达式的取值,返回特定的参数。
函数语法:If ( boolean, truevalue, falsevalue )
boolean:返回值为 Boolean 类型的表达式。
truevalue:当参数 boolean 取值为 True 时,函数 if 返回该参数的取值,可以
是任意标准数据类型。但是,具体类型根据该表达式所在位置而定。比如,
该表达式是在字段的 protect 属性上,则该参数取值为 0 或者 1 应该是合理
的。
falsevalue:当参数 boolean 取值为 False 时,函数 if 返回该参数的取值,可
以是任意标准数据类型。但是,具体类型根据该表达式所在位置而定。注
意,该参数的数据类型和 truevalue 的数据类型应该是一致的。
返 回 值:返回值类型为参数 truevalue 或者 falsevalue 类型的数据,返回值或者是 truevalue
或者是 falsevalue。两个参数的类型是相同的。
代码实例:
例子 1,设置背景颜色。如果数据行修改过,则背景设置为红色,否则设置为灰色:
if(IsRowModified(),rgb(255,0,0),rgb(192,192,192))
例子 2,设置数据行的修改状态。用下面的表达式创建一个计算列:
if(IsRowNew(),’新’,if(isRowModified(),’改’,’旧’))
14. error
15. Choose Case
16.
insertrow
函数作用:在指定的数据窗口控件或者 DataStore 中插入一条数据。如果列定义了缺省值,
则在显示新插入的数据行之前自动设置这些列的缺省值。该函数仅仅新插入一
行新数据行,不会改变当前数据行,并且也不会改变数据窗口中数据行的显示
情况。如果要改变当前数据行,或者跳转到新的数据行,则需要调用函数 SetRow
或者 ScrollToRow。
函数语法:long dwcontrol.InsertRow ( long row )
dwcontrol:要插入数据的数据窗口控件、DataStore 或者子数据窗口。
row:在该数据行之前插入新的数据行。如果希望在最后插入数据,则将该参
数设置为 0 即可。
返 回 值:long 类型,新插入的数据行的行号。如果执行错误,则返回-1;如果任意一个参
数为 Null,则返回 Null。
代码实例:
例子 1,在当前数据行之前插入一行数据:
北京达通兴电脑科技开发有限公司
电话:010-62921594,010-81692157 传真:010-62921594
通信地址:北京市海淀区小营桥北行 300 米路东金凤来招待所 026、031 室 联系人:郭宝利
公司网址:www.study01job.com 提供专业 PB 培训 承接各种软件项目 13910229071
dw_1.InsertRow(dw_1.GetRow())
例子 2,在最后插入数据行,并且跳转到新插入的数据行:
long ll_newrow
ll_newrow = dw_employee.InsertRow(0)
dw_employee.ScrollToRow(ll_newrow)
setitem
17.
函数作用:给指定的数据窗口或者 Datastore 中的、指定单元设置数据,通过行和列来确定
哪个单元。该函数直接修改缓冲区中的数据,而不是针对显示界面进行修改,
修改成功之后,数据窗口控件上会自动反映出最新的内容来。而函数 SetText 则
针对显示界面进行修改,如果能够通过字段的校验规则,才能够进入到数据窗
口对应的缓冲区中。注意这两个函数的区别。
函数语法:integer dwcontrol.SetItem ( long row, integer column, any value )
integer dwcontrol.SetItem ( long row, string column, any value )
dwcontrol:要设置数据的数据窗口控件、DataStore 或者子数据窗口的名称。
row:要设置数据的行,为 long 类型。
column:要设置数据的列,可以是
是
类型的列号。
value:要设置的数据。类型根据数据列而定,两者的数据类型应该保持一
致。
integer
string
类型的列名称,也可以
返 回 值:integer 类型,1 表示函数执行成功,-1 表示函数执行失败。如果有任意一个参数
为 Null,则函数返回 Null。
代码实例:
例子 1,下面脚本在第一行的 hire_date 列中设置数据:
dw_order.SetItem(1, "hire_date", 1993-06-07)
例子 2,当用户在数值类型的字段中输入内容,然后又删除后要离开该单元时,数
据窗口尝试着将‘’赋值给该单元,这时会导致内容不能通过校验规则而产生错
误。解决的办法就是在数据窗口控件的 ItemError 事件中编写下面的脚本:
integer li_Null
String ls_type
ls_type = This.Describe(dwo.name + '.ColType')
ls_type = Left(Lower(Trim(ls_type)),3)
choose case ls_type
case 'dec','int','lon','num','rea','ulo'
This.SetItem(Row,integer(dwo.ID),li_Null)
end choose
return 2
18. Print
函数作用:将数据窗口或者 DataStore 中的数据作为一个打印任务发送到打印机。使用这里
的语法格式进行数据窗口打印,将自动创建打印任务。在该函数执行后、将要
将数据发送到打印机时触发 PrintStart 事件,每打印完一页后都会触发 PrintPage