powerbuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf ·...

220
高职高专计算机系列规划教材 PowerBuilder 9.0 基础 王宝和 主编 Publishing House of Electronics Industry 北京·BEIJING

Upload: others

Post on 09-Apr-2020

24 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

高职高专计算机系列规划教材

PowerBuilder 9.0 基础教程

王宝和 主编

Publishing House of Electronics Industry

北京·BEIJING

Page 2: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

内 容 简 介

本书结合 PowerBuilder 9.0 应用系统实例,介绍了 PowerBuilder 9.0 的基础知识、实用技巧以及应用系统

的开发方法。

本书内容主要包括:PowerBuilder 的开发环境,数据库、应用程序对象、用户对象的创建,菜单、窗口

与窗口控件、数据窗口与数据窗口控件、数据管道等 PowerBuilder 对象的创建和使用。此外,本书还介绍了

PowerScript 语言以及 SQL 语句和应用程序的调试与发行等。

本书内容面向初学者,不仅适合作为高职高专教育教材,而且适合作为职业培训教材以及程序设计人员

的参考资料。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。

图书在版编目(CIP)数据

PowerBuilder 9.0 基础教程/王宝和主编.—北京:电子工业出版社,2004.8

(高职高专计算机系列规划教材)

ISBN 7-121-00023-7

Ⅰ.P⋯ Ⅱ.王⋯ Ⅲ.数据库系统—软件工具,PowerBuilder 9.0�—�教材 Ⅳ. TP311.56

中国版本图书馆 CIP 数据核字(2004)第 076257 号

责任编辑:王沈平

印 刷:

出版发行:电子工业出版社

北京市海淀区万寿路 173 信箱 邮编 100036

经 销:各地新华书店

开 本:787×1 092 1/16 印张:14.25 字数:364 千字

印 次:2004 年 8 月第 1 次印刷

印 数:5000 册 定价:17.00 元

凡购买电子工业出版社的图书,如有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系。

联 系 电 话 :( 010 ) 68279077 。 质 量 投 诉 请 发 邮 件 至 [email protected] , 盗 版 侵 权 举 报 请 发 邮 件 至

[email protected]

Page 3: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

前 言

信息技术的飞速发展和普及使得全社会对计算机应用技术的需求日益增加。众所周知,计

算机的主要功能是进行信息处理,而基于数据库技术的数据组织与处理则是其中一个非常重要

的领域。

PowerBuilder 9.0 是 Powersoft 公司推出的可视化数据库集成开发工具,它具有诸多新特性,

可以方便用户对数据库的开发和维护,是数据库开发工具中的主流产品。与先前的版本相比,

新版本的 PowerBuilder 全面加强了基于多层体系结构的中间件技术和基于 Web 的网络应用技

术,并开始对.NET 架构提供全方位的支持。

本书作为实例教程,突出学习过程以实例驱动,其精髓在于将一个从建立数据库到界面设

计的完整 PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了 PowerBuilder 9.0

的基础知识、编程方法及实用技巧,而且讲解了应用系统的设计方法,使读者能够掌握一套完

整的使用 PowerBuilder 开发应用系统的方法。

本书内容包括:PowerBuilder 的开发环境,数据库、应用程序对象、用户对象的创建,菜

单、窗口与窗口控件、数据窗口与数据窗口控件、数据管道等 PowerBuilder 对象的创建和使用;

此外,还介绍了 PowerScript 语言和 SQL 语句及应用程序的调试与发行等。

本书内容深入浅出、重点突出、讲解透彻、实例丰富、结构严谨,便于读者快速查阅和参

考,使读者能够快速入门并掌握这一数据库开发工具主流产品。书中内容编排合理,实例取舍

得当,保证了本教材内容既具有一定的新颖性又具有一定的深度和广度。在书后的附录中,对

PowerBuilder 中的系统函数进行了详细介绍。

本书内容面向初学者,不仅适合作为高职高专教育教材,而且适合作为职业培训教材以及

程序设计人员的参考资料。

本书由王宝和编写提纲、统稿并编写第 1 章、第 4 章和第 5 章,由胥家瑞编写第 7 章和第

8 章,由冯勤编写第 3 章和第 9 章,由刘惠民编写第 2 章、第 6 章、第 10 章和第 11 章,孟宗

洁参与了本书部分实例的设计和校稿工作。

由于编写时间紧迫,作者水平有限,书中难免有错误和疏漏之处,恳请专家、学者以及广

大读者批评指正。

编 者

2004 年 4 月

Page 4: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·Ⅸ·

目 录

第 1 章 PowerBuilder 9.0 概述 ······················································································································ (1)

1.1 PowerBuilder 9.0 简介 ······················································································································ (1)

1.1.1 PowerBuilder 9.0 的基本特点 ······························································································ (1)

1.1.2 PowerBuilder 9.0 的新特性 ·································································································· (3)

1.2 PowerBuilder 9.0 的开发环境 ·········································································································· (5)

1.2.1 主窗口··································································································································· (5)

1.2.2 工具栏··································································································································· (6)

1.2.3 画板······································································································································· (8)

1.3 应用程序开发步骤 ························································································································· (11)

1.3.1 系统分析和系统设计 ········································································································· (12)

1.3.2 系统开发 ····························································································································· (12)

1.4 应用程序开发实例 ························································································································· (13)

1.5 本书实例概述 ································································································································· (18)

本章小结 ·················································································································································· (22)

练习 ·························································································································································· (22)

第 2 章 数据库管理 ······································································································································· (23)

2.1 创建和删除数据库 ························································································································· (23)

2.1.1 数据库画板 ························································································································· (23)

2.1.2 创建 Adaptive Server Anywhere 数据库············································································ (23)

2.1.3 删除数据库 ························································································································· (25)

2.2 数据库接口和数据库连接·············································································································· (25)

2.2.1 创建 ODBC 数据源 ············································································································ (25)

2.2.2 连接数据库 ························································································································· (27)

2.3 操纵数据库表 ································································································································· (28)

2.3.1 创建表································································································································· (29)

2.3.2 修改表结构 ························································································································· (30)

2.3.3 删除表································································································································· (30)

2.4 定义列的扩展属性 ························································································································· (31)

2.5 创建索引键及主关键字·················································································································· (32)

2.5.1 建立主关键字 ····················································································································· (32)

2.5.2 建立外部关键字 ················································································································· (32)

2.5.3 建立索引 ····························································································································· (33)

2.5.4 删除主键、外部键与索引键 ····························································································· (34)

2.6 表中数据的浏览、修改和输出······································································································ (34)

2.7 视图 ················································································································································· (35)

Page 5: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·Ⅹ·

2.7.1 创建视图 ····························································································································· (35)

2.7.2 删除视图 ····························································································································· (37)

本章小结 ·················································································································································· (37)

练习 ·························································································································································· (37)

第 3 章 PowerBuilder 编程 ··························································································································· (39)

3.1 PowerBuilder 编程语言基础·········································································································· (39)

3.1.1 断行、续行与多条语句······································································································ (39)

3.1.2 注释 ····································································································································· (39)

3.1.3 标识符 ································································································································· (40)

3.1.4 特殊 ASCII 码字符 ············································································································· (40)

3.1.5 空值 ····································································································································· (41)

3.1.6 对象、属性、函数和事件的引用方法 ·············································································· (41)

3.1.7 代词 ····································································································································· (41)

3.1.8 保留字 ································································································································· (42)

3.2 数据类型与说明······························································································································ (43)

3.2.1 标准数据类型 ····················································································································· (43)

3.2.2 枚举类型 ····························································································································· (44)

3.2.3 系统对象数据类型 ············································································································· (44)

3.2.4 变量说明 ····························································································································· (45)

3.2.5 数组 ····································································································································· (45)

3.2.6 变量的作用域 ····················································································································· (45)

3.2.7 常量说明 ····························································································································· (46)

3.3 运算符和表达式······························································································································ (46)

3.4 基本语句 ········································································································································· (47)

3.4.1 赋值语句 ····························································································································· (47)

3.4.2 条件语句 ····························································································································· (48)

3.4.3 循环语句 ····························································································································· (50)

3.4.4 其他常用控制语句 ············································································································· (53)

3.5 函数与事件的调用·························································································································· (54)

3.5.1 常用函数 ····························································································································· (54)

3.5.2 事件触发和邮寄函数 ········································································································· (63)

3.6 嵌入式 SQL 语句 ···························································································································· (64)

3.6.1 事务管理语句 ····················································································································· (64)

3.6.2 基本 SQL 语句···················································································································· (67)

3.6.3 游标的使用 ························································································································· (71)

3.7 例外处理语句·································································································································· (73)

3.7.1 PowerBuilder 中的例外处理 ······························································································ (73)

3.7.2 例外处理语句 ····················································································································· (73)

本章小结 ·················································································································································· (74)

Page 6: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·Ⅺ·

练习 ·························································································································································· (74)

第 4 章 窗口对象············································································································································ (75)

4.1 窗口概述 ········································································································································· (75)

4.2 窗口类型 ········································································································································· (75)

4.3 创建窗口 ········································································································································· (76)

4.3.1 创建新窗口 ························································································································· (76)

4.3.2 窗口画板概述 ····················································································································· (77)

4.4 窗口属性 ········································································································································· (77)

4.4.1 一般属性 ····························································································································· (77)

4.4.2 其他属性 ····························································································································· (78)

4.5 保存、预览、运行窗口·················································································································· (79)

4.6 窗口事件 ········································································································································· (79)

4.7 窗口函数 ········································································································································· (80)

4.8 创建窗口实例·································································································································· (82)

本章小结 ·················································································································································· (83)

练习 ·························································································································································· (83)

第 5 章 窗口控件············································································································································ (84)

5.1 为窗口添加控件······························································································································ (84)

5.1.1 控件概述 ····························································································································· (84)

5.1.2 控件图标选择途径 ············································································································· (84)

5.1.3 将控件放置到窗口上 ········································································································· (85)

5.1.4 控件名的默认前缀 ············································································································· (85)

5.1.5 对控件可进行的操作 ········································································································· (86)

5.2 窗口控件的操作技术······················································································································ (86)

5.2.1 选择控件 ····························································································································· (86)

5.2.2 移动控件 ····························································································································· (87)

5.3 控件属性、事件和函数·················································································································· (89)

5.3.1 控件属性的设置 ················································································································· (89)

5.3.2 控件事件及其脚本 ············································································································· (90)

5.3.3 控件函数 ····························································································································· (90)

5.4 重要控件的应用······························································································································ (91)

5.4.1 命令按钮 ····························································································································· (91)

5.4.2 静态文本编辑及显示控件·································································································· (92)

5.4.3 单选钮、复选框与组框······································································································ (94)

5.4.4 修饰性控件 ························································································································· (96)

5.4.5 标签控件 ····························································································································· (98)

5.4.6 列表框、下拉列表框、图片列表框、下拉图片列表框················································· (101)

5.4.7 OLE 控件 ·························································································································· (104)

5.4.8 滚动条控件、跟踪条控件和进度条控件 ········································································ (106)

Page 7: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·Ⅻ·

5.4.9 RichText 编辑框控件 ······································································································· (108)

5.5 高级控件——树形视图················································································································ (110)

5.5.1 树形视图的属性 ··············································································································· (110)

5.5.2 添加与删除列表项 ··········································································································· (111)

5.5.3 树形视图控件的事件 ······································································································· (113)

5.6 本章实例 ······································································································································· (113)

本章小结 ················································································································································ (120)

练习 ························································································································································ (121)

第 6 章 菜单 ················································································································································· (122)

6.1 菜单的创建 ··································································································································· (122)

6.1.1 菜单类型 ··························································································································· (122)

6.1.2 菜单命令特点 ··················································································································· (123)

6.1.3 菜单画板及其功能 ··········································································································· (123)

6.1.4 创建新菜单 ······················································································································· (124)

6.2 设置菜单属性 ······························································································································· (127)

6.2.1 General 属性页 ················································································································· (127)

6.2.2 Toolbar 属性页 ················································································································· (128)

6.2.3 定义菜单项的加速键和快捷键 ······················································································· (128)

6.2.4 在菜单里加入分割线 ······································································································· (129)

6.2.5 保存菜单 ··························································································································· (129)

6.3 菜单事件及其编程 ······················································································································· (129)

6.3.1 菜单事件 ··························································································································· (129)

6.3.2 菜单事件处理程序编写步骤 ··························································································· (129)

6.3.3 编程设置菜单属性 ··········································································································· (130)

本章小结 ················································································································································ (130)

练习 ························································································································································ (130)

第 7 章 数据窗口对象·································································································································· (131)

7.1 数据窗口对象概念 ······················································································································· (131)

7.2 创建数据窗口对象 ······················································································································· (131)

7.3 定义数据源 ··································································································································· (134)

7.4 数据窗口对象的显示风格············································································································ (136)

7.5 数据窗口画板 ······························································································································· (140)

7.5.1 数据窗口画板的功能 ······································································································· (140)

7.5.2 使用数据窗口画板设计数据窗口对象············································································ (141)

7.5.3 数据窗口的布局结构 ······································································································· (143)

7.5.4 控制列对象的显示与编辑 ······························································································· (144)

7.5.5 控制数据行 ······················································································································· (145)

7.6 增强数据窗口对象的功能············································································································ (147)

7.6.1 增加与删除数据窗口中的对象 ······················································································· (147)

Page 8: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

· ·

7.6.2 静态文本对象 ··················································································································· (147)

7.6.3 计算域······························································································································· (148)

7.7 本章实例 ······································································································································· (148)

本章小结 ················································································································································ (150)

练习 ························································································································································ (150)

第 8 章 数据窗口控件·································································································································· (151)

8.1 建立数据窗口控件与数据窗口对象的连接 ················································································ (151)

8.1.1 数据窗口的运用 ··············································································································· (151)

8.1.2 放置数据窗口控件 ··········································································································· (152)

8.1.3 连接数据窗口控件与对象 ······························································································· (152)

8.1.4 动态更换数据窗口对象 ··································································································· (152)

8.2 数据窗口控件与数据库················································································································ (153)

8.2.1 与数据库建立连接 ··········································································································· (154)

8.2.2 为数据窗口控件分配事务对象 ······················································································· (154)

8.2.3 检索数据 ··························································································································· (154)

8.2.4 更新数据库 ······················································································································· (155)

8.3 数据窗口项的引用 ······················································································································· (156)

8.3.1 数据窗口控件的缓冲区 ··································································································· (156)

8.3.2 编辑状态标志 ··················································································································· (157)

8.3.3 插入行与删除行 ··············································································································· (157)

8.3.4 编辑控件 ··························································································································· (157)

8.3.5 得到与设置当前行/列 ······································································································ (158)

8.3.6 得到所设置数据项的值 ··································································································· (159)

8.4 与数据窗口有关的函数················································································································ (160)

8.4.1 滚动数据行 ······················································································································· (160)

8.4.2 改变当前行光带 ··············································································································· (161)

8.4.3 清除所有行 ······················································································································· (161)

8.4.4 修改过滤条件及过滤数据 ······························································································· (162)

8.5 数据窗口事件应用实例················································································································ (163)

8.6 数据窗口应用 ······························································································································· (164)

8.6.1 数据存储对象 ··················································································································· (164)

8.6.2 共享数据窗口 ··················································································································· (165)

本章小结 ················································································································································ (169)

练习 ························································································································································ (169)

第 9 章 自定义对象 ····································································································································· (171)

9.1 自定义函数和结构 ······················································································································· (171)

9.1.1 创建自定义全局函数 ······································································································· (171)

9.1.2 修改自定义全局函数 ······································································································· (172)

9.1.3 删除自定义全局函数 ······································································································· (172)

Page 9: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

· ·

9.1.4 创建、修改和删除自定义对象函数 ················································································ (173)

9.1.5 创建、修改和删除结构体································································································ (174)

9.2 用户事件 ······································································································································· (175)

9.2.1 定义用户事件 ··················································································································· (176)

9.2.2 用户事件讨论 ··················································································································· (179)

9.2.3 使用用户事件 ··················································································································· (180)

9.3 用户对象 ······································································································································· (181)

9.3.1 用户对象分类 ··················································································································· (181)

9.3.2 创建用户对象 ··················································································································· (182)

9.3.3 创建标准可视用户对象···································································································· (182)

9.3.4 创建定制可视用户对象···································································································· (183)

9.3.5 创建外部可视用户对象···································································································· (183)

9.3.6 创建定制类用户对象 ······································································································· (184)

9.3.7 创建标准类用户对象 ······································································································· (184)

9.3.8 使用用户对象 ··················································································································· (184)

本章小结 ················································································································································ (185)

练习 ························································································································································ (185)

第 10 章 数据管道 ······································································································································· (186)

10.1 数据管道的概念·························································································································· (186)

10.2 创建数据管道对象······················································································································ (187)

10.2.1 数据管道对象 ················································································································· (187)

10.2.2 启动数据管道画板 ········································································································· (187)

10.2.3 使用数据管道画板 ········································································································· (188)

10.3 在应用程序中使用数据管道 ······································································································ (189)

10.3.1 使用数据管道画板创建数据管道对象 ·········································································· (189)

10.3.2 数据管道的属性 ············································································································· (189)

10.3.3 数据管道的事件 ············································································································· (190)

10.3.4 数据管道的函数 ············································································································· (190)

本章小结 ················································································································································ (192)

练习 ························································································································································ (192)

第 11 章 库管理和应用程序创建 ················································································································ (193)

11.1 库管理 ········································································································································· (193)

11.1.1 应用库的组织方式 ········································································································· (193)

11.1.2 使用库画板 ····················································································································· (193)

11.2 维护应用库 ································································································································· (194)

11.2.1 创建新的应用库 ············································································································· (194)

11.2.2 删除应用库 ····················································································································· (195)

11.2.3 修改应用库注释 ············································································································· (195)

11.3 创建可执行文件·························································································································· (195)

Page 10: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

· ·

11.3.1 创建可执行文件的一般步骤·························································································· (195)

11.3.2 创建可执行文件时要考虑的问题 ·················································································· (197)

11.4 应用程序的发行·························································································································· (199)

11.4.1 PowerBuilder 运行时库 ·································································································· (199)

11.4.2 安装数据库接口 ············································································································· (199)

11.4.3 配置 ODBC 数据源 ········································································································ (199)

本章小结 ················································································································································ (199)

练习 ························································································································································ (200)

附录 A PowerBuilder 系统函数一览表 ······································································································ (201)

Page 11: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·1·

第 1 章 PowerBuilder 9.0 概述

PowerBuilder 是一个专业的客户/服务器应用程序开发工具,是公认的最好的数据库开发

工具之一。PowerBuilder 相当庞大,它的众多功能都在其开发环境中得到了体现。对初次接

触 PowerBuilder 的开发人员来说,可能会感到有点无从下手,但当掌握了 PowerBuild 基础知

识并熟悉了它的使用方式后,很快就会爱不释手、游刃有余了。

本章主要介绍 PowerBuilder 的基本概念、特点和集成开发环境,通过一个实例介绍

PowerBuilder 的开发过程,初步了解 PowerBuilder 能够完成的工作,使读者对 PowerBuilder

有一个初步印象。

1.1 PowerBuilder 9.0 简介

PowerBuilder 9.0 是 Sybase Inc 的子公司 PowerSoft 于 2003 年 2 月 14 日推出的新一代数

据库应用程序开发工具,它除了能够设计传统的高性能、基于客户/服务器(Client/Server)体

系结构的应用系统外,也能够用于开发基于 Internet 的应用系统。PowerBuilder 支持的应用系

统可以同时访问多种数据库,其中既包括诸如 Oracle、Sybase 之类的大型数据库,也包括小

至 FoxPro 之类的支持 ODBC 接口的数据库。另外,PowerBuilder 开发环境携带的 Sybase

Adaptive Server Anywhere 本身就是一个功能强大的 DBMS,对小型应用系统来说,直接使用

这个数据库就是一种合理的选择。

为方便用户界面的开发,PowerBuilder 提供了大量控件,这样既丰富了应用程序的

表达能力,也加快了项目的开发进度。PowerBuilder 还支持分布式应用系统的开发,形

成多层应用的系统结构,也就是说,用 PowerBuilder 不仅能够开发客户端应用程序,而

且还可以轻而易举地构造应用服务器,从而形成分布式应用。PowerBuilder 支持多种平

台,并能生成机器代码的可执行文件。下面简单介绍 PowerBuilder 9.0 的基本特点和新

特性。

1.1.1 PowerBuilder 9.0 的基本特点

1.支持多种计算模式

(1)客户/服务器(C/S)模式。传统的客户/服务器模式是一种两层结构的计算模式,

如图 1.1 所示,它可将任务分解为客户端和服务器端两部分,然后协同解决。客户端的

任务是负责提出需求,服务器端的应用程序则为客户提供服务,如数据查询、打印等。

用 PowerBuilder 开发的应用程序能够与数据库服务器完美地协同工作,构成客户/服务器

计算模式。

随着组件技术的出现,PowerBuilder 9.0 也支持三层结构的客户/服务器模式,它在客

户机和服务器之间增加组件服务,用以完成商业规则,这样就减轻了客户端的计算负担和

Page 12: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·2·

维护量。

图 1.1 客户/服务器计算模式

(2)Web 模式(B/S 模式)。PowerBuilder 支持对基于 Web 的应用程序的开发。Web 模

式是随着互联网技术而发展起来的计算模式,它针对客户/服务器模式对客户机要求较高且不

宜维护的缺陷,将浏览器技术引入企业应用程序的开发。这样,在客户端只需要一个浏览器

就可以完成应用。

Web 模式通常由浏览器、Web 服务器和数据库服务器等三部分构成。浏览器负责向 Web

服务器发出请求,Web 服务器根据请求的需要可以向数据库服务器再次发出请求,收到数据

库服务器的响应结果后,生成页面发回浏览器。其工作过程如图 1.2 所示。

图 1.2 Web 模式

(3)多层混合模式。多层混合模式是将上述两种模式结合起来,发挥各自的优势。

PowerBuilder 9.0 通过紧密集成 PowerSite、EAServer,达到创建和管理可伸缩、可共享

的多用户、多服务器环境,提高了开发 Client/Server 应用程序和 Web 应用程序的效率和

质量。

2.跨平台的开发环境

互联网技术集成了多种操作系统,且渗透到企业应用环境中。PowerBuilder 不仅支持

Windows,还支持 Apple Machintosh 和 UNIX,在 Windows 平台上开发的应用程序可以很方

便地移植到其他操作系统平台。

3.支持面向对象的编程

在 PowerBuilder 中创建应用程序实际上是通过创建各种对象来完成的。例如,窗口、菜

单、数据窗口等都是对象。除了使用系统预先定义的对象外,开发人员可以自行构造新的对

象(称做用户对象),扩展系统的预定义对象,将各种对象有机地组合起来就构成了

PowerBuilder 应用程序。

4.支持多种关系数据库管理系统

用 PowerBuilder 开发的应用程序可以支持多种数据库,如使用 Microsoft SQL Server 开

Page 13: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·3·

发的应用程序可以方便地移植到 Oracle 中。PowerBuilder 还支持同时访问多个数据库系统,

只要不断地转换数据源就可以完成各种 DBMS 之间的数据传递。PowerBuilder 还提供了多种

数据接口方式,对大型数据库来说,PowerBuilder 提供了旨在充分发挥其性能的专用接口,

而小型数据库则可通过 ODBC 接口灵活地进行访问。

PowerBuilder 本身带有一个功能不凡的数据库管理系统——Sybase Adaptive Server Anywhere。

该数据库管理系统既可以应用于小型网络环境,也可以应用于单机环境。

5.丰富的数据表现风格

PowerBuilder 的数据窗口提供了丰富的数据表现手段。数据窗口能够从多种数据源中提

取数据,然后以多种风格展现在用户面前,这既包括文本显示方式,也包括统计图分析方式。

PowerBuilder 的数据窗口还提供了组框对象和按钮对象,开发人员可以使用它们在数据窗口

内部直接完成基本数据操作,如查询、修改、插入、删除、打印、浏览数据,使得一般的数

据库应用可以非常简单地得到实现。

6.灵活快捷的数据转移方法

利用 PowerBuilder 的数据管道,既可以采用交互式方式,也可以采用编程方式轻松地完

成数据转移或数据备份。可以把数据库中的数据从一个表复制到另一个表、从一个数据库复

制到另一个数据库、从一个 DBMS 复制到另一个 DBMS。在复制表的过程中,除了复制表中

数据和表结构外(当然也可以更改表结构),还可以复制相应表的扩展属性。

7.功能强大的调试器和多种调试方式

PowerBuilder 提供了一个全新的内置调试器。利用这一调试器,开发人员能够单步、断

点跟踪应用程序的执行,并在中断模式下查看或修改变量以及对象属性的取值。除了常规的

断点设置方法外,开发人员还可以设置条件断点和变量断点,使应用程序在某种条件下进入

中断模式。除了内置调试器外,开发人员还可以使用 PowerBuilder 的 PBDEBUG 功能跟踪应

用程序,并把执行过程记录到运行日志中。另外,PowerBuilder 还提供了专门跟踪嵌入式 SQL

语句的功能,从而可以找到与数据访问相关的性能瓶颈问题。

1.1.2 PowerBuilder 9.0 的新特性

较之以前的版本,此次从 PowerBuilder 8.0 到 PowerBuilder 9.0 的升级并非主要体现在开

发界面的变化上,而是体现在对组件和网络应用开发技术性能的改进和提高。9.0 版本的总

体特色主要表现在:更加完善的数据库支持和多层组件化应用开发机制、功能更强的企业应

用服务器(EAServer)性能以及更加完美的.NET 技术支持与 Web 应用表述能力。围绕这些

总体特色,PowerBuilder 9.0 在原有版本的基础上增加了如下新特性。

1.数据窗口支持 XML

这项新特性使得数据窗口的数据行与 XML(eXtensible Markup Language)之间可相互导

入和导出。用户可以指定 XML 逻辑结构,用之说明行数据如何重述 XML 文档内部的根元素。

要完成这个过程,需要使用封装于数据窗口对象中的 XML 模板对象,该模板对象在数据窗

口画板中以新的视图方式图形化地构建。

Page 14: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·4·

在导出模板视图中,用户可以预定根元素的重述子元素如何使用明确的标记符组成各级

的嵌套元素、注释、文本参考或者过程指示,也可将数据窗口列、计算域、报表、文本控件

等连接到 XML 中可接受文本数据的每一行,以便在运行时使用文本替换。

2.PowerBuilder 文档对象模型

PowerBuilder 文档对象模型(PBDOM)是文档对象模型(Document Object Model,

DOM)的 PowerBuilder 实现,是定义某种方法的编程接口。通过这种方法,XML 文档

能被访问和操作。尽管 PBDOM 不是完全的 W3C API 实现,但在 PowerScript 代码范

围内,PBDOM PowerBuilder API 能被用于读、写、操纵标准格式的 XML 文档。PBDOM

将 XML 文档作为一个互连的对象集进行描述,同时提供表示其用途的直觉方法和各对

象的功能特性。

PBDOM 根据由父结点和子结点组成的树状视图来与 XML 文档相互影响。每个文档元素

代表一个单独的 XML 文档的顶层结点,此元素有一个或多个代表树分支的子结点,结点树

中的元素通过适当的 PowerScript 类方法进行访问。

3.PowerBuilder 本地接口

PowerBuilder 本地接口(PowerBuilder Native Interface,PBNI)是一个使得开发人员能够

扩展 PowerBuilder 功能特性的标准编程接口。使用 PBNI,用户可以创建对 PowerBuilder 的扩

展,包括非可视的、可视的以及混合对象,而且可以将 PowerBuilder 虚拟机(PowerBuilder

Virtual Machine,PBVM)嵌入到 C++应用程序中。通过 JNI(Java Native Interface),Java 应

用程序也能够与 PBVM 进行通信。

4.JSP 目标

PowerBuilder 9.0 提供了一种易用开发的环境,此环境可使许多 JSP 开发任务自动化,并

允许进行 JSP1.2 兼容服务器的 Web 应用实现。一个 JSP 对象模型经过较小的修改,就能复

制此前为 PowerDynamo 和 ASP Web 目标所用的服务端功能特性,包括为 PowerDynamo 应用

所提供的 4GL 事件模型扩展。

5.PowerBuilder 9.0 在 JSP Targets 方面所提供的新特性

� JSP Web 目标向导(JSP Web target wizard);

� JSP 页面编辑(JSP page authoring);

� JSP Web 目标对象模型(JSP Web target object model);

� JSP 实施配置(JSP deployment configuration);

� Web 数据窗口用自定义标记库(Custom tag library for the Web Datawindow)。

6.JSP 客户端 Web 服务

用户可以在 JSP 页面中通过生成自定义标记的方式使用 Web 服务。 PowerBuilder 9.0

提供了一种向导工具,使用此向导工具,只要提供了在某 JSP 页面中调用一个 Web 服务的必

要信息,就可以创建一个自定义标记。

Page 15: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·5·

7.Windows 客户端 Web 服务

一个 PowerBuilder 应用程序可以作为一个通过 Internet 使用 Web 服务的客户端。使用

SOAP(Simple Object Access Protocol,简单对象访问协议)和 WSDL,作为单一实体远程发

布的一个函数集可以成为开发 PowerBuilder 应用程序的一部分。一个 Web 服务对由应用程

序或其他 Web 服务所发出的请求进行接收并作出响应。

通过 SOAP 调用 Web 服务需要数据类型的串行化和非串行化,以及基于 XML 的 SOAP

消息创建与解析。使用 PBSoapClient90.pbd 和 PBSoapClient90.dll 两个库文件,Web 服务客户

端代理可替用户完成这些工作。

8.其他新特性

除了上述的新增功能外,PowerBuilder 9.0 所提供的新特性还包括:

� 第三方应用服务器的 EJB 客户端;

� 源代码控制的改进;

� 新的 OrcaScript 语言;

� 新增 Oracle9i 支持;

� Unicode 编码数据库支持;

� XML 与 CSV 的导入和保存。

1.2 PowerBuilder 9.0 的开发环境

PowerBuilder 的集成开发环境为开发人员提供了一个交互式定义对象、编写代码、

调试程序的图形界面。PowerBuilder 集成开发环境由一系列集成的画板(Painter)组成。

所谓画板实际上就是完成一定功能的工具。例如,窗口画板用于定义窗口对象,用户对

象画板用于定义用户对象,数据窗口画板用于定义数据窗口对象,库画板完成应用库的

增、删、改等。应用开发人员通过简单的鼠标操作就能设计、建立、测试客户/服务器应

用程序。

PowerBuilder 各画板完成的工作是由众多的画板工具实现的,而画板工具又包含了

一些小工具。画板、画板工具和小工具的有机组合构成了 PowerBuilder 强大而方便的应

用开发环境。

下面介绍 PowerBuilder 9.0 主窗口的布局、主要画板的功能、画板栏的定制方法、

PowerBuilder 开发环境的各屏幕要素以及设置开发环境字体属性的方法。

1.2.1 主窗口

启动 PowerBuilder 9.0(按照“开始→程序→PowerBuilder 9.0”顺序,找到并单击

PowerBuilder 9.0,即可启动 PowerBuilder 9.0),出现如图 1.3 所示窗口,这就是 PowerBuilder 9.0

的主窗口。

1.Workspace 窗口

Workspace 窗口是 PowerBuilder 9.0 新增加的 3 个窗口之一。以前的 PowerBuilder 版本只

Page 16: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·6·

能打开一个应用程序,而引入了 Workspace 窗口之后,则可以在一个 Workspace 窗口下引入

多个应用程序。

Workspace 窗口

Clip 窗口

Output 窗口

图 1.3 PowerBuilder 9.0 主窗口

2.Clip 窗口和 Output 窗口

Clip 窗口供用户在程序开发时拷贝和粘贴一些常用的程序代码。

Output 窗口用于显示多种操作的执行结果,如升级、编译、发布、对象保存和查询

等。

1.2.2 工具栏

1.PowerBar

PowerBar 是 PowerBuilder 的主控菜单工具栏,如图 1.4 所示。通过单击 PowerBar 上的命

令按钮可以打开 PowerBuilder 的画板、浏览器、调试器以及运行当前应用程序,打开其他应

用程序和修改库文件搜索路径等,如图 1.4 所示。

图 1.4 PowerBar

2.PainterBar

PainterBar 是画板的菜单工具栏,如图 1.5 所示。当打开一个画板时,PowerBuilder 会显

示一个新的窗口,即画板环境在这里可以完成对象的设计和建立。为了方便选取画板或使用

画板的功能,PowerBuilder 在画板环境中提供了 3 个 PainterBar。

Page 17: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·7·

图 1.5 PainterBar

3.StyleBar

StyleBar 是用来设置文本显示格式的工具栏。所以当打开的任意画板(如 Windows 画板)中

含有文本类控件时都会出现 StyleBar,如图 1.6 所示。使用 StyleBar 上的按钮可以修改文本的属性。

图 1.6 StyleBar 工具栏显示位置及提示

默认情况下,PowerBuilder 的工具栏显示在窗口顶部,但可以根据需要将它显示在其他

位置,包括左部、右部、下部或浮动方式(浮动方式下用户可以把工具栏放置在窗口上的任

何位置)。另外,还可以在图标上显示文字提示。可从“Tools”菜单中选择“Toolbars�”

菜单项,弹出对话框,如图 1.7 所示。

图 1.7 工具栏配置窗口

Page 18: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·8·

工具栏的设置可按以下步骤执行。

(1)在“Move”组框中选择工具栏的显示位置,其中:

Left——左部,Right——右部,Top——上部,Bottom——下部,Floating——浮动。

(2)如果想在图标上显示指示该图标按钮作用的文字提示,那么选中复选框“Show

Text”。

(3)如果想显示图标光标跟随提示(称做 PowerTips),那么选中复选框“Show

PowerTips”。

(4)下拉列表框“Font Name”和“Font Size”指定上述提示使用的字体名和字体大

小。

(5)设置了所需选项后,单击“Close”按钮关闭对话框。

4.定制工具栏

如果单击图 1.7 中右边的按钮“Customize”,还可以自己定制工具栏,弹出的对话框

如图 1.8 所示。移动鼠标指针到“Selected palette”图标列表中欲添加的图标上,按住鼠

标左键不松,拖曳鼠标指针,此时一个方框随鼠标指针一起移动,一直把该方框拖曳到下

部“Current toolbar”列表中数据窗口画板图标的后面,放开鼠标左键,这时想添加的图

标就被插入在相应的位置上了。最后单击“OK” 按钮关闭“Customize”对话框,单击

“Close”按钮关闭“Toolbars”对话框,这样就完成了定制工具栏的过程。用同样的方法

还可以自己新建工具栏。

图 1.8 定制工具栏对话框

1.2.3 画板

PowerBuilder 的开发环境由一系列集成的画板组成。通过“File|New”打开“New”

对话框,该对话框包含 7 个选项页,通过它们可以很容易地创建各种画板对象,如图 1.9

所示。

Page 19: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·9·

图 1.9 “New”对话框

Workspace 画板(Workspace Painter),在“Workspace”选项页中,用于生成一

个工作空间,任何一个对象都必须放在一个 Workspace 中。

应用对象画板(Application Painter),在“Target”选项页中。应用对象画板是

创建应用对象以及保存应用程序所有对象的应用库。应用对象定义应用程序的执行环境,包

括以下 3 个方面的内容:

� 应用对象名称和相应的图标;

� 应用程序中其他对象使用的默认文本颜色、字体以及字形;

� 应用程序用到的各种对象库等。

用户对象画板(User Object Painter),在“PB Object”选项页中。用户对象画板

用于生成用户对象,包括可视用户对象和类用户对象,这些对象既可在应用程序内部反复使

用,也能够在整个开发小组里公用。

可视化用户对象画板(Visual user Object Painter),在“PB Object”选项页中,

用于可视化的编辑和生成用户对象。

窗口画板(Window Painter),在“PB Object”选项页中。窗口画板用于设计应用

程序中使用的窗口以及定义窗口中的控件,实际上也就是定义应用程序与用户交互的人机接

口。

PowerBuilder 提供了大量控件供开发人员直接使用,它既包括常见的命令按钮、单选按

钮、复选框、编辑框、滚动条、列表框,也包括功能不凡的数据窗口控件、TreeView(树形

列表)控件、ListView(列表视图)控件、标签控件、各种绘图控件等。

菜单画板(Menu Painter),在“PB Object”选项页中。菜单画板用于生成菜单和

Page 20: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·10·

工具栏对象。菜单对象既可以直接运用在窗口的菜单栏上,也能够作为应用程序的弹出菜单

使用。

结构画板(Structure Painter),在“PB Object”选项页中。结构画板用于定义应

用程序中使用的全局结构。利用结构画板,开发人员能够更有效地组织复杂的变量。该画板

创建全局结构,并作为一个对象保存到应用库中。

函数画板(Function Painter),在“PB Object”选项页中。开发应用程序时,经常

会发生这样的情况:某段程序需要在多个地方使用,这时就可以用函数画板生成函数,避免

重复编码并提高代码的可重用性。函数画板创建的函数是全局函数,在整个应用程序中都能

够使用。

数据窗口画板(DataWindow Painter)中的 Grid 风格的数据窗口,在“Data Wibdow”

选项页中。数据窗口画板能够生成智能操纵数据库的数据窗口对象,该对象可以以多种显示

风格查询、修改数据库,且不需要复杂的 SQL 编程。

数据窗口对象能够访问多种数据源,包括表、视图、查询、存储过程以及外部数据

源等,同时,它有十几种表现风格,极大地丰富了数据的表达能力。数据窗口对象对

PowerBuilder 9.0 的应用程序十分重要,只有做到灵活自如地运用数据窗口,才能说掌握

了 PowerBuilder 。

数据库画板(Database Painter),在“Database”选项页中。该画板提供了生

成和维护服务器端数据库的良好环境,开发人员无须查阅 SQL 语句手册,就能够创建新表、

修改老表以及操纵数据。

而且,在该画板的数据操纵(DBAdministration)子画板中可以执行和测试当前环境所连

接数据库支持的任何 SQL 语句,如创建用户或用户组等。

查询画板(Qurey Painter),在“Database”选项页中。查询画板可使开发人员在图

形界面下以交互方式生成数据库查询语句,并将其作为一个对象进行保存。该对象可为数据

窗口对象所用。

这样,即使开发人员不十分熟悉数据库操作语句及 SQL 语句,利用该画板也同样能够生

成复杂的查询。

数据管道画板(Data Pipeline),在“Database”选项页中。数据管道画板用于把

一个数据库的结构和数据复制到另一个数据库,从而实现数据库之间的数据转换。

工程画板(Project Painter),在“Project”选项页中。工程画板用于建立工程文

件、编译应用程序、生成可执行文件、生成代理对象、产生类用户对象的 C++头文件/源代码

或目标库。

网络工程画板(Web Project Painter),在“Project”选项页中。网络工程画板

Page 21: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·11·

用于生成网络应用程序(Web Application)。

库管理画板(Library Painter),在“Tool”选项页中。库管理画板提供了管理

应用程序各个组成部分的有效手段。利用库管理画板,能够删除、修改、移出、移入、复制、

重新生成应用程序中的各种对象(如窗口、菜单、数据窗口对象等)。

文本编辑器(Edit),在“Tool”选项页中。文本编辑器用于编辑诸如初始文件(.INI)、

资源文件(.PBR)等类型的文本文件。

在 PowerBuilder 9.0 的主窗口工具栏中还有一些常用的工具,如对象浏览器(Browser)

和运行按钮 等。

对象浏览器(Browser):通过如图 1.10 所示的对象浏览器,可以方便地浏览

PowerBuilder 环境以及应用程序中各个对象的事件、属性、函数,并能够查阅系统预定义的

枚举类型及其取值,而且能够根据需要生成超文本格式(RTF)文件,或从打印机上打印

输出。

图 1.10 PowerBuilder 9.0 的 Browser 工具

另外,还可以在对象浏览器中直接启动所选对象的相应画板,编辑、修改对象。当需要

知道 OLE 自动化服务器的类类型,使用的枚举类型数据、属性、事件、方法等信息时,同样

可以使用对象浏览器进行查阅。

运行按钮(Run):在 PowerBuilder 开发环境中运行应用程序。

1.3 应用程序开发步骤

用 PowerBuilder 开发应用系统时,一般都要经过系统分析、系统设计、系统开发、代码

调试、系统测试、生成 EXE 文件、交付应用等阶段,如图 1.11 所示。

Page 22: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·12·

图 1.11 PowerBulider 应用程序开发步骤

1.3.1 系统分析和系统设计

实际上,在开发任何应用系统之前,开发人员都必须充分了解系统需求,理解系统应该

完成的真正任务,千万不能因为赶进度而过分缩减或忽略该阶段的工作,这一阶段的成果很

大程度上决定了项目的成败。理解了系统需求后,就进入了系统设计阶段,这时应考虑用户

界面的风格、使用何种数据库、如何组织数据等。

1.3.2 系统开发

在 PowerBuilder 中,建立应用程序所需做的大量工作是创建对象、描述对象、设置属性,

而不是编写大量的代码。系统开发过程可分为:

� 建立应用对象;

� 生成用户对象、函数和结构;

� 建立窗口和菜单;

� 创建数据窗口对象,将数据窗口对象连接到窗口上;

� 编写各对象的事件处理程序;

� 调试应用;

� 测试系统;

� 生成 EXE 文件。

Page 23: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·13·

1.4 应用程序开发实例

PowerBuilder 应用程序的开发过程实际上就是定义对象、组合对象的过程。对象是

PowerBuilder 极为重要的概念之一,它包括三方面的特征:属性、事件和函数。

(1)属性规定了对象的特征,如标题是什么,以何种颜色显示等。

(2)事件说明对象响应什么样的操作。例如,当单击窗口时,就向窗口发出了一个单击事件。

(3)函数封装了对象的功能,也是应用程序与对象交换信息的主要手段。在其他面向对

象的编程语言中,有时也把函数称做“方法”。

下面编写一个“写字板”程序。

写字板程序的功能主要有新建、打开、保存文档,也可以通过菜单命令对文本实现剪切、

复制、粘贴等操作,如图 1.12 所示。

图 1.12 写字板

通过本例题的实现,可以让初学者感受一下如何创建一个应用程序。

第一步,新建一个工作空间。单击“File”菜单栏,选择“New”菜单项,如图 1.13 所示,

图 1.13 File 菜单

Page 24: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·14·

弹出“New”对话框,如图 1.14 所示;选择“Workspace”选项卡,选择“Workspace”图标,

单击“OK”按钮关闭“New”对话框,弹出的“New Workspace”对话框如图 1.15 所示。

图 1.14 “New”对话框

图 1.15 “New Workspace”对话框

在弹出的“New Workspace”对话框的“文件名(N)”栏中输入应用空间名称,如 text;

单击“保存”按钮,关闭“New Workspace”对话框,完成工作空间的建立。

第二步,在创建完了应用空间后,还需要为 PB 创建应用程序才可以建立窗口以及菜单。

单击菜单栏 File→New 菜单项,出现“New”对话框。

选择“Target”选项卡,选择 “Application” 图标,如图 1.16 所示;单击“OK”按钮

或双击“Application”图标,可关闭“New” 对话框,弹出“Specify New Application and Library”

对话框,如图 1.17 所示。

在弹出的“Specify New Application and Library”对话框中,只需输入应用程序名称

(Application Name)即可创建应用程序。在创建应用程序的同时,也创建了 PB 所需的目标文

件以及库文件(这两个文件在 PB 9.0 中是必需的)。

Page 25: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·15·

图 1.16 “New”对话框

图 1.17 “Specify New Application and Library”对话框

在“Application Name:”框中输入 text 后单击“Finish”按钮,可关闭窗体,完成应用程

序的建立。

第三步,添加菜单、窗口。

① 添加菜单。单击“File”菜单栏,选择“New”菜单项,打开“New”对话框。选择 “PB

Object” 选项卡,选择“Menu”图标,单击“OK”按钮或双击“Menu”图标,如图 1.18 所

示,可关闭“New”对话框,弹出菜单画板,如图 1.19 所示。

用鼠标右键单击菜单项窗口中未定义菜单项,在弹出的快捷菜单中选择“Insert Submenu

Item”菜单项,添加如下菜单:

Page 26: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·16·

图 1.18 “New”对话框

图 1.19 菜单画板

Name Text

m_file 文件(&F)

m_edit 编辑(&E)

m_view 查看(&V)

m_insert 插入(&I)

m_format 格式(&F)

m_help 帮助(&H)

单击“File”菜单栏,选择“Save”菜单项,弹出“Save Menu”对话框,输入菜单名

m_text_menu,单击“OK”按钮,即可完成菜单设计,如图 1.20 所示。

② 添加窗口。单击“File”菜单栏,选择“New”菜单项,弹出“New”对话框,如图

1.21 所示;选择“PB Object”选项卡,选择 Window 图标,单击“OK”按钮。关闭“New”

对话框,弹出窗口画板,如图 1.22 所示。

Page 27: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·17·

图 1.20 设计好的菜单

图 1.21 “New”对话框

图 1.22 窗口画板

Page 28: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·18·

在窗口布局区(Layout 区)添加 MultiLineEdit 控件,放在合适的位置,名称为 mle_1。

使用与保存菜单同样的方法保存窗口,窗口取名为 w_text_window。

注:在保存的时候,名称前加上 m_、w_分别表示菜单和窗口,其他不同形式的对象,

用的前缀也不一样,后面将会向大家介绍。

③添加代码。双击应用对象 text ,在 text 的 open 事件中添加如下代码:

open(w_text_window) 双击窗口 w_text_window ,在 w_text_window 的 open 与 resize 事件中添加如下代码:

mle_1.width = this.width

mle_1.height = this.height 保存代码后即可完成应用程序的设计。

图 1.23 所示是创建该实例后系统树视图的显示情况。

应用程序 text

图 1.23 系统树视图

看看我们的运气如何,单击工具栏上的 Run 按钮 ,看一下我们编写的第一个程序是不

是启动了,很兴奋吧!

1.5 本书实例概述

本书由一个真实的案例——商务进销存系统简化而来,大部分章节的例题及实例均取材

于该案例,以便学完整个课程后,对实际的系统有一个完整的认识,对学生以后的实践有所

指导。下面首先对商务进销存系统作一个简单的介绍。

1.商务进销存系统的需求

商务进销存系统用于管理商业企业的业务活动,其中包括商业基本信息维护、采购管理、

销售管理、资金往来管理和利润核算。具体需求如下:

Page 29: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·19·

� 商品采购单采用多联,同时作为入库凭证。

� 商品销售单也采用多联,同时作为出库凭证。

� 商品核销采用按批号先进先出方法。

� 库存设定上限、下限数量,以保证合理库存。

� 通过付款单、收款单管理往来资金。

� 通过基本数据生成日报、月报,按业务员统计出销售业绩。

� 身份不同,能够操作的模块不同。

2.商务进销存系统的功能

根据对商务进销存系统需求的分析,商务进销存系统应具有以下功能。

(1)系统维护(系统管理员完成):人员管理,数据备份,数据恢复。

(2)基本数据维护:商品管理,客户管理,供应商管理。

(3)采购管理(入库):入库单录入,入库单查询。

(4)销售管理(出库):销售单录入,销售查询,销售日报,销售月报。

(5)资金管理:应付明细,付款查询,应收明细,收款查询,付款,收款。

(6)统计查询:库存统计,销售业绩,销售情况分析。

3.商务进销存系统的数据库设计

商务进销存系统数据库设计所涉及的表格如表 1.1 至表 1.8 所示。

表 1.1 商品表(t_shop)

字段名 主键 类型 长度 是否为空 描述

Id √ Char 10 NO 商品 ID

Name Varchar 30 NO 商品名称

Describe Varchar 200 YES 产品说明

Max_number Integer 默认 YES 库存上限

Min_number Integer 默认 YES 库存下限

表 1.2 入库单(t_input)

字段名 主键 类型 长度 是否为空 描述

Batch √ Char 10 NO 批号

Client_id 外键 Char 5 NO 供应商

Id 外键 Char 10 NO 商品 ID

Number Integer 默认 NO(默认值为 0) 入库数量

Price_in Money 默认 NO(默认值为 0) 进货单价

Date_in Data 默认 NO 进货日期

Expire_day Data 默认 YES 有效日期

Location Char 5 YES 货位号

Buyer Varchar 8 YES 经手人

Emp_id 外键 Char 6 NO(默认值为 0) 雇员编号

注:t_input.id 与 t_shop.id 连接;

Page 30: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·20·

t_input.client_id 与 t_client.client_id 连接;

t.input.emp_id 与 t_employee.emp_id 连接。

表 1.3 出库单(t_out)

字段名 主键 类型 长度 是否为空 描述

Sheet_id √ Char 15 NO 出货单号

Batch 外键 Char 10 NO 批号

Number Integer 默认 NO 出货数量

Price_out Money 默认 NO(默认为 0) 出货单价

Date_out Date 默认 NO 出货日期

Saler Char 8 NO 提货人

Operator Char 6 NO 经手人

Emp_id 外键 Char 6 NO 雇员编号

Client_id 外键 Char 5 NO 客户

注:t_out.batch 与 t_input.batch 连接;

t_out.emp_id 与 t_employee.emp_id 连接;

t_out.clent_id 与 t_client.clent_id 连接。

表 1.4 用户管理(t_user)

字段名 主键 类型 长度 是否为空 描述

User_id √ Char 6 NO 用户名

Password Char 6 NO 密码

Popedom Char 2 NO 权限

注:t_user.user_id 与 t_employee.emp_id 连接。

表 1.5 员工档案(t_employee)

字段名 主键 类型 长度 是否为空 描述

Emp_id √ Char 6 NO 员工 ID

Emp_name Varchar 8 NO 姓名

Sex Char 2 NO 性别

Birthday Data 默认 NO 生日

Address Varchar 100 NO 住址

Tel Varchar 20 NO 电话

Code Char 6 NO 邮编

Remark Varchar 20 NO 备注

Page 31: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·21·

表 1.6 客户档案(t_client)

字段名 主键 类型 长度 是否为空 描述

Client_id √ Char 5 NO 客户 ID

Name Varchar 20 NO 客户名称

Present Varchar 8 NO 联系人

Tel Varchar 8 YES 电话

Address Varchar 100 YES 住址

Type Char 6 NO 类别(客户/供应商)

表 1.7 客户账户(t_pay_record)

字段名 主键 类型 长度 是否为空 描述

Pay_sheet_id √ Char 5 NO 收款单号

Sheet_id 外键 Char 15 NO 销售单号

Client_id 外键 Char 5 NO 客户 ID

Pay_method Varchar 10 NO(默认值为现金) 付款方式

Real_payprice Money 默认 NO 实付金额

Real_paydate Date 默认 NO 实付日期

Sheet_number Char 10 支票号

注:t_payrecord.sheet_id 与 t_out.sheet_id 连接;

t_payrecord.client_id 与 t_client.clent_id 连接。

表 1.8 供应商账户(t_repay_record)

字段名 主键 类型 长度 是否为空 描述

Repay_sheet_id √ Char 5 NO 付款单号

Batch 外键 Char 10 NO 入库单号

Client_id 外键 Char 5 NO 供应商 ID

Repay_method Varchar 10 NO(默认值为现金) 受款方式

Real_payprice Money 默认 NO 实收金额

Real_paydate Date 默认 NO 实收日期

Sheet_number Char 10 支票号

注:t_repay_record.batch 与 t_input.batch 连接;

t_repay_record.client_id 与 t_client.client_id 连接。

Page 32: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·22·

本 章 小 结

本章扼要地介绍了 PowerBuilder 9.0 系统环境,详述了其基本特点和主要新特性,阐述了

集成开发环境的组成、各画板的功能、作用、定制开发环境的方法等,介绍了对象的基本概

念以及开发 PowerBuilder 应用程序的基本步骤,并通过一个实例帮助读者学习和了解

PowerBuilder 编程的基本过程。

练 习

1.PowerBuilder 支持哪些种计算模式,各有何特点?

2.PowerBuilder 有哪些画板,其功能是什么?

3.PowerBuilder 应用程序的开发步骤是什么?

4.在计算机上安装一个 PowerBuilder 9.0,然后将本章的实例放进去,体验一下用

PowerBuilder 9.0 编程的快乐。

Page 33: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·23·

第 2 章 数据库管理

PowerBuilder 应用程序的核心是数据库。在 PowerBuilder 开发环境和应用程序能够访问

数据库中的数据之前,必须首先与数据库建立联系,也就是连接到数据库上。PowerBuilder

的优势在于能够十分方便、快捷地完成这一工作。PowerBuilder 与数据库通过 ODBC 或各种

专用接口建立连接。当 PowerBuilder 与数据库连接成功之后,在 PowerBuilder 中使用数据库

管理器来管理数据库中的数据。

在 PowerBuilder 开发过程中,若要使用 ODBC 数据源的数据库,可通过下列操作步骤来

完成。

� 创建物理数据库,如.dbf 和.asa 等;

� 定义 ODBC 数据源(对使用 ODBC 作为接口的数据库);

� 定义 DB Profile(仅仅是开发环境需要,运行时不需要);

� 连接数据库。

2.1 创建和删除数据库

2.1.1 数据库画板

数据库(Database)画板是专门用来管理数据库的一种工具,它具有很全面的数据管理

能力。数据库画板既可以创建和删除 ASA 数据库(其他类型的数据库必须由相应的 DBMS

来完成)、定义 ODBC 数据源、连接数据库,还可以创建和管理表及数据等,同时还可以从

菜单(Tools→Database Painter)或工具栏进入 Database 画板,如图 2.1 所示。

图 2.1 打开 Database 画板

进入 Database 画板后,在 Database 主窗口内可打开更多的子窗口,可通过主菜单 View

打开其他子窗口,如图 2.2 所示。

2.1.2 创建 Adaptive Server Anywhere 数据库

进入 Database 画板后,打开 Objects 子窗口,如图 2.2 所示。在这个子窗口中,列出了

所有可以连接的数据库接口,依次展开“ODB ODBC”、“Utilities”、“Create ASA Database”

单击该图标,进入数据库画板

Page 34: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·24·

ObjectLayout

子窗口

创建 ASA 数据库

创建 ODBC 数据源

删除 ASA 数据库

ODBC 管理者

Objects 子窗口

图 2.2 Database 画板主窗口

选 项 , 弹 出 “ Create Adaptive Server

Anywhere Database”对话框,如图 2.3 所

示;在该对话框中通过 ASA Version 项选

择 ASA 的 版 本 : Adaptive Server

Anywhere 8.0;使用默认的用户标识 User

ID 项“dba”和默认的口令 Password 项

“sql”(如果不用默认值,则必须牢记)。

在 Database Name 项单击“Browse⋯”按

钮,弹出“Create Database”对话框,在

该对话框中选择物理数据库的位置,并输

入数据库名称,单击“保存”按钮,返回

“ Create Adaptive Server Anywhere

Database”对话框;其他项就用系统默认

值,单击“OK”按钮,则在指定目录下

创建了一个 ASA 数据库。该数据库名即

出现在 Objects 子窗口中的 ODB ODBC

项下,且该数据库处于连接状态,如图

2.4 所示。注意,在创建 ASA 数据库的同

时自动建立 ODBC 数据源,并且使数据

库处于连接状态,可以直接管理数据库

了,不必进行 2.2 节所描述的工作了。

Browse 按钮

图 2.3 “Create Adaptive Server Anywhere Database”

对话框

Page 35: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·25·

图 2.4 已建好的 ASA 数据库

2.1.3 删除数据库

如果要删除数据库,可在数据库画板中(如图 2.2 所示),用鼠标双击“Delete ASA

Database”项,出现删除本地数据库“Delete Local Database”对话框,选择所要删除的数据

库名,然后单击“保存”按钮,在弹出的对话框中选择按钮“是(Y)”即可。

2.2 数据库接口和数据库连接

有了物理数据库,接下来要在 PowerBuilder 与数据库之间架设一座桥梁,以便

PowerBuilder 访问数据库,这就是 PowerBuilder 与数据库的接口。PowerBuilder 提供了两类

接口:ODBC 接口和专用接口。

ODBC(Open Data Base Connectivity)接口是微软公司提出的开放式数据库互连标准接

口,它以关系数据库标准查询语言 SQL 来存取连接到的数据源,ODBC 支持单个应用系统访

问多个不同的数据库管理系统(DBMS)。

专用接口针对具体的数据库管理系统而设计,通过专用接口可以将 PowerBuilder 连接到

相应的数据库上。

2.2.1 创建 ODBC 数据源

ODBC 数据源指明了数据库的基本属性,如物理数据库的位置、数据库驱动程序(即是

哪一种数据库)、用户名、口令等。通过 ODBC 数据源可以不关心物理数据库。多个 ODBC

数据源可以指向同一个物理数据库。

创建 ODBC 数据源的工作既可以使用数据库画板完成,也可以在 Windows 的控制面板中

“ODBC 数据源”管理来完成。使用数据库画板完成创建 ODBC 数据源的方法如下。

如图 2.2 所示,双击“Object”子窗口中的“ODB ODBC”→“Utilities”→“Create ODBC

Data Source”,弹出“创建新数据源”对话框,如图 2.5 所示;选择“用户数据源”单选项,

单击“下一步”按钮,进入“创建新数据源”对话框的选择数据源驱动程序的界面,如图

2.6 所示。也可以通过双击“Object”子窗口中的“ODB ODBC”→“Utilities”→“ODBC

Administrator”,进入“ODBC 数据源管理器”,如图 2.7 所示;单击“添加(D)”按

Page 36: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·26·

钮,进入图 2.6 所示的对话框,选择数据源驱动程序。

图 2.5 “创建新数据源”对话框

图 2.6 选择数据源驱动程序界面

图 2.7 ODBC 数据源管理器

Page 37: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·27·

在图 2.6 所示的界面中,选择合适的数据源,在这里选择“Adaptive Server Anywhere 8.0”,

连续单击“下一步”按钮,单击“完成”按钮,进入“ODBC Configuration for Adaptive Server

Anywhere”对话框,如图 2.8 所示。本对话框包括 5 个页面,在“ODBC”页面的“Data Source

Name”框中需要输入由用户定义的数据源名,如 bussiness;在“Login”页面的“User ID”

框中需要输入用户名,如 dba;在“Password”框中需要输入口令,如 sql;在“Database”页

面的“Database Name”框中需要输入数据库名,如 bussiness,也可单击“Browse�”按钮到

磁盘中寻找。

图 2.8 “ODBC Configuration for Adaptive Server Anywhere”对话框

2.2.2 连接数据库

完成数据源的创建之后,就要进行数据库的连接。PowerBuilder 开发环境连接到数据库

的工作实际上要经过两个步骤。 第一步,建立数据库描述文件或设置连接参数。这一工作通过下列两种方法都可以完成。 第一种方法:应用“TOOL→Database Profile”菜单或“DB Profile” 工具栏,打开

“Database Profiles”对话框,如图 2.9 所示,选择“ODB ODBC”,单击鼠标右键后选择“New Profile”或单击“New�”按钮,弹出“Database Profile Setup - ODBC”对话框,如图 2.10所示。在“Profile Name”框中输入配置名,如 bussiness;在“Data Source”框中输入或选择

数据源名,如 bussiness;在“User ID”框中输入用户名,如 dba;在“Password”框中需要

输入口令,如 sql;然后单击“OK”按钮,完成这一步的工作。 第二种方法:应用“TOOL→Database Painter”菜单或“Database” 工具栏即数据库

画板,选择“ODB ODBC”,单击鼠标右键后选择“New Profile”,也可弹出如图 2.10 所示的

对话框,然后完成后续工作。 第二步,连接到 ODBC 数据库。若采用第一步中的第一种方法,可在“Database Profile”

对话框中,如图 2.9 所示,选择“ODB ODBC→bussiness”,单击鼠标右键后选择“Connect”

Page 38: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·28·

或单击“Connect�”按钮,将开发环境连接到相应的数据源上。若采用第一步中的第二种方

法,直接在数据库画板上选择“ODB ODBC→bussiness”,单击鼠标右键后选择“Connect”, 即可完成连接 ODBC 数据源的工作。

图 2.9 “Database Profiles”对话框

图 2.10 “Database Profile Setup—ODBC”对话框

2.3 操纵数据库表

数据库连接成功后,就可以创建、修改和删除表(Table),创建和删除索引(Index),

Page 39: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·29·

创建、修改和删除主键(Primary Key)和外部键(Foreign Key),查看与编辑数据等。

数据表是一个二维表,表示一个关系数据模型中的关系。由列表示字段(或域),由行

表示元组(或记录)。

注意:

(1)在 PowerBuilder 中不能用汉字作为数据表的列名。

(2)Integer 型数据由系统定义长度。

(3)数据的长度就是数据表的列的宽度。

创建表实际上就是定义构成表的各列的特性,即列属性。列属性分为基本属性和扩展属

性。基本属性必须加以定义,包括列名称、列数据、列宽度、小数位数、是否为空以及默认

值,其中小数位数只有当数据类型为数值型时才需要加以定义。扩展属性主要用于定义列的

显示格式、编辑风格和有效性规则。

2.3.1 创建表

创建表即是定义表结构。

单击工具栏中的“Create table”按钮 ,或在数据库画板中,在刚创建的数据库的

“Table”项上,单击鼠标右键,如图 2.11 所示,选择“New Table”项后单击鼠标左键,即可

打开列视图,如图 2.12 所示。

图 2.11 创建表

图 2.12 列视图

在列视图中,每一行定义表的一个列的属性。列属性包括如下信息(按 Tab 键将输入焦

点移动到下一栏,按 Shift+Tab 键将输入焦点移动到上一栏)。

Column Name:表的列名,使用标识符作为列名;

Data Type:指定列的数据类型,PowerBuilder 以列表形式列出当前数据库支持的所有类

型,可从中选择所需要的类型;

Width:列的宽度;

Dec:小数位数,只有当列的数据类型选择为 Decimal 或 Numeric 时才需要输入这个值,

它表示小数点后数字的位数;

Page 40: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·30·

Null:是否允许为空值,Yes 表示允许,No 表示不允许;

Default:设置该列的默认值。

输入完表列的各种属性后,将输入焦点定位在上部的任意编辑框中,按回车键系统自动

插入下一列。

定义了表的所有列后,单击工具栏中的“Save”按钮 ,打开“Greate New Table”对

话框,在该对话框中的“Table Name”中输入表名,所有者为 dba。然后,单击“OK”按钮,

关闭对话框并保存所创建的表结构,此时表中尚无记录。

使用上述方法,建表 t_shop,如图 2.13 所示。

图 2.13 建好的表 t_shop

2.3.2 修改表结构

修改表结构时只能修改非关键描述,不能对已经定义过的列数据类型进行修改。修改表

的操作可以在数据库画板中完成。首先找到要修改的表,单击鼠标右键,弹出菜单,如图 2.14

所示;选择“Alter Table”项后单击鼠标左键,弹出如图 2.12 所示的列视图,修改相应的列

或增加、删除列。增加、删除列可在列视图中相应的列的最左端的方块处,单击鼠标右键,

弹出菜单,如图 2.15 所示,选中相应的项单击鼠标左键,完成操作。

图 2.14 表的修改 图 2.15 列的修改

2.3.3 删除表

当一个和多个数据表不再使用时,可以将其删除。删除一个数据表要十分慎重,数据表

一旦删除,就不可以再恢复。在数据库画板中,选择要删除的表,单击鼠标右键,选择“Drop

Page 41: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·31·

Table”项后单击鼠标左键,完成操作。

2.4 定义列的扩展属性

列的“属性”对话框不但可以对列进行“扩展属性”

的设置,更主要的是能够新建和修改“扩展属性”的属性值

选项。在数据库画板中,找到相应的表列,单击鼠标右键,

弹出菜单,如图 2.16 所示;选择“Properties”项后单击鼠

标左键,弹出如图 2.17 所示的“属性”对话框。

“属性”对话框有 General(普通)、Headers(标题)、

Display(显示)、Validation(有效性)和 Edit Style(编

辑风格)5 个选项页面,右边的 3 个选项页面 Display、

Validation 和 Edit Style 用于定义列的扩展属性。

图 2.17 列属性对话框

1.普通属性(General)

普通属性页面是进入“属性”对话框后即出现的页面。

2.标题属性(Headers)

标题属性项包括列的扩展属性中的“表头”和“标签”两个属性,并可以改变“表头”

和“标签”的位置。

3.显示属性(Display)

显示属性项中,可以定义新的显示格式,也可以修改已有的显示格式定义。

4.有效性属性(Validation)

有效性属性用于对输入数据的进行限制。

图 2.16 列操作

Page 42: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·32·

5.编辑风格属性(Edit Style)

编辑风格属性项的主要功能是修改已有的“编辑”属性值,或定义新的“属性”值。

2.5 创建索引键及主关键字

定义完构成表的各列的基本属性后,可以说已经建立了表,但是创建表的目的是为了向

表中存储数据,而仅定义各列基本属性后尚不能向表中输入数据,这是因为在 PowerBuilder

中要向表输入数据,必须为表定义一个惟一索引或主关键字。

2.5.1 建立主关键字

主关键字简称主键。主键是表中惟一标识一个记录的列或列的组合,由一个数据表中的

一个或几个列组成。一个表只能有一个主键,该主键无名称。主键设置后,就不能再改变。

如果对当前的主键不满意,惟一的办法就是删除它,然后重建一个

新的主键。

能够作为主键的列,其 NULL 值必须为 No,即作为主键的列值

不能为空。选定表后建立主键有下列两种途径:

� 在展开的表名下用鼠标右键单击 Primary Key 项,然后选择弹出

�的 New Primary Key 菜单项;

� 在数据库画板 PainterBar 的下拉图标列表框 中选择“Create

��new primary key for selected table”工具按钮。

进入主键设置对话框后选择相应的列作为主键,如图 2.18 所示,

然后单击“PainterBar”上的“Save”按钮存盘,完成主关键字的建

立,这时在“ObjectLayout”子窗口中可看到相应的标志 。

2.5.2 建立外部关键字

外部关键字简称外键,外键与主键相对而言,用来连接多个表。外键是指一个数据表与

另一个或另几个数据表相联系的一个键。一个表可以有多个外键,且每个外键要有一个名称。

建立了外键以后,就可以通过主键打开与之有外键相连的所有数据表。选定表后建立外键有

下列两种途径:

� 在展开的表名下用鼠标右键单击 Foreign Key 项,然后选择弹出的 New Foreign Key 菜

单项;

� 在数据库画板 PainterBar 的下拉图标 列表框中选择“Create new foreign key for

selected table”工具按钮。

进入外键设置对话框后有两个选项卡。

(1)General 选项卡:在这里要为外键指定一个名称,并要选择构成外键的字段,如图

2.19 所示。

(2)Primary Key 选项卡:在这里要确定构成外键的字段属于哪个表的主键,如图 2.20

所示。

图 2.18 创建主键

Page 43: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·33·

图 2.19 创建外键的 General 选项卡 图 2.20 创建外键的 Primary Key 选项卡

以上项目确定后单击 PainterBar 上的“Save”按钮存盘,完成外键的建立,这时在

ObjectLayout 子窗口中可看到标志 。

2.5.3 建立索引

建立索引只会改变数据表中的逻辑顺序,不会改变数据表中的记录的物理顺序。也可以

通过建立惟一索引的方法向数据表中输入数据和修改表中已有的数据。一个表中可有多个索

引键,通过索引名称来区别。选定表后建立索引有以下两种途径:

� 在展开的表名下用鼠标右键单击 Index 项,然后选择弹出的 New Index 菜单项;

� 在数据库画板 PainterBar 的下拉图标列表框中选择“Create new index for selected table”

工具按钮。

进入索引设置对话框后进行如下选择。

(1)索引名称(Index):由于一个表可以建立多个索引,所以这里必须指定名称。

(2)选择建立索引的字段,可以选择一个或多个字段。

(3)指定索引是否惟一(Unique),如果是则选中复选框 Unique。

(4)说明索引是按升序排列还是降序排列,如果是升序则选中复选框 Ascending,否则是降序。

以上项目确定后单击 PainterBar 上的 Save 按钮存盘,完成索引的建立,这时在

ObjectLayout 子窗口中可看到标志 。

创建好主键、索引键和外键后,在 ObjectLayout 子窗口中右击选择 Show Referential

Integrity 菜单项,可以通过视图的方式来展示表之间的关系,如图 2.21 所示。

这是主键

这是表 t_input 的外键。

表中的 id 列的有效值必须

是表 t_shop 中 id 列的值

图 2.21 通过视图的方式来展示表之间的关系

Page 44: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·34·

2.5.4 删除主键、外部键与索引键

1.删除主键

(1)单击要删除的主键标志,右击选择“Drop Primary Key”,出现提示信息框。

(2)单击提示信息框中的“是”按钮,结果就将所选择的主键删除。

2.删除外键

(1)单击要删除的外键标志,右击选择“Drop foreign Key”,出现提示信息框。

(2)单击提示信息框中的“是”按钮,结果就将所选择的外键删除。

3.删除索引键

(1)单击要删除的索引键标志,右击选择“Drop Index”,出现提示信息框。

(2)单击提示信息框中的“是”按钮,结果就将所选择的索引键删除。

2.6 表中数据的浏览、修改和输出

通过上一节对数据表的操作后,可以往表中输入数据,也可以查看和修改数据。与此相

关的工具栏是数据操作工具栏,如图 2.22 所示。

图 2.22 数据操作工具栏

图 2.22 中的图标依次为:Retrieve(恢复)、Save Changes(保存修改)、Insert Row(插

入行)、Delete Row(删除行)、First(翻到第一页)、Prior(翻到前一页)、Next(翻到下

一页)、Last(翻到最后一页)、Print(打印)。

在数据画板中,选定表后单击鼠标右键弹出菜单,如图 2.23 所示;单击“Edit Data”后

有 3 种选择:Grid——表格格式,Tabular——列表格式,Freefrom——自由格式。单击这 3

个选项中的任何一个,都将打开输入视图区,利用该视图区可以输入、浏览、修改、保存表

中的数据。如通过 Insert Row 在表中插入一空行,从而可向表中输入数据,如图 2.24 所示。

图 2.23 向表中输入数据的菜单

Page 45: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·35·

图 2.24 向表中输入数据

2.7 视图

视图是一种特殊的虚拟表,可以像表一样地被访问和被使用。但视图并不是真正的表,

它没有自己的数据,在数据库中并不存在视图的物理结构。它的数据来自一个或多个数据库

中的表和视图。视图在数据库中是作为查询来保存的。当引用一个视图时,数据库管理系统

就执行相应的查询,并将查询结果作为视图来使用。使用视图的好处在于隐藏数据库中表的

真正结构,只向用户提供需要的并且有访问权限的字段,这样既方便了用户,也可以保证数

据库中表的安全性。

视图一旦建好,就不能修改。如果对当前的视图不满意,惟一的办法就是删除它,然后

重建一个新的视图。

2.7.1 创建视图

下面通过创建一个视图,统计某一商品的库存量。打开数据库画板,连接要创建视图的

数据库并展开,鼠标右键单击 Views,出现弹出式菜单,选择“New View”命令,出现标题

为“Select Table”的窗口,如图 2.25 所示;选择要作为视图数据源的表或视图,这里选择

t_shop,t_input,t_out 3 个表,单击“Open”按钮,打开视图画板工作区,如图 2.26 所示。

图 2.25 选择表

在视图画板工作区中,选择要在视图中显示的列,并在上图底部的 Where 选项卡中设置

检索条件,如图 2.27 所示;如果想查询所有商品的库存可省略此项。

然后,在分组选项卡中设置分组,如图 2.28 所示;在计算选项卡中设置计算公式,如图

2.29 所示;最后,保存视图。视图的命名一般以“v_”作为前缀,此处取名“v_shop_query”。

计算结果如图 2.30 所示。

Page 46: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·36·

图 2.26 视图画板工作区

图 2.27 视图画板工作区 Where 选项卡

图 2.28 视图画板工作区 Group 选项卡

图 2.29 视图画板工作区 Compute 选项卡

Page 47: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·37·

图 2.30 库存量视图计算结果

2.7.2 删除视图

在数据库画板工作区,选择要删除的视图,单击鼠标右键,出现一个菜单,选择“Drop

View”菜单项,这时将出现一个题为“PowerBuilder”的窗口,询问是否要删除选定的视图。

本 章 小 结

本章首先介绍了数据库接口及与数据库的连接,然后阐述了连接到数据库之后如何操作

数据库,这些操作包括创建表,删除表,创建索引和主关键字以及创建和删除视图等。这些

操作在 PowerBuilder 9.0 中都被集成在数据库画板中,因此通过在库画板调用、打开相应的画

板或使用其他工具来操作数据库。

练 习

1.什么是数据库画板的图标按钮、菜单和工作区?

2.什么是主键、外键和索引?

3.什么是视图?怎样创建视图?如何预览视图?

4.创建一个 student.db 数据库,在库中创建一个表 class,表中应包括下面 5 列。

(1)学号:no,字符型,宽度为 10。

(2)姓名:name,字符型,宽度为 15。

(3)性别:sex,字符型,宽度为 1;男用“1”表示,女用“0”表示。

(4)家庭地址:addr,字符型,宽度为 100。

(5)所在班级:id,字符型,宽度为 9。

设学号为主键,并向表中添加 5 条记录。

5.建立学生成绩管理库,应包含学生(Student)、课程(Course)和成绩(Grade)3

个表,它们的字段名和类型如下。

(1)Student(学生表):

sno(学号)主键 char(7)

sname(姓名) char(10)

Page 48: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·38·

sex(性别) char(2)

birthday(出生日期) datetime

wherefrom(生源) char(6)

his(简历) text

(2)Coures(课程表):

cno(课程编号)主键 char(6)

cname(课程名称) char(20)

type(类型) char(1)

hours(学时) integer

(3)Grade(成绩表):

sno(学号) char(7)

cno(课程编号) char(6)

score(成绩) decimal(5,1)

6.按照第 1 章第 5 节所述实例,继续完成本章所建 bussiness 数据库中其他表的创建,

建立相应的连接,并创建一个视图计算出客户的应收款。

主键

Page 49: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·39·

第 3 章 PowerBuilder 编程

3.1 PowerBuilder 编程语言基础

每种编程语言都有一组基本的语法约定,PowerBuilder 也不例外。PowerScript 是

PowerBuilder 的编程语言,如事件处理程序、用户自定义函数等都是使用 PowerScript 语言编

写的。PowerScript 是一种自由格式的语言,它很宽容,也就是说,语句行中的空格、缩进等

格式编排信息完全被编译器忽略;所以为了阅读方便,可以随意安排语句行的位置。

3.1.1 断行、续行与多条语句

通常情况下,PowerScript 的一条语句书写在一行上,语句书写完毕后,按 Enter 键(回

车键)转到下一行,开始下一条语句。有时候,为了阅读方便等原因,需要把一条语句书写

在几行上,这时就需要使用续行符了。

PowerScript 的续行符为符号&,它放在一行的末尾,指示下一行是当前行的继续。例如:

MessageBox("出错信息","这个错误很长,我们使用了续行符,请检查!") 书写在两行上:

MessageBox("出错信息","这个错误很长,我们使用了续行符,&

请检查!")

3.1.2 注释

注释是添加在程序中的一些说明性文字,PowerBuilder 并不执行任何注释,而是简单地

跳过它。PowerScript 的注释有两种方式:行注释和块注释。如果你熟悉 C 语言,就会发现

PowerScript 的注释方式与 C 语言完全相同。

1.行注释

行注释以双斜线//开始,其后书写注释内容,到行尾结束,例如:

//这是一条行注释

Open(w_main) //打开主窗口

2.块注释

块注释以符号/*开始,到符号*/结束,不管其中夹了多少东西,它们都是注释,例如:

/*

函数返回值为:

0 ——正常

Page 50: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·40·

-1——出错

*/

3.使用工具的方法

在 PowerBuilder 9.0 的编程窗口中,单击工具栏上的 Comment 图标 ,系统自动将光

标所在行变为注释;单击 Uncomment 图标 ,系统自动将光标所在的注释行变为语句行。

3.1.3 标识符

标识符是程序中用来代表变量、标号、函数、窗口、控件、对象等名称的符号,PowerBuilder

中的标识符遵从下述规则。

� 必须以字母开头;

� 其余字符可以是字母、数字及下述的特殊符号:下划线(_)、短横线(-)、美元符号

($)、号码符号(#)、百分号(%);

� 最长 40 个字符,且中间不能插入空格;

� 保留字不能用做标识符,因为它们已有特殊的含义;

� 标识符不区分字母的大小写。

3.1.4 特殊 ASCII 码字符

在字符串中可以包括特殊的 ASCII 码字符,常用的特殊字符如表 3.1 所示。

表 3.1 特殊的 ASCII 码字符

特 殊 字 符 表 示 方 法

双引号(") ~"

单引号(’) ~’

波浪号(~) ~~

回车符(Carriage Return) ~r

换行符(form Feed) ~f

新行(New Line) ~n

退格符(Backspace) ~b

制表符(Tab) ~t

八进制形式的 ASCII 码 ~0000 到~0377

十进制形式的 ASCII 码 ~000 到~255

十六进制形式的 ASCII 码 ~h00 到~hFF

波浪号“~”用于引用特殊 ASCII 字符。

以下是两个示例:

string s1="She couldn~’t help me . " //字符串中使用单引号

string s2="北京 清华大学 ~r~n 计算机系" //运用~r~n 组合符将字符串分成两行显示

Page 51: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·41·

3.1.5 空值

空值(NULL)是 PowerBuilder 与数据库交换数据时使用的一种特殊值,代表数据未定

义或不确定,它与空字符串、数值零、以及日期 00-00-00 的意义完全不同。

PowerBuilder 的所有数据类型都支持空值,但 PowerBuilder 并不将空值作为默认值。例

如,说明变量时,PowerBuilder 把 0 赋给数值型变量,把 False 赋给布尔型变量,把空串("")

赋给字符串变量。

PowerBuilder 的所有数据类型都支持空值,变量被赋予空值的途径有以下两条:

� 从数据库中读到空值;

� 使用 SetNull()函数赋值;

例如:String person

SetNull(person) 测试变量或表达式是否为空值时,使用函数 IsNull(),而不是直接使用关系表达式。

例如,a 是个变量,要测试它是否为空值,可以这样写:IF IsNull(a) THEN � 下面的写法是错误的:

IF a=NULL THEN �

原因在于空值不等于任何值,也不等于另一个空值。

3.1.6 对象、属性、函数和事件的引用方法

PowerBuilder 应用程序的开发过程实际上就是各种对象的定义和使用过程。所有对象都

有名称,并通过名称相互区分。在 PowerScript 中,访问对象的属性、函数、事件的方法很简

单,就是使用圆点作为标记符。

(1)程序中访问对象属性的格式为:对象名.对象属性。

例如,把单行编辑框 sle_1 的用户输入内容送到字符串变量 UserEnter 的语句可以写成:

UserEnter = sle_1.Text

其中,sle_1 是一个单行编辑框对象的名称,Text 是单行编辑框的 Text 属性。

(2)程序中访问对象的函数格式为:对象名.函数名([参数表])。

例如,想把输入焦点移动到单行编辑框 sle_1 上,程序中写上语句:sle_1.SetFocus( )

3.1.7 代词

PowerBuilder 提供了几个代词用于指定特定的对象。在程序中使用代词的好处是避免硬

代码,以便做到通用化。PowerBuilder 提供了 4 个代词,分别为 This、Parent、ParentWindow

和 Super,其中前 3 个代词应用广泛,下面介绍这些代词的意义和用法。

1.This

This 代表窗口、用户对象、菜单、应用对象或控件本身,即代表正在为之编写事件处理

程序的对象。

例如,窗口中有一个名称为 cb_button 的按钮,按钮上显示的文本为“请单击”,在该按

Page 52: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·42·

钮的 Clicked 事件处理程序中可以写上代码:

cb_button . text="再单击一次" 修改为:

This . text="单击一次" 这里的 This 代表该按钮(因为我们在对按钮的 Clicked 编写事件处理程序)。

2.Parent

Parent 指当前控件所在的窗口。

例如,窗口 w_main 中有个按钮 cb_close,其功能是单击后关闭窗口 w_main,则可以在

按钮的 Clicked 事件处理程序中写上代码:close(w_main)

但采用代词 Parent 把这条语句修改为:close(Parent)后,则使代码具备更强的通用性和可

移植性,并且也更容易理解。

3.ParentWindow

ParentWindow 代表运行时菜单所在的窗口,该代词只能在菜单的事件处理程序中使用。

例如,在“关闭窗口”菜单项的 Clicked 事件处理程序中写上代码:close(ParentWindow),单

击该菜单项时就会关闭与之关联的窗口,而不管窗口的具体名称叫什么。

4.Super

Super 用来调用当前子孙对象所对应祖先对象中的事件处理程序或函数。这里所说的

子孙对象和祖先对象是指具有直接继承关系的两个对象,子孙对象包括由祖先对象直接派

生出来的窗口、菜单、用户对象以及用户对象中的控件等。

调用祖先对象事件处理过程的语法格式为:

Call Super ::<事件名> 或 Super ::Event <事件名>() 调用祖先对象函数的语法格式为:

Super ::<函数名>({参数列表})

3.1.8 保留字

保留字是 PowerBuilder 内部使用的一组单词,有着特殊的含义,不能再把它们用做标识

符,如表 3.2 所示。

表 3.2 PowerBuilder 中的保留字

alias and* autoinstantiate call case catch

choose close* commit connect constant continue

create* cursor declare delete describe* descriptor

destory disconnect do dynamic else elseif

end enumerated event execute exit external

false fetch finally first for forward

from function global goto halt if

Page 53: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·43·

续表

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 yreadonly ref

return rollback rpcfunc select selectblob shared

static step subroutine super system systemread

systemwrite then throw(s) this to trigger

true try type until update* updateblob

using variables while with within _debug

表 3.2 中打星号“*”的保留字也在作为函数名使用。同普通标识符一样,保留字也不区

分字母的大小写。在 Powerbuilder 的 Script 窗口中,保留字一般显示为绿色。

3.2 数据类型与说明

与其他编程语言相似,PowerBuilder 也有数据类型的概念,并且数据类型的品种齐全、

丰富,包括标准数据类型、系统对象数据类型和枚举类型三大类,程序中通过数据类型限定

变量的取值范围。

除了系统预定义的 5 个全局变量(SQLCA、SQLDA、SQLSA、Error、Message)外,其

他所有变量在使用前必须首先说明。变量说明的格式和位置不同,它的有效范围(变量的作

用域)和可见性也不同。

本节重点介绍标准数据类型,扼要说明系统对象数据类型和枚举类型,然后阐述变量说

明的一般格式,最后介绍说明全局变量、实例变量、共享变量的步骤。

3.2.1 标准数据类型

PowerBuilder 的标准数据类型是在编程过程中经常要用到的数据类型,它们同常见的程

序设计语言有着非常相似的地方,如整型、实型、字符型等。PowerScript 目前支持表 3.3 中

所列的 14 种标准数据类型。

表 3.3 标准数据类型

数据类型 相 关 说 明

Boolean 布尔型数据类型,用于逻辑判断。只有两个可能的值:TRUE 或 FALSE

Char 或 Character 字符数据类型,用来存储一个 ASCII 码字符。Char 型常量的两边使用单引号(’)或双引

号(")将其括起来

Blob 二进制大对象数据类型,用于存储大规模的数据,如声音、图像、大型文本等

Date 日期数据类型,用来存储日期值。年、月、日之间用短横线(-)分隔,如 2003-01-01,

其中年份的取值范围需在 1000~3000 之间

Page 54: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·44·

续表

数据类型 相 关 说 明

DateTime

日期时间数据类型,仅用于访问数据库中的 DateTime 型字段。当需要时,可使用

Date(datetime)或 Time(datetime)函数从 DateTime 类型的值中取得 Date 或 Time 类型的值。

也可使用 DateTime(date,time)函数合成 DateTime 类型的值

Dec(或 Decimal) 带符号的十进制数字数据类型,用来表示对精度要求较高的数字数据。它最多可以有 18

位有效数字

Double 带符号的双精度浮点数数据类型,可有 15 位有效数字

Int(或 Integer) 整型数据类型,带符号,是最常用的数据类型之一;每个变量占用 16 位的存储空间,取

值范围:-32768 ~ +32767

Long 长整型数据类型,带符号,32 位带符号整数,每个变量占用 32 位的存储空间,取值范

围:-2147483648~ +2147483647

Real 带符号的单精度浮点数数据类型,可有 6 位有效数字

String 字符串数据类型,用来存储可变长度的字符串,是最常用的数据类型之一

Time 时间数据类型,采用 24 小时制,时、分、秒之间用冒号(:)分隔

Uint 无符号的整型数据类型,每个变量占用 16 位的存储空间,取值范围:0 ~ 65535

ULong 无符号的长整型数据类型,每个变量占用 32 位的存储空间,取值范围:0 ~ 294967295

注意:Date 类型中的年、月、日必须严格按 4 位、2 位、2 位来书写,Time 类型中的时、

分、秒必须严格按 2 位、2 位、2 位来书写,不足位的地方用 0 填充。

3.2.2 枚举类型

枚举类型是 PowerBuilder 定义的特殊常量,常用于系统定义函数的参数,也能够用于指

定对象或控件的属性。

(1)在 PowerBuilder 中开发人员不能定义自己的枚举类型,而只能按系统要求使用它。

(2)枚举类型实际上是一组值,每个值都以英文单词开始,以感叹号(!)结束。

例如:定义多行编辑框对齐方式的枚举类型为 Alignment ,其取值为:

Center! Justify! Left! Right!

(3)程序中可以使用赋值语句给 Alignment 类型的变量或属性赋值。

例如:下述语句将多行编辑框 mle_1 的对齐方式设置为居中对齐:

mle_1.Alignment = Center!

3.2.3 系统对象数据类型

在 PowerBuilder 中,窗口、菜单、各种控件都是系统对象,每一种系统对象实际上都是

定义在 PowerBuilder 内部的一种数据类型。一般情况下,不必把这些对象当做数据类型来考

虑,只需在相应画板中定义它们即可。

利用系统对象类型可以说明对象数据类型变量,例如:

window mywin //说明窗口变量

menu mymenu //说明菜单对象变量

Page 55: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·45·

3.2.4 变量说明

在 PowerBuilder 中,变量使用之前都要首先予以说明。

变量说明的语法格式为:

数据类型 变量名[=初值][,变量名[=初值]]⋯⋯

(1)变量名必须是标识符。

例如:说明一个整型变量,其语法格式为:

Integer i

(2)说明多个变量时,变量名之间用逗号(,)分隔,变量名用合法的标识符表示。

例如:

Integer tx1 // 说明一个整型变量

Real a,b,c //说明三个实型变量 a,b,c

String my_home //说明一个字符串变量 my_home

(3)在说明变量的同时,可以同时指定变量的初值。

例如:

Integer ii_total=100 //说明整型变量 ii_total,并赋予初值

String ls_city="北京",ls_County //说明变量 ls_city 并赋初值,说明变量 ls_County,其初值使

用字符串类型变量的默认值空串("")

3.2.5 数组

数组代表一系列具有相同类型的变量,它们共用一个变量名,通过下标访问数组中的每

个元素。例如:

Integer person[30] //说明了整型数组 person,它有 30 个元素,下标从 1~30

3.2.6 变量的作用域

作用域定义变量在什么范围内有效。按作用域的不同,PowerBuilder 的变量共有 4 种:

全局变量、实例变量、共享变量和局部变量。不同作用域的变量需要在不同的位置说明。

1.全局变量

全局变量(Global Variables)在整个应用程序中都可访问,它的作用域是整个应用程序。

2.实例变量

实例变量(Instance Variables)与对象相关联,只有在该对象的事件处理程序或函数中才

能使用。

3.共享变量

共享变量(Shared Variables)是一种静态变量,这不仅意味着它所在的对象关闭后再次

Page 56: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·46·

打开时,共享变量依然保持对象关闭时的值,而且还意味着同一个类多个实例中的同名共享

变量保持相同的值。

4.局部变量

局部变量(Local Variables)在使用它的事件处理程序或函数中说明,其作用域仅限于说

明它的程序段,在该程序段的任何地方均可访问局部变量,但其他程序段都不能访问本程序

段中的局部变量。

5.优先级顺序

� 局部变量;

� 共享变量;

� 全局变量;

� 实例变量。

3.2.7 常量说明

在编程过程中,有些数据在程序的整个运行过程中均保持不变,则这些数据在使用前适

宜声明成常量。将这些数据声明成常量可以简化数据的书写,避免发生不经意的修改。同时,

提高了程序代码的可读性和可维护性。

声明常量时需使用关键字 CONSTANT,其语法格式为:

CONSTANT datetype constname=value 例如:CONSTANT real pi=3.1415926

3.3 运算符和表达式

操作符代表了符号化的运算,PowerScript 利用操作符构成表达式,完成一定的运算。

PowerScript 支持的操作符可分为 4 种类型:算术操作符、关系操作符、逻辑操作符、连接操

作符 。

1.算术操作符

算术操作符:+(加)、-(减)、-(负号)、*(乘)、/(除)、^(乘方)。

扩展算术操作符:++、--、+=、-=、*=、/=、^=。

在使用减号(-)、负号(-)、减 1(--)运算符时,必须在这些运算符的两边都加上

个空格。

2.关系操作符

关系运算符有 6 个:>、>=、<、<=、=、<>。

3.逻辑操作符

逻辑运算符有 3 个:NOT、AND、OR。

Page 57: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·47·

4.连接操作符

连接操作符“+”,用于把两个 String 型的变量内容连接在一起,形成新的字符串。例如:

string Test = "北京" + "海淀" // Test 中包含"北京海淀"

5.操作符的优先级

在表达式中,运算按操作符的特定次序进行,这一次序就是操作符的优先级。优先数越

小,优先级越高,如表 3.4 所示。

表 3.4 运算符列表

优先数 操 作 符 说 明

1 ( ) 括号,优先级最高

2 +、- (单目) 一元正、负操作符

3 ^ 幂运算

4 *、/ 乘、除运算

5 +、- 加、减运算以及连接运算

6 =、<、>、< >、<=、>= 关系运算

7 NOT 逻辑反

8 AND 逻辑与

9 OR 逻辑或,优先级最低

3.4 基本语句

3.4.1 赋值语句

赋值语句用于给变量、对象属性赋值,这是应用程序中使用最频繁的语句,其语法格式

为:variablename = expression。其中:

(1)variablename 是变量名或对象属性。

(2)expression 是表达式,其数据类型应该与 variablename 的数据类型兼容。

下面是赋值语句的几个简单示例:

Address = "北京"

TaxRate = .05

Age = 30

mle.text="春眠不觉晓,处处闻啼鸟" PowerScript 的赋值语句不支持多重赋值,也就是说,一条赋值语句只对一个变量赋值,

不能同时对多个变量赋值。

例如,语句 A=B=0。

在有些编程语言中可同时把 A 和 B 均赋值 0,但在 PowerScript 中,该语句等价于:

A=(B=0)。

Page 58: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·48·

其意义为,检查 B 等于 0 是否成立,成立时将 True 赋给变量 A,否则把 False 赋给变量

A。如果 A 不是 Boolean 类型的变量,则上述语句将引起编译错误。

3.4.2 条件语句

条件语句有两种形式,下面按照从简单到复杂的次序逐一介绍。

1.单行 IF ... THEN 语句

单行 IF ... THEN 语句的格式为:

IF 逻辑表达式 THEN 语句 1 [ELSE 语句 2] 单行 IF ... THEN 语句书写时整条语句写在一行上,当逻辑表达式的结果为 True 时执行

语句 1,否则执行语句 2(如果有该子句的话)。

例如:

IF sle_State.text="BJ" THEN MessageBox("欢迎","北京")

2.多行 IF ... THEN 语句

多行 IF ... THEN 语句的语法格式为:

IF 逻辑表达式 1 THEN

语句 1

[ ELSEIF 逻辑表达式 2 THEN

语句 2

. . .

] [ ELSE 语句 n]

END IF

语句 n+1 本语句的执行过程为:计算逻辑表达式 1,如果其结果为 True,则执行语句 1,然后离

开整个 IF 语句, 去执行语句 n+1;否则计算逻辑表达式 2,如果其结果为 True,则执行语句 2,

然后离开整个 IF 语句,去执行语句 n+1;⋯⋯如果逻辑表达式的结果都是 False,且存在 ELSE

子句,则执行语句 n,然后离开整个 IF 语句,去执行语句 n+1。

【例 1】 从单行编辑框中输入考分,单击“输入”按钮再根据考分显示及格或不及格。

Double s

s = integer(sle_1.text) // sle_1.text 单行编辑框文本

If s < 60 then

St_1.text = "不及格" // St_1.text 静态编辑框文本

Else

St_1.text = "及格"

End if

【例 2】 从单行编辑框中输入考分,单击“输入”按钮后,再根据考分显示优、良、中、

及格或不及格。

Page 59: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·49·

integer s

s = integer(sle_1.text) //sle_1.text 单行编辑框文本

if 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 if

3.CHOOSE CASE 语句

CHOOSE CASE 语句根据测试表达式的值选择不同的操作,其语法格式为:

CHOOSE CASE 测试表达式

CASE 判断表达式

执行语句块

[CASE 判断表达式

语句块]

. . .

[CASE 判断表达式

语句块]

[CASE ELSE

语句块]

END CHOOSE 判断表达式可以使用下列形式:

� 用逗号分隔的一组数据,如 2,4,7。

� 用 TO 表示一个区间范围,如 2 TO 15。

� 用 IS 代表测试值,后跟关系操作符和比较值,如 IS > 30。

� 组合运用上述三种方法,并用逗号进行分隔,如 5,6,8 TO 12,IS > 20。

执行 CHOOSE CASE 语句时,PowerBuilder 将逐条查找 CASE,如果找到与测试值相匹

配的判断表达式,就执行该 CASE 后的语句块,然后执行 END CHOOSE 后的第一条语句。

如果 CHOOSE CASE 语句中包含 CASE ELSE 子句,则未找到任何匹配的 CASE 条件时,执

行 CASE ELSE 子句中的语句块。

【例 3】 从单行编辑框中输入考分,按“输入”按钮后,再根据考分显示优、良、中、

及格或不及格。用 CHOOSE CASE 重写例 2 程序如下。

Double f

String s

f = integer(sle_1.text)

CHOOSE CASE f

CASE IS >= 90 // 改进 90 TO 100

Page 60: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·50·

S = "优"

CASE 80 TO 89

S = "良"

CASE 70 TO 79

S = "中"

CASE 60 TO 69

S = "及格"

CASE 0 TO 59

S = "不及格"

CASE ELSE

S = "输入错,请重新输入!"

END CHOOSE

St_1.text = S 请读者改写上述程序中的语句,使程序更加严谨。

3.4.3 循环语句

各种语言都有自己的循环语句,PowerScript 也不例外。它的循环语句有 3 种形式:

DO �LOOP;FOR �NEXT;GOTO。将前两种形式与 EXIT 和 CONTINUE 语句配合使用,

可以完全抛弃 GOTO 语句,而且 DO �LOOP 本身有 4 种格式,丰富多彩的表达方式为编写

清晰流畅的程序提供了有效手段。 下面介绍 PowerScript 循环语句的格式、中途退出循环或中途开始下次循环的方法以及循

环嵌套的概念。

1.DO⋯LOOP 循环

DO⋯LOOP 结构提供了一种基于某个条件的灵活的循环方法,它有 4 种形式,分别为: � DO UNTIL condition � LOOP; � DO WHILE condition � LOOP(类似 c); � DO �LOOP UNTIL condition; � DO �LOOP WHILE condition (类似 c)。 DO 表示循环的开始,LOOP 表示循环的结束,condition 表示循环条件,是个逻辑表达式,

其值为 True 或 False。 (1)DO UNTIL condition � LOOP 的语法格式为:

DO UNTIL condition

Statements

LOOP 其执行过程为:先计算条件 condition,其结果为 False 时,执行语句块 Statements;接着

再检查条件,直到 condition 的结果为 True 时退出循环。 【例 4】 按计算按钮求 s = 1+2+3+⋯+10。 解 1:

integer i=1, s = 0

DO UNTIL i>10

Page 61: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·51·

s += i

i ++

LOOP

st_1.text = string(s)

(2)DO WHILE condition � LOOP 的语法格式为:

DO WHILE condition

Statements

LOOP 其执行过程为:先计算条件 condition,其结果为 True 时,执行语句块 Statements;接着

再检查条件,直到 condition 的结果为 False 时退出循环。 【例 5】 按计算按钮求 s = 1+2+3+⋯+10。 解 2:

integer i=1, s = 0

DO WHILE i<=10

s += i

i ++

LOOP

st_1.text = string(s)

(3)DO �LOOP UNTIL condition 的语法格式为:

DO

Statements

LOOP UNTIL condition 其执行过程为:先执行语句块 Statements,然后计算条件 condition;如果其结果为 False,

则继续执行语句块 Statements,直到 condition 的结果为 True 时退出循环。 【例 6】 按计算按钮求 s = 1+2+3+⋯+10。 解 3:解 1 与解 3 完全等价

integer i=1, s = 0

DO

s += i

i ++

LOOP UNTIL i>10

st_1.text = string(s)

(4)DO � LOOP WHILE condition 的语法格式为:

DO

Statements

LOOP WHILE condition 其执行过程为:先执行语句块 Statements,然后计算条件 condition;如果其结果为 True,

则继续执行语句块 Statements,直到 condition 的结果为 False 时退出循环。

Page 62: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·52·

【例 7】 按计算按钮求 s = 1+2+3+⋯+10。

解 4:解 2 与解 4 完全等价

integer i=1, s = 0

DO

s += i

i ++

LOOP WHILE i<=10

st_1.text = string(s) 在这 4 种循环结构中,前两种结构可以一次也不执行,后两种结构则至少执行一次。

实际上,只需要从前两种结构和后两种结构中各取其一就能表达所有的逻辑关系,但为

了更清晰地表达条件,PowerScript 还是提供了 4 种结构。

2.FOR NEXT 循环

FOR � NEXT 是个循环次数确定的循环结构,它使循环体内的语句执行规定的次数,其

语法结构为:

FOR varname = start TO end [STEP increment]

Statementblock

NEXT 其中,varname 是循环变量,可以是任意的数值类型,start、end 分别是循环变量的初值

和终值;increment 是每次循环后循环变量的步长增量(默认值为 1);statementblock 是一组

语句,称做循环体,方括号表示该子句可以省略。 FOR �NEXT 语句的执行过程为:循环变量 varname 从 start 开始,到 end 为止;重复执

行循环体,每执行一次,varname 被重新赋值,新值为 varname+ increment。另外,如果 start和/或 end 在循环体内被修改,将影响循环次数。

【例 8】 按计算按钮求 s = 1+2+3+⋯+10。 解 5:

Integer i, s = 0

for i=1 to 10

s += i

next

st_1.text = string(s)

3.含有 EXIT 和 CONTINUE 的循环

(1)EXIT(退出循环)。在循环语句的循环体中,若想在中途退出循环,使用 EXIT 语

句是个好办法。执行该语句后,程序的控制权转至循环语句后的语句。 在嵌套循环的情况下,EXIT 语句退出当前层循环,而不是所有循环。

【例 9】 下列程序运行后,变量 s 中的值是多少?

Integer i, j,s=0

for i=1 to 10

Page 63: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·53·

for j=1 to 10

if j>6 then

exit

end if

next

s = s + i

next

(2)CONTINUE(继续循环)。在循环语句的循环体中,遇到 CONTINUE 语句后,将

不执行 CONTINUE 语句后与循环结束前的所有语句,而开始新一轮循环。

请读者将【例 9】中的“exit”改为“continue”,结果又如何呢?

3.4.4 其他常用控制语句

除了上述的几种语句外,PowerScript 中的 CALL 语句、RETURN 语句以及 HALT 语句

使用得也较为广泛。下面介绍它们的用法。

1.CALL 语句

CALL 语句用于在派生对象的事件处理程序中调用祖先对象的事件和祖先对象中控件的

事件。

CALL 语句的语法格式为:

CALL 祖先对象{‘祖先对象中的某个控件}::欲调用的祖先对象的事件{形参表} 注:{}为可选项; CALL 语句只能用来调用事件,而不能用来调用函数。

下面对此语句的使用作几点说明:

(1)当要调用祖先对象中某个控件的事件处理程序时,控件名的前面需要带上一个反撇

号“‘”字符,此字符位于键盘上数字 1 键左边的那个键。

(2)调用当前对象的直接祖先(父对象)时,可使用代词 Super。

以下是相关的几个例子:

CALL w_demo:: Open //调用祖先窗口对象 w_demo 的 Open 事件

CALL w_demo ‘cb_close::Clicked //调用祖先窗口 w_demo 中 cb_close 控件的 Clicked

事件

CALL Super:: DoubleClicked(flags,xpos,ypos) //调用父对象的双击事件

2.RETURN 语句

在编写事件处理程序或函数时,使用 RETURN 语句返回控制给用户或调用函数的地

方。

RETURN 语句立即终止事件处理程序或函数的执行,把控制返回到调用程序,其语法格

式为:

RETURN { expression }

其中 expression 是一个表达式,其值作为事件处理程序或函数的返回值返回。

Page 64: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·54·

3.HALT 语句

当希望终止应用程序的运行时,使用 HALT 语句,其语法格式为:

HALT {CLOSE}

其中 CLOSE 是个可选项。当 HALT 语句不带 CLOSE 选项时,该语句立即终止应用程序的运

行;当 HALT 语句带 CLOSE 选项时,执行到该语句后,应用程序先执行应用对象的 Close

事件处理程序,之后再终止应用程序的运行。

【例 10】 出 10 道 100 以内的加法题,最后给出得分。

提示:rand(100)可产生 100 以内的随机数。

3.5 函数与事件的调用

3.5.1 常用函数

PowerScript 函数分为 3 类:系统函数、对象函数、数据窗口画笔函数。

� 系统函数在应用程序的任何地方都可以使用,且函数名无须限定。

� 对象函数在对象的生存空间中使用,且使用时通常采用“对象名.函数名”的格式。

� 数据窗口画笔函数在数据窗口画笔中使用,通常用于生成计算列、有效性检查规则、

检索条件、例外处理等。

1.消息函数 MessageBox()

MessageBox()函数常用于向用户显示出错、警告及其他重要信息,并且在开发过程中常

用它显示程序状态和重要变量的取值。MessageBox()函数在屏幕上显示一个窗口,用户在响

应该窗口后,程序才能继续运行下去。其语法格式为:

li_button_pressed=MessageBox ( title, text {,Icon ,Button{,Default}}) )

其中:

(1)参数 title 是个字符串(常量、变量均可),它指定显示窗口的标题。

(2)text 也是个字符串,它指定显示在窗口中的文本。

(3)其他参数可以省略,省略时按系统默认值处理。但如果使用了这些参数中的某个,

则语法格式中该参数前的所有参数都必须指定(例如,使用了 Default 参数,则所有参数都必

须使用)。

(4)参数 Icon 指定显示在窗口中的图标,它是枚举类型,可能取值为:

Information!(默认值) StopSign! Exclamation! Question! None!

信息图标� 停止图标 惊叹号图标 问号图标 无图标

(5)Button 参数指定在窗口中显示哪些按钮,有效取值为:

OK! “确定”按钮

OKCancel! “确定”、“取消”按钮

YesNo! “是”、“否”按钮

Page 65: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·55·

YesNoCancel! “是”、“否”、“取消”按钮

RetryCancel! “重试”、“取消”按钮

AbortRetryIgnore! “终止”、“重试”、“忽略”按钮

(6)Default 参数指定哪个按钮是默认按钮,即用户按下键盘上的 Enter(回车)键时,

执行哪个按钮的 Clicked(单击)事件,用数字 1、2、3 表示,默认值为 1。

MessageBox()函数的返回值是用户按下的按钮序号(从左边以 1 开始记数),数据类型

为 Integer(整型)。通过判断返回值,程序能够知道用户按了哪个按钮,从而决定下一步的

操作。例如:

li_rc=MessageBox (" 保 存 修 改 "," 你 修 改 了 数 据 窗 口 的 数 据 , 现 在 是 否 保 存 ?

",Question!,YesNoCancel!) //显示窗口的标题为:"保存修改",显示在窗口中的文本为:"你修改了数据

窗口的数据,现在是否保存?",图标为:问号图标,在窗口中显示“是”、“否”、“取消”按钮。

运行结果如图 3.1 所示。

图 3.1 “保存修改”对话框

2.日期函数

(1)RelativeDate(date,n)。

功能:得到指定日期前多少天或后多少天的日期。

参数说明:date——Date 类型,指定基准日期;n——integer 类型,指定天数。

返回值:Date。

用法说明:当 n 的值大于 0 时返回参数 date 指定日期后第 n 天的日期;当 n 的值小于 0

时返回参数 date 指定日期前第 n 天的日期;如果任何参数的值为 NULL,则 RelativeDate ()

函数返回 NULL。

【例 11】 下面的代码返回 1998-02-10。

RelativeDate(1998-01-31, 10)

【例 12】 下面的代码返回 1998-01-21。

RelativeDate(1998-01-31, - 10)

(2)DaysAfter(date1,date2)。

功能:得到两个日期间的天数。

参数说明:date1——date 类型,指定起始日期;date2——date 类型,指定终止日期。

返回值:Long。函数执行成功时得到两个日期之间的天数。

用法说明:如果 date2 的日期在 date1 的前面,那么 DaysAfter()函数返回负值。如果任何

参数的值为 NULL,则 DaysAfter()函数返回 NULL。

Page 66: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·56·

【例 13】 下面的语句返回 4:

DaysAfter(1996-12-20, 1996-12-24)

【例 14】 下面的语句返回-4:

DaysAfter(1996-12-24, 1996-12-20)

【例 15】 下面的语句返回 0:

DaysAfter(1996-12-24, 1996-12-24)

(3)Today()。

功能:得到当前系统日期,在某些情况下,同时得到当前系统时间。

返回值:Date。该函数返回当前系统日期。

(4)Year(date)。

功能:得到日期值中的年度,有效取值为 1000~3000。

返回值:Integer。

函数执行成功时得到 date 参数中的年份(采用四位数字),发生错误时返回 1900。如果

date 参数的值为 NULL,则 Year()函数返回 NULL。

(5)Month(date)。

功能:得到日期值中的月份,有效值在 1~12 之间。

返回值:Integer。

函数执行成功时得到 date 参数中的月份(1~12 之间)。如果 date 参数的值为 NULL,

则 Month()函数返回 NULL。

(6)Day(date)。

功能:得到日期型数据中的号数(1~31 之间的整数值)。

返回值:Integer。

函数执行成功时返回号数(1~31 之间的整数值)。如果 date 参数的值为 NULL,则 Day()

函数返回 NULL。

3.时间函数

(1)RelativeTime ( time, n )。

功能:得到指定时间前多少秒或后多少秒的时间,采用 24 小时制。

参数说明:time——time 类型,指定基准时间;n——long 类型,指定秒。

返回值:Time。

当 n 的值大于 0 时,返回参数 time 指定时间后第 n 秒的时间;当 n 的值小于 0 时,返回

参数 time 指定时间前第 n 秒的时间。

【例 16】 下面的代码返回 19:05:41:

RelativeTime(19:05:31, 10)

【例 17】 下面的代码返回 19:05:21:

RelativeTime(19:05:31, - 10)

Page 67: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·57·

(2)Now( )。

功能:得到客户机的当前系统时间,返回值为 Time 类型。

返回值:Time。该函数返回客户机的当前系统时间。

(3)Hour(time)。

功能:得到时间值中的小时,采用 24 小时制。

返回值:Integer。

函数执行成功时得到 time 参数中的小时(00~23 之间)。如果 time 参数的值为 NULL,

则 Hour()函数返回 NULL。

【例 18】 下述语句得到当前时刻的小时:

Hour(Now( ))

【例 19】 下述语句返回 19:

Hour(19:01:31)

(4)Minute(time)。

功能:得到时间值中的分钟,有效值在 00~59 之间。

返回值:Integer。

函数执行成功时得到 time 参数中的分钟(00~59 之间)。如果 time 参数的值为 NULL,

则 Minute()函数返回 NULL。

【例 20】 下述语句得到当前时刻的分钟:

Minute(Now( ))

【例 21】 下述语句返回 1:

Minute(19:01:31)

(5)Second(time)。

功能:得到时间值中的秒,有效值在 00~59 之间。

返回值:Integer。

函数执行成功时得到 time 参数中的秒(00~59 之间)。如果 time 参数的值为 NULL,

则 Second()函数返回 NULL。

【例 22】 下述语句得到当前时刻的秒:

Second(Now( ))

【例 23】 下面的语句返回 31:

Second(19:05:31)

4.计算函数

(1)Abs (n)。

功能:计算绝对值。

参数 n:要得到绝对值的数值型变量或表达式。

Page 68: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·58·

返回值:返回值的数据类型与 n 的数据类型相同,函数执行成功时返回 n 的绝对值。如

果参数 n 的值为 NULL,Abs()函数返回 NULL。

(2)Mod ( x, y )。

功能:求余数。

参数 x:数值型变量或表达式,被除数。

参数 y:数值型变量或表达式,除数。

返回值:以 x、y 中数据类型更精确的数据类型作为该函数的返回值数据类型。

函数执行成功时返回 x 除以 y 所得的余数 。如果任何参数的值为 NULL,Mod()函数返

回 NULL。

【例 24】 下面的语句返回 2:

Mod(20, 6)

【例 25】 下面的语句返回 1.5:

Mod(25.5, 4)

【例 26】 下面的语句返回 2.5:

Mod(25, 4.5)

(3)Rand (n)。

功能:得到 1 与 n 之间的一个伪随机数。

参数 n:数值型变量或表达式,指定要产生的伪随机数的上界,有效值在 1~32 767 之间。

返回值:与 n 的数据类型相同。

函数执行成功时返回 1~n 之间的一个伪随机数,包括 1 和 n 在内。如果参数 n 的值为

NULL,Rand( )函数返回 NULL。

【例 27】 下面的代码得到 1~100 之间的一个伪随机数:

Rand(100)

(4)Round ( x, n )。

功能:将 x 四舍五入到 n 位。

参数 x:要四舍五入的数值型数据。

参数 n:整数类型,指定从哪个小数位上四舍五入 x,有效值在 0~18 之间。

返回值:Decimal。

函数执行成功时返回将 x 四舍五入到小数点后第 n 位的数值,如果函数执行失败或任何

参数的值为 NULL,Round()函数返回 NULL。

【例 28】 下面的语句返回 9.62:

Round(9.624, 2)

【例 29】 下面的语句返回 9.63:

Round(9.625, 2)

【例 30】 下面的语句返回 9.600:

Page 69: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·59·

Round(9.6, 3)

【例 31】 下面的语句返回-9.63:

Round(-9.625, 2)

(5)Rand()。

功能:得到 1~n 之间的一个伪随机数。

语法:Rand ( n )。

参数:n:数值型变量或表达式,指定要产生的伪随机数的上界。有效值在 1~32 767 之

间。

返回值:与 n 的数据类型相同。函数执行成功时返回 1~n 之间的一个伪随机数,包括 1

和 n 在内。如果参数 n 的值为 NULL,Rand()函数返回 NULL。

【例 32】 下面的代码得到 1~100 之间的一个伪随机数:

Rand(100)

5.字符串函数

(1)Left(string, n)。

功能:得到字符串左部指定个数的字符。

参数说明:string 类型,指定要提取子串的字符串;n——long 类型,指定子串长度返回

值 String。

函数执行成功时返回 string 字符串左边 n 个字符,发生错误时返回空字符串(" ")。如

果任何参数的值为 NULL,Left()函数返回 NULL。如果 n 的值大于 string 字符串的长度,那

么 Left()函数返回整个 string 字符串,但不增加其他字符。

【例 33】 下面的代码返回“ABCD”:

Left("ABCD EFGH", 4)

【例 34】 下面的代码返回“ABCD EFGH”:

Left("ABCD EFGH", 40)

(2)LeftTrim(string)。

功能:返回指定字符串删除了左部空格后的字符串。

参数说明:string 类型,指定要删除左部空格的字符串。

返回值:String。

函数执行成功时返回删除了 string 字符串左部空格的字符串,发生错误时返回空字符串

("")。如果任何参数的值为 NULL,LeftTrim()函数返回 NULL。

【例 35】 下面的语句返回“ABCD”:

LeftTrim(" ABCD")

(3)Len(stringorblob)。

功能:得到字符串的长度。

Page 70: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·60·

返回值:Long。

函数执行成功时返回字符串的长度,发生错误时返回-1。如果任何参数的值为 NULL,

则 Len()函数返回 NULL。

【例 36】 下面的语句返回 0:

Len("")

【例 37】 下面的语句返回 6:

Len("ABCDEF")

(4)Lower(string)。

功能:将字符串中的大写字母转换为小写字母。

参数说明:要将其中的大写字母转换为小写字母的字符串。

返回值:String。

函数执行成功时返回将大写字母转换为小写字母后的字符串,发生错误时返回空字符串

(" ")。如果 string 参数的值为 NULL,Lower()函数返回 NULL。

【例 38】 下面的语句返回“abcdef”:

Lower("AbcDEF")

(5)Mid(string, start {,length})。

功能:取字符串的子串。

参数说明:string 类型,指定要从中提取子串的字符串;start——long 类型,指定子串第

一个字符在 string 字符串中的位置,第一个位置为 1;length——long 类型,可选项,指定子

串的长度。

返回值:String。

函数执行成功时返回 string 字符串中从 start 位置开始、长度为 length 的子串。如果 start

参数的值大于 string 中字符个数,那么 Mid()函数返回空字符串。如果省略了 length 参数或

length 参数的值大于从 start 开始、string 字符串中余下字符的长度,那么 Mid()函数返回所有

余下的字符。如果任何参数的值为 NULL,Mid()函数返回 NULL。

【例 39】 下面的代码返回 RUTH:

Mid("BABE RUTH", 5, 5)

【例 40】 下面的代码返回空字符串(""):

Mid("BABE RUTH", 40, 5)

【例 41】 下面的代码返回 BE RUTH:

Mid("BABE RUTH", 3)

(6)Pos(string1,string2{,start })。

功能:在一个字符串中查找所包含的另一个字符串的起始位置。

参数说明:string 类型,指定要从中查找子串 string2 的字符串;string2——string 类型,

指定要在 string1 中查找的字符串;start——long 类型,可选项,指定从 string1 的第几个字符

Page 71: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·61·

开始查找。默认值为 1。

返回值:Long。函数执行成功时返回在 start 位置后 string2 在 string1 中第一次出现的起

始位置。如果在 string1 中按指定要求未找到 string2、或 start 的值超过了 string1 的长度,那

么 Pos()函数返回 0。如果任何参数的值为 NULL,Pos()函数返回 NULL。

【例 42】 下面的语句返回 6:

Pos("BABE RUTH", "RU")

【例 43】 下面的语句返回 0:

Pos("BABE RUTH", "be")

【例 44】 下面的语句返回 0:

Pos("BABE RUTH", "BE", 5)

(7)Right(string, n)。

功能:从字符串右端取指定个数字符。

参数说明:string 类型,指定要提取子串的字符串;n——long 类型,指定子串长度。

返回值:String。

函数执行成功时返回 string 字符串右边 n 个字符,发生错误时返回空字符串("")。如果

任何参数的值为 NULL,Right()函数返回 NULL。

如果 n 的值大于 string 字符串的长度,那么 Right()函数返回整个 string 字符串,但并不

增加其他字符。

(8)RightTrim(string)。

功能:删除字符串尾部空格。

参数说明:string 类型,指定要删除右部空格的字符串。

返回值:String。

函数执行成功时返回删除了 string 字符串右部空格的字符串,发生错误时返回空字符串

("")。如果任何参数的值为 NULL,RightTrim()函数返回 NULL。

【例 45】 下面的语句返回“ABCD”:

RightTrim("ABCD ")

(9)Space(n)。

功能:生成一个由空格组成的指定字符个数的字符串。

参数 n:long 类型,指定要填充的空格个数,也就是填充后返回的字符串的长度。

返回值:String。

函数执行成功时返回由 n 个空格组成的字符串,发生错误时返回空字符串。如果参数 n

的值为 NULL,Space()函数返回 NULL。

【例 46】 下面的代码将由 6 个空格组成的字符串赋给 Name 变量:

string Name

Name = Space(6)

(10)Trim ( string)。

Page 72: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·62·

功能:删除字符串首部和尾部的空格。

参数说明:string 类型,指定要删除首部和尾部空格的字符串。

返回值:String。

函数执行成功时返回删除了 string 字符串首部和尾部空格的字符串,发生错误时返回空

字符串("")。如果任何参数的值为 NULL,Trim()函数返回 NULL。

【例 47】 下面的语句返回“ABCD”:

Trim(" ABCD ")

(11)Upper ( string )。

功能:将字符串中的小写字母转换为大写字母。

参数说明:要将其中的小写字母转换为大写字母的字符串。

返回值:String。

函数执行成功时返回将小写字母转换为大写字母后的字符串,发生错误时返回空字符串

("")。如果 string 参数的值为 NULL,Upper()函数返回 NULL。

【例 48】 下面的语句返回“ABCDEF”:

Upper("AbcDEF")

6.数据类型转换函数

(1)DateTime ( date {, time } )。

功能:把日期和时间值组合成 DateTime 类型的值。

参数说明:date——Date 类型的日期值;time——可选参数,time 类型的时间值,省略该

参数时,PowerBuilder 把时间设置为午夜(00:00:00.000000)。当指定该参数时,可以仅仅指

定小时值。

返回值:DateTime。

函数执行成功时返回日期和时间组合而成的 DateTime 类型的值。如果任何参数的值为

NULL,则 DateTime()函数返回 NULL。

【例 49】 下面的代码把单行编辑框中用户输入的日期和时间值组合成 DateTime 类型的

值,以更新数据库的 DateTime 类型的列。

DateTime ldt_OrderDateTime

date ld_OrderDate

time lt_OrderTime

ld_OrderDate = Date(sle_orderdate.Text)

lt_OrderTime = Time(sle_ordertime.Text)

ldt_OrderDateTime = DateTime(ld_OrderDate, lt_OrderTime)

(2)Date( string)。

功能:Date 将其值是个有效日期的字符串转换成 Date 类型的值。

参数说明:string 类型,其值包括一个有效的以字符串形式表示的日期(如 January 1,

1998 或 12-31-99),string 参数也可以是包含字符串类型数据的 Any 类型变量。

返回值:Date。

Page 73: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·63·

函数执行成功时返回相应的 Date 类型值。如果 string 参数中的值不是有效的 powerScript

日期或数据类型不兼容,那么 Date()函数返回 1900-01-01。如果 string 参数的值为 NULL,则

Date()函数返回 NULL。

【例 50】 下面的代码把字符串形式表示的日期转换为日期类型的日期:

Date ld_date ld_date = Date("1998-06-27")

3.5.2 事件触发和邮寄函数

当为某个对象的某个事件编写了事件处理程序后,在其他地方(如函数或其他事件处理

程序)就可以调用该事件处理程序,完成这项工作的一个简便方法是使用对象函数

TriggerEvent()或 PostEvent ()。

由于 TriggerEvent ()函数立即触发相应事件,故将其称为事件触发函数,而 PostEvent ()

函数将事件放置到消息队列的尾部,等待系统来处理,故将其称为事件邮寄函数。下面分别

介绍这两个函数。

1.TriggerEvent ()函数

TriggerEvent 函数能够触发任何对象的事件,并立即执行该事件的事件处理程序,其语法

格式为:

objectname.TriggerEvent ( event {,word, long}

其中:objectname 是对象或控件名称,将触发该对象或控件的某个事件;event 是要触发的

事件,其有效值可以是标识 PowerBuilder 事件的 TrigEvent 枚举类型值(如 Clicked!、Modified!

或 DoubleClicked!等);word 和 long 是两个可选参数,触发事件后其值将分别保存到系统

全局对象 Message 的 WordParm 和 LongParm 属性中。

例如:cb_OK.TriggerEvent(Clicked!)

//触发命令按钮 cb_OK 的单击事件(Clicked),并立即执行该事件的事件处理程序。

TriggerEvent()很像函数调用,执行该函数时,程序进入被触发事件的事件处理程序中执

行,执行完毕后返回到 TriggerEvent ()语句下面一行语句继续执行。

2.PostEvent ()函数

PostEvent 函数的语法格式为:

objectname.PostEvent ( event {,word, long}

其中各参数的意义与 TriggerEvent ()函数相同。

虽然在语法格式上,PostEvent ()与 TriggerEvent ()相同,但 PostEvent ()函数只是邮寄一

个事件,要求 PowerBuilder 在以后的某个时间执行邮寄事件的事件处理程序,具体时间由

PowerBuilder 决定,之后当前程序继续执行。

TriggerEvent()通常用做同步调用,因为它等待被调用者执行完毕后才继续运行,而

PostEvent ()通常用做异步调用,它在发出请求执行信号后就继续运行自己的程序段了。

Page 74: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·64·

3.6 嵌入式 SQL 语句

结构化查询语言 SQL(Structured Query Language)是由国际标准化组织(ISO)认定的

关系型数据库管理系统的标准语言,现今几乎所有的数据库厂商都在其产品中对其提供支持。

在 PowerBuilder 中,虽然数据窗口给用户提供了强大的数据库操作功能,但它并不能有效地

解决所有与数据库交互相关的问题。为此,PowerScript 提供了嵌入式 SQL 语句,以便在程序

中更灵活地操纵数据库。

本节所讲语句为非 PowerBuilder 语句,因此在 PowerBuilder 中使用时要遵循以下两点:

� 所有的嵌入式 SQL 语句必须以分号(;)结尾。

� SQL 语句中的变量名前面必须加冒号(:),多个变量用逗号分隔。

3.6.1 事务管理语句

事务是数据库中一个很重要的概念。所谓事物,是指由一系列对数据库进行操作的语句

所组成的语句组,这些语句能各自完成特定的数据库操作任务。为确保数据库的数据一致性,

整个事物要么被一次性地完成(称之为提交),要么被彻底取消(称之为回滚)。只要某个

操作失败,整个事物的执行就应被视为发生意外,所有操作都必须重新回到事务执行前的起

始点。

使用事务对象(transaction objects)与数据库通信。PowerBuider 的事务对象是应用程序

与数据库之间进行通信的桥梁。在应用程序初启时,系统自动创建一个名为 SQLCA(SQL

Communication Area,SQL 通信区)的全局事务对象,该对象在应用程序的任何地方都可以

访问。应用程序与数据库的所有通信都需要通过事务对象来完成,除了直接使用系统的默认

事务对象 SQLCA 外,开发人员也可以创建自己的事务对象。

事务对象是个不可见对象,它不需要在某个画板中创建,也不能出现在屏幕上,但它却

是 PowerBuilder 最重要的对象之一。不使用事务对象,应用程序就不能访问数据库!

无论程序用嵌入式 SQL 还是数据窗口访问数据库,都要使用事务对象。事务对象驻留在

内存中,与变量和结构十分相似,它拥有用于连接数据库以及从数据库中得到反馈数据的所

有信息。应用程序中事务对象的作用如图 3.2 所示。

图 3.2 事物对象的作用

事物对象是在数据库应用开发过程中用得较多的一种系统对象,因此详细了解其有关属

性将有助于用户的实际编程。事务对象共有 15 个属性,前 10 个用于与数据库建立连接,后

5 个用于返回数据库的操作状态。事物对象的所有属性如表 3.5 所示。

Page 75: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·65·

表 3.5 事物对象的属性

属性名称 数据类型 意 义

DBMS String 数据库厂商的名称(如 OR7,Sybase,ODBC 等)

Database String 要连接的数据库名称

UserID String 与数据库连接的用户名或用户标识

DBPass String 与 UserID 对应的数据库用户的保密字

Lock String 用于连接数据库的隔离层

LogID String 登录数据库服务器所需的用户名或用户标识

LogPass String 登录数据库服务器所需的保密字

ServerName String 数据库服务器所在的网络名称,即数据库服务器所在网络的地址名

(x:=SQLSPX,t:=TCPIP)

AutoCommit Boolean 定义应用程序是自动提交事务还是手工提交事务

DBParm String 与具体数据库管理系统相关的一组连接参数

SQLCode Long 指示最近一次 SQL 语句是操作成功还是操作失败,其可能取值为:0——操

作成功; -1——操作失败;100——操作成功,但无返回数据

SQLNRows Long 最近一次 SQL 操作所影响的行数(即记录数)

SQLDBCode Long 由数据库厂商提供的数据库错误代码

SQLErrText String 与数据库错误代码 SQLDBCode 相对应的出错信息

SQLReturnData String 返回 DBMS 想告诉用户的任何附加信息

事务对象包含了两组属性。

第一组属性用来告诉 PowerBuilder 连接数据库需要的所有信息,包括数据库厂商名称(决

定使用哪个 PowerBuilder 数据库接口)、数据库实例名称、用户名、保密字等。

第二组属性反映最近一次数据库操作完成的状况,包括操作是否成功、出错时的出错信

息、出错代码等。

PowerBuider 应用程序与存储数据的数据库进行通信的步骤为:

� 设置事务对象的属性值。

� 与数据库建立连接。

� 执行所需的数据库操作。

� 断开与数据库的连接。

例如,下面是连接 SQL Server 数据库所需的代码示例:

SQLCA.DBMS = "ODBC" //数据库厂商的名称是 ODBC

SQLCA.AutoCommit = False //程序通过提交语句(COMMIT)提交事务

SQLCA.DBParm = "ConnectString=’DSN=stock;UID=sa;PWD=’" //与数据库管理系统相关的一组连

接参数 下面简要介绍用于事物对象管理的 4 条语句:CONNECT 语句、DISCONNECT 语句、

COMMIT 语句以及 ROLLBACK 语句。

Page 76: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·66·

1.建立数据库连接语句

建立数据库连接语句(CONNECT)是每个访问数据库的 PowerBuilder 程序必须使用的

语句,它的功能是通过事务对象将应用程序与数据库建立连接;连接成功后,其他 SQL 语句

和数据窗口才能通过事务对象操作数据库。CONNECT 语句的语法格式为:

CONNECT {USING TransactionObject}

其中,TransactionObject 是事务对象,在执行该语句前,必须正确设置事务对象的数据库连接

属性。

2.断开数据库连接语句

断开数据库连接语句(DISCONNECT)断开与数据库的连接。执行该语句时,它首先执

行 COMMIT 语句(事务提交语句)完成事务提交,然后解除与数据库的连接。DISCONNECT

语句的语法格式为:

DISCONNECT {USING TransactionObject} ;

其中,TransactionObject 是前面用 CONNECT 语句连接的事务对象名。

例如,在应用对象的 open 事件处理程序中,若想使用默认的事务对象连接数据库,可以

这样写:

CONNECT USING SQLCA; //连接数据库 在应用对象的 close 事件处理程序中断开与数据库的连接时,可以这样写:

DISCONNECT USING SQLCA; //断开与数据库的连接

3.提交事务语句

提交事务语句(COMMIT)提交事务,完成数据库的物理修改。执行该语句后,将关闭

所有先前打开的游标(CURSOR)和过程(PROCEDURE),并开始一个新的事务。COMMIT

语句的语法格式为:

COMMIT {USING TransactionObject}

其中,TransactionObject 是自上次执行 COMMIT、ROLLBACK 或 CONNECT 操作后需要永

久更新数据库操作的事务对象名,默认时使用事务对象 SQLCA。

4.回滚事务语句

回滚事务语句(ROLLBACK 回滚)放弃自上一个 COMMIT、ROLLBACK 或 CONNECT

语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。其语法格式为:

ROLLBACK {USING TransactionObject}

其中,TransactionObject 是事务对象名,默认时使用事务对象 SQLCA。

Page 77: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·67·

3.6.2 基本 SQL 语句

这里所说的基本 SQL 语句是指用来对数据库中的数据表进行查询(检索记录)和操纵

(插入、删除、修改)的 SQL 语句。下面将要介绍的这些语句有:SELECT 语句、INSERT

语句、DELETE 语句以及 UPDATE 语句。

1.单行检索语句

单行检索语句(SELECT)语句从数据库中检索一条记录,如果找到多条满足条件的记

录,则产生错误。其语法格式为:

SELECT <字段名列表>

INTO <变量列表>

FROM <表名列表>

WHERE <检索条件>

{USING <事务对象名>}

其中:字段名列表中有多个字段时字段之间用逗号分隔;有多个表时,用“表名.字段名”区

分不同表中的同名字段。

例如,下面的语句从表 course 中选择 course、credit 和 teacher 列的内容,并将结果存放在

3 个单行编辑框中,其条件是 cid 列的值等于用户在单行编辑框 sle_Num 中输入的课程编号。

Integer icid

Dec icredit

String icourse, iteacher

icid = Integer(sle_Num.Text) //将单行编辑框内的文本转换成 Integer 类型的值

SELECT course, crdit, teacher

INTO :icourse, :icredit, :iteacher

FROM course

WHERE cid = :icid;

sle_1.text = icourse

sle_2.text = string(icredit) //按指定格式将数据转换成字符串

sle_3.text = iteacher

2.插入语句

插入语句(INSERT)向数据库中插入一条记录,其语法格式为:

INSERT INTO 表名(<字段名列表>) VALUES (<列的赋值表>)

其中:列的赋值表可以使用常量,也可以使用主变量(PowerScript 变量前加个冒号)。

例如,下面的语句在课程表中插入一行。

Integer icid

Dec icredit

String icourse, iteacher

icid = Integer(sle_Num.Text) //将单行编辑框内的文本转换成 Integer 类型的值

icourse =sle_1.text

Page 78: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·68·

icredit =dec(sle_1.text) //将单行编辑框内的文本转换成 Decimal 类型的值

iteacher=sle_3.text

INSERT INTO Course(cid, course, credit, teacher)

VALUES (:icid, :icourse,:icredit,:iteacher) ; 上例中的有关函数说明如下。

(1)Integer()。

功能:将字符串或 Blob 值转换成 Integer 类型的值。

语法:Integer ( stringorblob )。

参数:stringorblob——string 类型变量或 Blob 类型变量。Blob 类型变量时,把该变量第

一个值转换为 Integer 类型的值,其余部分被忽略。stringorblob 参数也可以是包含上述类型数

据的 Any 类型变量。

返回值:Integer。

函数执行成功时返回相应的 Integer 类型值。如果 stringorblob 参数中的值不是有效的

PowerScript 数字或数据类型不兼容,那么 Integer()函数返回 0。如果 stringorblob 参数的值为

NULL,则 Integer()函数返回 NULL。

【例 51】 下面的语句以 Integer 数据类型返回 24:

Integer("24.332")

(2)Dec()。

功能:将字符串或 Blob 值转换成 Decimal 类型的值。

语法:Dec ( stringorblob )。

参数:stringorblob——string 类型变量或 Blob 类型变量。Blob 类型变量时,把该变量第

一个值转换为 Decimal 类型的值,其余部分被忽略。stringorblob 参数也可以是包含上述类型

数据的 Any 类型变量。

返回值:Decimal。

函数执行成功时返回相应的 Decimal 类型值。如果 stringorblob 参数中的值不是有效的

PowerScript 数字或数据类型不兼容,那么 Dec()函数返回 0。如果 stringorblob 参数的值为

NULL,则 Dec()函数返回 NULL。

【例 52】 下面的语句以 Decimal 数据类型返回 24.3:

Dec("24.3")

(3)String()。

功能:按指定格式将数据转换成字符串。String()可以把 Date、DateTime、数值类型、Time、

String 类型的数据转换成指定格式的字符串。

语法:String(data,{format})。

参数:data——指定要转换格式的数据,其数据类型可以是 Date、DateTime、数值类型、

Time、String,也可以是包含上述类型数据的 Any 类型变量。Format——可选项,String 类型,

其值指定数据格式。如果 data 参数的类型为 String,则必须指定 format 参数。

返回值:String。

函数执行成功时返回以字符串方式表示的指定数据,如果 data 参数的数据类型与 format

Page 79: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·69·

参数指定的格式不匹配、format 参数指定的格式无效或 data 参数不是前面提到的适宜数据类

型时,String()函数返回空字符串("")。

【例 53】 下面的语句将指定日期转换为 Jan 31, 1998 的格式:

String(1998-01-31, "mmm dd, yyyy")

【例 54】 下面的语句把 DateTime 类型的值转换为形式为 Jan 31,1998 6 hrs and 8 min

的字符串:

String(DateTime(1998-01-31, 06:08:00), ’mmm dd, yyyy h "hrs and" m "min"’)

【例 55】 下面的语句把 string1 设置为 0123:

integer nbr = 123

string string1

string1 = String(nbr,"0000;(000);****;空")

【例 56】 下面的语句把 string1 设置为(123):

integer nbr = -123

string string1

string1 = String(nbr,"0000;(000);****;空")

【例 57】 下面的语句把 string1 设置为****:

integer nbr = 0

string string1

string1 = String(nbr,"0000;(000);****;空")

【例 58】 下面的语句把 string1 设置为“空”:

integer nbr

string string1

SetNull(nbr)

string1 = String(nbr,"0000;(000);****;空")

3.删除语句

删除语句(DELETE)用于删除表中的数据,其语法格式为:

DELETE FROM <表名> WHERE <检索条件> 例如,删除课程号=1 的记录的语句如下:

DELETE FROM course WHERE cid = 1

4.修改语句

修改语句(UPDATE)用于修改表中指定的数据,其语法格式为:

UPDATE <表名> SET <列名> = <值> {,<列名> = <值> �} WHERE <删除条件>

Page 80: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·70·

{USING TransactionObject} ;

其中:

(1)值可以是常量,也可以是 PowerScript 主变量。

(2)TransactionObject 是事务对象名,默认时使用 SQLCA。

5.检查 SQL 语句的执行情况

嵌入式 SQL 语句的执行有可能成功,也有可能失败,良好的编程风格是对每条可执行的

SQL 语句都检查其执行情况。每当执行一条 SQL 语句后,与该语句相关的事务对象的

SQLCode 属性都给出一个值指示 SQL 语句的执行是否成功,SQLCode 取值为:

0——最近一次 SQL 语句执行成功;

-1——最近一次 SQL 语句执行失败;

100——最近一次 SQL 语句没有返回数据。

当 SQLCode 的值为-1 时(即最近一次 SQL 语句执行失败时),事务对象的 SQLDBCode

属性中存放着数据库厂商提供的错误代码,事务对象的 SQLErrText 属性中存放着数据库厂商

提供的错误信息,利用这两个属性,可以找到出错原因。

【例 59】 下面是个检查 SQL 语句的执行是否成功的示例:

Integer icid

Dec icredit

String icourse, iteacher

icid = Integer(sle_Num.Text)

SELECT course, crdit, teacher

INTO :icourse, :icredit, :iteacher

FROM course

WHERE cid = :icid;

if SQLCA.SQLCode = 0 then // 成功

sle_1.text = icourse

sle_2.text = string(icredit)

sle_3.text = iteacher

elseif SQLCA.SQLCode = 100 then //未找到满足条件的数据

MessageBox("查询雇员", "未找到指定雇员")

else //SELECT 语句执行不成功

MessageBox("数据库错误", SQLCA.SQLErrText, Exclamation!)

End If

【例 60】 下面是个插入数据的示例:

Integer icid

Dec icredit

String icourse, iteacher

icid = Integer(sle_Num.Text)

icourse =sle_1.text

icredit =dec(sle_1.text)

iteacher=sle_3.text

INSERT INTO Course(cid, course, credit, teacher)

Page 81: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·71·

VALUES (:icid, :icourse,:icredit,:iteacher) ;

if SQLCA.SQLCode = 0 then // 成功

COMMIT ;

MessageBox("提示信息", "插入成功!")

else

ROLLBACK ;

MessageBox("数据库错误", SQLCA.SQLErrText, Exclamation!)

End If

3.6.3 游标的使用

前面介绍的 SQL 语句仅能完成一条记录的操作,而在实际操作中,经常需要检索多行数

据,这时需要用游标来解决。这里所说的游标,并非指显示器屏幕上闪动的光标,而是特指

一种关系数据库概念。引入游标(Cursor)这个概念,是为了解决 SQL 语句的查询结果集为

多条记录,而一般程序设计语言一次只能处理一条记录的矛盾。游标可以看做一个由查询结

果集构成的只读临时文件。在程序代码中,可以使用主变量从这个临时文件中连续读取多条

记录,进行有关处理。

在 PowerBuilder 应用程序开发过程中,许多使用游标实现的工作可由 DataWindow 或

DataStore 对象来实现,但游标有其自身的优点。例如,占用系统资源少,操作灵活,可自定

义其访问类型等。使用游标的基本步骤是:声明游标,打开游标,读取数据,关闭游标。这

4 个步骤所对应的语句分别为:DECLARE 语句、OPEN 语句、FETCH 语句和 CLOSE 语句。

1.定义游标(DECLARE)语句

使用游标前需用 DECLARE 语句声明游标,其语句格式为:

DECLARE CursorName CURSOR FOR Selectstatement

[USING TransactionObject] 注:此语句为不可执行语句,只定义了一个游标。

【例 61】 声明一个叫做 St 的游标,用以查询家庭地址在天津的学生的姓名、学号及性

别。

DECLARE St CURSOR FOR

SELECT name,id,sex

From Student

Where addr="天津";

2.打开游标(OPEN)语句

声明游标后,在作其他操作之前必须打开它。打开游标是执行与其相关的一段 SQL 语

句。打开游标语句的格式为:

OPEN CursorName 注意:此语句打开说明了的游标,并执行相应的 SELECT 语句。

【例 62】 打开上例声明的游标 St,其语句如下。

Page 82: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·72·

OPEN St

3.读取数据(FETCH)语句

当用 OPEN 语句打开了游标并在数据库中执行了查询后,还不能立即利用查询结果集中

的数据。必须用 FETCH 语句来读取数据。一条 FETCH 语句一次可以将一条记录放入指定变

量中。FETCH 语句是游标使用的核心。使用游标,我们只能逐条记录的得到查询结果。

读取数据语句的格式为:

FETCH CursorName/ProcedureName INTO Hostvariablelist 功能:移动游标的指针到下一个记录,读取记录内容并把它们存储在指定变量中。

【例 63】 将表 Student 中的查询结果放到变量中。

String s_name,s_id,s_sex

FETCH Student INTO :s_name,:s_id,:s_sex; 游标一次只能从后台数据库中读取一条记录,而多数情况下,我们需要处理全部记录;

所以一般要将游标提取数据的语句放在一个循环体内,以便提取结果集中的全部数据。

通过检测 SQLCA.SQLCODE 的值,可以得到最后一条 FETCH 语句是否成功。当

SQLCODE 的值为 0 时,表明一切正常。

【例 64】 改进例 63,将游标中的结果全部读取出来。

String s_name,s_id,s_sex

FETCH Student INTO :s_name,:s_id,:s_sex;

DO WHILE SQLCA.SQLCODE=0

//对读取的记录进行处理

⋯⋯

//读取下一条记录

FETCH Student INTO :s_name,:s_id,:s_sex;

4.删除游标数据

删除游标数据语句的格式为:

DELETE FROM Tablename WHERE CURRENT OF CursorName 功能:删除游标的指针所指向的一个记录。

5.更新游标数据

更新游标数据语句的格式为:

UPDATE Tablename

SET FieldName=VarName

WHERE CURRENT OF CursorName 功能:用 SET 中给出的数据更新游标的指针所指向的一条记录。

Page 83: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·73·

6.关闭游标

关闭游标语句的格式为:

CLOSE CursorName 功能:释放游标所占的内存资源。

【例 65】删除游标 St,其语句如下。

CLOSE St

3.7 例外处理语句

在 PowerBuilder 9.0 中,除了可以使用 Error、ExternalException 等事件进行程序代码的异

常处理外,还可以使用例外处理语句。

3.7.1 PowerBuilder 中的例外处理

例外是指在程序运行过程中所发生的异常事件。例如,除数为零溢出、数值超出、数组

越界、找不到指定文件等。这些事件的发生将中断程序的正常运行,影响程序的使用。为提

高程序的运行效率,必须尽可能考虑到可能发生的各种异常事件,并在相应程序中做出相应

的处理。PowerBuilder 9.0 中的例外处理方法与 Java 语言的例外处理方法十分相似。

需要指出的是,虽然 PowerBuilder 现在提供了新的例外处理机制,用户仍然可以使用

Error、ExternalException 等事件进行例外处理。但是,通过给这些事件编写处理程序的方式

将无法得到 PowerBuilder 新的例外处理机制所带来的优越性。

3.7.2 例外处理语句

在 PowerBuilder 9.0 中,例外处理语句的形式为

TRY⋯CATCH⋯FINALLY⋯END TRY 用于指定要捕获例外的代码段,给出发生例外时处理动作,并在 FINALLY 子句中执行

公共的处理部分。

要在程序中进行例外处理,就必须在代码中包含 TRY 语句块。TRY 语句块以 TRY 子句

开始,以 END TRY 语句结束。同时,该语句块中还必须包含 CATCH 子句和 FINALLY 子句。

一般来说,FINALLY 子句主要用于清除发生错误的条件。在 TRY 子句和 FINALLY 子句之

间,可以添加任意数量的 CATCH 子句。

CATCH 子句用于捕获发生错误的条件,并给出适当的处理。虽然 CATCH 子句并非一定

要出现,但当使用 CATCH 子句时,必须在每一个 CATCH 子句后面给出一个变量声明,而

且该变量的数据类型必须是从 Throwable 系统类型导出的数据类型。

作为一个示例,下面的语句可用于当用户输入的数据超出正弦函数参数取值范围时的例

外捕获和处理。

Double ld_input

ld_input=Double()

Page 84: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·74·

TRY

sle_2.text=String(Sin(ld_input))

CATCH(runtimeerror err)

MessageBox("运行时出错",err.GetMessage())

FINALLY

sle_1.text="" //添加清除代码

Return

END TRY

本 章 小 结

本章首先阐述了 PowerBuilder 编程语言,包括数据类型与变量、说明运算符和表达式以

及基本语句、函数与事件的调用等;其次讲述了嵌入式 SQL 语句,包括事务对象及其应用、

建立和断开数据库连接、提交与回滚事务、SQL 语句和检查 SQL 语句的执行情况;最后讲解

了 PowerBuilder 中的例外处理语句。本章给出了大量的例子,希望大家反复练习,它是

PowerBuilder 编程的基础知识,是学习 PowerBuilder 编程基本技巧的良好开始。

练 习

1.比较 PowerScript 中的条件语句和 Choose 语句、For 循环语句和 Do 循环语句的功能

和使用场合。

2.通过 PowerBuilder 的 Help,说明 PowerBuilder 的标准函数的分类方法。

3.说明 PowerBuilder 的 Script 代码编辑窗口中各图标按钮的功能与用法。

4.PowerBuilder 有哪几种数据类型?

5.PowerBuilder 有哪几种运算符?

6.PowerBuilder 有哪几个代词?各自的作用是什么?

7.何谓系统函数,何谓用户定义函数?如何定义用户定义函数?

8.何谓事件?事件和函数有何不同?

9.如何最大限度的保证程序对数据库管理系统的兼容性?

10.分析下列程序的显示和对话窗口中的结果。

integer s=0,I=0

do while true

I++

if I>100 then exit

if(i/2)=int(i/2) then continue

s=s+I

loop

mesagebox("s=",string(s)) 11.在 PowerBuilder 中有哪几条嵌入式 SQL 语句?写出各自的格式、功能和用法。

12.在 PowerBuilder 中有哪几条游标语句?写出各自的格式、功能和用法。

Page 85: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·75·

第 4 章 窗 口 对 象

4.1 窗口概述

窗口是用户界面的最基本要素,是应用程序的界面,应用程序通过窗口显示运行状态和

执行结果。

窗口由 4 部分组成:属性、事件、函数和控件。窗口的属性决定了窗口的外观和行为(如

窗口类型、初始位置、是否有边框等),其事件说明了应用程序能够响应用户的操作类型,其

函数为程序控制窗口提供了简洁而安全的手段。

窗口是应用程序图形界面的基础,它由属性、事件、函数、控件组成,用户通过窗口及

窗口上的控件和菜单表达自己的操作意图。

窗口还是其他 PowerBuilder 控件(如按钮、编辑框、数据窗口控件等)的物理载体,

PowerBuilder 中的各种控件均需要放置到窗口才能发挥作用。

另外,窗口还是用户与应用程序之间的交互界面。窗口可用来显示信息、请求、用户输

入和响应用户的鼠标或键盘动作。

4.2 窗口类型

PowerBuilder 提供下列 6 种类型的窗口。

1.主窗口

主窗口(Main Window)是独立的窗口,它不依赖于其他任何窗口而独立存在。这种类

型的窗口既能够覆盖其他窗口,也能够被其他窗口所覆盖。对功能单一的应用,通常选用主

窗口作为界面基础。

2.弹出式窗口

弹出式窗口(Popup Window)通常由另一个窗口(该窗口一般情况下成为弹出式窗口的

父窗口)打开。弹出式窗口显示在父窗口前面,它既可以移出父窗口,也能够覆盖父窗口,

但不能被父窗口覆盖。当父窗口最小化时,弹出式窗口随之隐藏;当父窗口被关闭时,弹出

式窗口也随之关闭。弹出式窗口用途广泛,它可以显示文字信息,也可以做成图形化的进度

提示窗口,还能够用于输入用户的选择。

3.子窗口

子窗口(Child Window)从属于另一个窗口,它总是在主窗口或弹出式窗口(该窗口成

为子窗口的父窗口)中打开。子窗口可以在父窗口内部移动,但不能移出父窗口。当子窗口

Page 86: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·76·

的一部分移出父窗口时,系统剪裁子窗口,使得只有父窗口内的部分可见。移动父窗口时,

子窗口随之移动;关闭父窗口时,子窗口也随之被关闭。

注:子窗口的位置总是相对于父窗口,而不是相对于屏幕。

4.响应窗口

响应窗口(Response Window)向用户请求信息,它总是在另一个窗口(父窗口)中打开。

响应窗口被显示时,用户必须关闭了该窗口后才能操作同一个应用程序的其他窗口。响应窗

口不能被最大化、最小化,但可以带有控制菜单。

5.MDI 框架窗口和带微帮助的 MDI 框架窗口

MDI 框架窗口(MDI Frame)及其子窗口构成了应用程序的多文档界面风格。它有两种

形式:普通的 MDI 框架窗口和带微帮助的 MDI 框架窗口(MDI Frame With Microhelp)。两

者的区别在于,后一种框架窗口在底部多了一个状态栏,用于显示应用程序简短的当前信息,

我们将其称做微帮助(Microhelp)。典型的 MDI 框架窗口由标题、菜单、工具栏、客户区、

状态栏组成。PowerBuilder 开发环境使用的就是带微帮助的 MDI 框架窗口。

4.3 创建窗口

4.3.1 创建新窗口

单击“File→New”菜单,在出现的“New”窗口中选择“PB Object”选项页中的 Window

对象图标 ,在 PowerBuilder 中将显示一个窗口画板,其中有一个表示新建窗口的网点

状矩形,如图 4.1 所示。

图 4.1 窗口画板

Page 87: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·77·

窗口画板由布局视图区、脚本编辑区、控件列表区、事件列表区、结构列表区、结构定

义区、函数列表区、非可视对象列表区等组成。可通过菜单项“view”打开或关闭各区域,

也可在布局视图区下端的区域选项卡中进行选择切换。

4.3.2 窗口画板概述

在窗口画板上端的工具栏中有一些常用的图标,如图 4.2 所示,下面简要介绍它们的意

义。

图 4.2 PainterBar1 工具栏

:控件列表图标。单击该图标右边的箭头,可在下拉式窗口中显示出控件图标列表,

列表中是能够放置到窗口上的所有控件。选择某个控件图标,然后在窗口工作区上单击,就

可把所选图案所代表的控件放置到窗口上。

:代码编写图标。单击该图标,打开代码(脚本)编写窗口,在该窗口中对需要响应

的事件编写事件处理程序。

:设置与查看窗口以及窗口中对象的属性,窗口的多种属性均可通过单击该按钮后在

打开的属性对话框中设置。

:设置控件的跳转(Tab)次序。

:预览窗口图标。在窗口设计过程中,随时都可以单击该图标查看窗口运行时的效果。

4.4 窗口属性

窗口属性定义窗口的外观、行为和状态,窗口属性设置对话框有 4 个标签分别对应 4 个

属性选项页,通过单击标签选择所需要的属性,如图 4.3 所示。

4.4.1 一般属性

一般属性在 General 选项页中设置,如图 4.3 所示。本页中可以设置的属性根据所选窗口

类型的不同而不同,不能修改的属性说明该类型的窗口不具备或不允许修改这些属性。

Title:定义窗口的标题,新建的窗口标题为“Untitled”。

Tag:可以输入一个与窗口相关的字符串。

Visible:指定窗口的可见性。

MenuName:决定窗口是否具有菜单,为空时说明没有菜单,否则该编辑框的内容就是

菜单的名称。

Enabled:决定窗口是否能够接收和发送事件,它不影响窗口的可见性。

ControlMenu、MaxBox、MinBox:分别指定在窗口的标题栏上是否显示控制菜单按钮、

最大化按钮、最小化按钮,选中时相应的按钮出现在窗口的标题栏。

WindowType:指定窗口类型。

Icon:指定窗口图标。

Page 88: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·78·

窗口标题

窗口标记

窗口菜单名称

菜单浏览按钮

窗口类型

窗口初始状态

窗口背景颜色

MDI 子窗口颜色

窗口图标

系统提供的窗口图标

下拉选择按钮

用户自定义的窗口图

标浏览按钮

图 4.3 窗口属性

4.4.2 其他属性

窗口的属性设置对话框还有另外 3 个选项页。

1.Scroll 选项页

Scroll 选项页用于设置窗口的滚动方式。它有 2 个复选框:“HScroll Bar”和“VScroll Bar”。

选中“HScroll Bar”复选框,就会在窗口上增加水平滚动条;选中“VScroll Bar”复选框,就

会在窗口上增加垂直滚动条。该选项的另外 4 个编辑框用来设定每次单击滚动条时窗口工作

区移动的多少。

2.Toolbar 选项页

Toolbar 选项页用于设置窗口中工具栏的初始位置。“Visible” 复选框指定工具条是否可

Page 89: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·79·

见;“Alignment”组框指定工具栏显示的位置。

3.Other 选项页

Other 选项页用于设置窗口在屏幕中的位置和鼠标的形状。在 PowerBuilder 中度量屏幕尺

寸的单位为 PBU,在屏幕显示模式为 800*600 像素时,PBU 约为 3660*2400,PowerBuilder

使用 UnitsToPixels(Units,type)实现 PBU 到屏幕像素之间的转换;使用 PixelsToUnits

(Pixels,type)实现屏幕像素到PBU 之间的转换,其中 type 为转换的方向,取值为XUnitsToPixels!

(X 方向)或 YUnitsToPixels!(Y 方向)。

4.5 保存、预览、运行窗口

1.保存窗口

单击 PainterBar1 工具栏上的“Save” 图标即可保存窗口。

2.预览窗口

单击 PainterBar1 工具栏上的“Preview” 图标即可预览窗口。

3.运行窗口

单击 PowerBar1 工具栏上的“Run” 图标即可运行窗口。

4.6 窗口事件

PowerBuilder 程序设计的一个显著特点是客户程序和函数大都是由事件触发的,编程者需

要在某一事件发生的时候进行相关的处理。窗口也具有许多事件,了解这些事件的发生时机

对于程序设计是十分有益的。窗口对象中最常用的事件是 Open、Close、CloseQuery、Key、

DragDrop、Resize 等。

1.打开窗口的 Open 事件

Open 事件在窗口打开之后、显示之前发生,此时系统已经构造好了窗口的所有属性以及

其上的所有控件。

2.激活窗口的 Active 事件

Active 事件在激活窗口前发生。该事件发生后,窗口中第一个跳转次序号最小的对象首

先得到焦点。如果窗口中没有这样的对象,则窗口本身得到焦点。

3.单击窗口的 Clicked 事件

Clicked 事件在用户单击窗口中空白区域时发生。窗口的空白区域指窗口内未被有效控件

占据的区域,即窗口中没有可见有效控件的地方。

Page 90: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·80·

4.关闭窗口的 Close 事件

Close 事件在窗口被关闭时发生。触发该事件后,没有办法能够阻止窗口关闭操作。

5.关闭窗口时的 CloseQuery 事件

Close Query 事件在开始关闭窗口时发生,该事件返回一个 0 或 1 的返回值。

执行该事件的事件处理程序后,系统检查返回值。如果返回值为 1,则窗口不被关闭,

通常情况下紧随其后发生的 Close 事件不被产生;如果返回值为 0,则窗口被关闭。

利用该事件的这种特性,程序能够根据当前状态提醒用户保存数据、询问用户是否真要

关闭窗口。窗口被关闭时,同时关闭任何与之相关的子窗口和弹出窗口。

6.按键时的 Key 事件

当用户在键盘上按下一个键且插入点不在编辑区域(如单行编辑框、超文本框等)中时,

key 事件发生。

7.窗口右击时的 RButtonDown 事件

当用户在窗口客户区中任何未被有效控件占用的部分按下鼠标右键时,RButton Down 事

件发生。

4.7 窗口函数

1.打开窗口函数

在应用程序中使用窗口的第一步工作是通过打开窗口函数打开窗口,打开之后才能对窗

口进行各种操作。打开窗口函数具有多种语法格式。

(1)Open(windowvar {, parent })。

其中:参数 windowvar 是要显示窗口的名称,可以直接使用窗口画板中定义的窗口名;

参数 parent 可以省略,未省略时,由该参数指定父窗口的名称,此时,被打开窗口作为子窗

口形式出现。

Open()函数返回整型值 1 时表示打开窗口成功,返回整型值-1 时表示打开窗口失败。

例如,当用窗口画笔定义了一个窗口 w_main 后,那么在应用对象的 Open 事件中写上代

码 Open(w_main),则程序运行后,窗口 w_main 就会出现在屏幕上。

(2)Open(windowvar ,windowtype{, parent })。

其中:参数 windowvar 和 parent 的意义与第一种格式相同。参数 windowtype 是个字符串,

其值是希望打开的窗口的类名,需要注意的是,windowtype 必须与参数 windowvar 的类继承

链中某个类相同。

例如,下面的示例打开由字符串变量 s_w_name指定类型的窗口,并用窗口变量 w_to_open

保存对该打开窗口的引用。SELECT 语句用于从数据库中检索窗口类型数据,并保存到

s_w_name 变量中。

window w_to_open

Page 91: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·81·

string s_w_name

SELECT next_window INTO :s_w_name FROM routing_tableWHERE ... ;

Open(w_to_open, s_w_name)

(3)OpenWithParm(windowvar ,parameter{, parent })

与 open 函数类似,其功能是带参数打开窗口。其中:参数 windowvar 和 parent 的意义与第

一种格式相同。Parameter 为打开窗口时带入窗口的参数,它可以是字符串、数值型和

Powerbuilder 对象型,它的值存放在 Message 对象相应的属性中,即字符串在 Message.StringParm

中,数值在 Message.DoubleParm 中,PowerBuilder 对象在 Message.PowerObjectParm 中。

(4)OpenSheet(sheetrefvar {,windowtype} ,mdiframe{,position{,arrangeopen}})。

它的功能是在 MDI 框架窗口中打开 MDI 子窗口,并在指定菜单中创建选择该子窗口的

菜单项。其中:

sheetrefvar 指定要作为工作表打开的窗口名。

Windowtype 为 String 类型,可选择;指定要打开窗口的类型,也就是窗口画笔中保存的

窗口对象名。

Mdiframe 指定要放置工作表的 MDI 框架窗口名。

Position 为可选参数,指定所打开的工作表的名称作为一个菜单项显示在第几个菜单标题

下面。默认时,被放在倒数第二个菜单标题下。原因是大多数商业软件的最后两个菜单标题

是 Window 和 Help,把工作表的名称放到 Window 菜单标题中用于选择工作表窗口是个合情

合理的选择。

Arrangeopen 为 ArrageOpen 枚举类型,可选参数。但是,如果选用了此参数那么 Position

参数也必须同时指定。Arrageopen 参数告诉系统如何显示打开的工作表,其可取值包括:

� Cascaded!:把一个工作表放在另一个上面,每个都向下方偏移一点,这样所有工作表

的标题栏用户都能看到。该值是 OpenSheet 函数的默认选择。

� Layered!:将工作表显示在客户区的左上角,并最大化工作表,使其充满 MDI 框架窗

口的整个客户区。

� Original!:操作动作与 Cascaded!参数相同,只是不放大窗口,而以窗口定义时的大

小显示。

返回结果为 Integer 型。函数执行成功时返回 1,发生错误时返回-1。如果参数中有值为

NULL 的情况,则函数返回 NULL。

(5)OpenSheetWithParm(sheetrefvar, parameter {,windowtype},mdiframe {,position

{,arrangeopen}})。

它的功能是在 MDI 框架窗口中打开 MDI 子窗口,并把参数保存在 Message 对象中。

2.关闭窗口函数

打开的窗口不再使用时,应该及时将其关闭,以释放系统资源。关闭窗口的工作由函数

Close 实现,其语法格式为:

Close(windowname)

其中:windowname 是要关闭窗口的名称。该函数返回整型值 1 表示关闭窗口成功,否则返回

值为-1。

针对前面示例中打开的窗口 w_main,需要关闭时,在事件处理程序中写上语句

Page 92: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·82·

Close(w_main)即可。

例如,关闭 w_main 窗口的语句为:Close(w_main)。

例如,关闭父窗口 的语句为:Close(parent)。

3.显示窗口函数

若要显示窗口,可将窗口的 Visible 属性置为 TRUE,或使用显示窗口函数,其语句格式为:

Windowname.Show()

4.隐藏窗口函数

若要隐藏窗口,可将窗口的 Visible 属性置为 FALSE,或使用隐藏窗口函数,其语句格式为:

Windowname.Hide()

5.移动窗口函数

若要改变窗口的位置,可使用移动窗口函数,其语句格式为:

Windowname.Move(x,y)

4.8 创建窗口实例

创建窗口的步骤如下:

第一步:新建工作空间,名称为 pbwork。

第二步:新建应用程序,名称为 pbapp。在 Application 的 Open 事件中添加代码

open(w_main)。

第三步:在应用程序中,建立主窗口,名称为:w_main,如图 4.4 所示。

图 4.4 创建主窗口

在窗口对象的属性框里,修改“Title”为“商业进销存”;修改“WindowType”为“mdihelp!” ,

意思是窗体的类型为 MDI 帮助窗体;修改“WindowState”为“maximized!”,意思是在初次

运行时,最大化窗体。

Page 93: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·83·

在 w_main 的 open 事件中添加代码 open(w_login)。

最后单击保存图标 ,保存窗口,在保存对话框中输入窗口名“w_main”。

本 章 小 结

本章叙述了窗口对象的创建、修改、属性设置、事件及其事件处理程序的编写,为后面

的程序编写打下了基础。

练 习

1.窗口画板中有哪些区域?怎样打开和关闭这些区域?

2.窗口有哪几种类型?各有什么特点?一般应用于哪些场合?

3.创建 3 个窗口,主窗口为 w_main,另两个为弹出式窗口 w_popup 和响应式窗口

w_response。在 Application 的 Open 事件中打开主窗口 w_main,在主窗口的 clicked 事件中打

开弹出式窗口 w_popup,在主窗口的 rbuttondown 事件中打开响应式窗口 w_response。调整窗

口的属性,观察窗口的特点和变化。

Page 94: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·84·

第 5 章 窗 口 控 件

控件是 PowerBuilder 应用程序图形界面的重要组成部分。一方面,控件丰富和美化了窗

口界面;另一方面,控件也为用户操纵应用程序以及应用程序表现数据提供了灵活多样的手

段。

所谓控件,实际上就是系统预先定义好的图形对象,开发人员通过把这些对象添加到窗

口上而直接使用它们。控件并不单独保存,而是与它所附的窗口一起保存在应用库中。

由于 PowerBuilder 是标准的面向对象客户端应用程序开发系统,因此,在 PowerBuilde

中控件就是一个 PowerBuilder 对象。和其他对象一样,控件也有属性、函数和事件。

5.1 为窗口添加控件

为窗口添加控件的一般步骤是:在窗口画板的 PainterBar 工具栏中选择要添加的控件按

钮并单击,弹出图标列表,如图 5.1 所示;或选择 Insert→Conterol 菜单下对应控件的子命令,

如图 5.2 所示;然后在窗口布局视图区中的合适位置单击;再根据需要改变控件的大小;最

后选择所添加的控件,并打开画板的属性视图区,设置所添加的控件的属性。

5.1.1 控件概述

窗口控件大致可以分为以下 4 类。

(1)激活动作类型:这些控件包括命令按钮和图片按钮等。

(2)选择项类型:这些控件包括单选按钮、复选框,还可

以用选项组控件对这些选择项进行分组。

(3)显示数据类型:这些控件包括列表框、图片列表框、

数据窗口、下拉列表框、下拉图片列表框、静态文本框、图形、

列表窗口、树状窗口、多格式文本编辑框、进度条、滚动条、

单行编辑框、多行编辑框、编辑掩码控件以及 OLE 控件等。

(4)修饰类型:这些控件是绘图对象,如图片、直线、矩

形、圆角矩形和椭圆等。

窗口控件的名字和图标如图 5.1 和图 5.2 所示。

5.1.2 控件图标选择途径

控件图标可通过如下两条途径选择。

(1)如果所需图标已经出现在控件选择图标上,那么直接单击该图标。

(2)如果所需图标没有出现在控件选择图标上,那么单击下拉箭头,然后单击图标列表

中的所需图标,被单击的图标出现在控件选择图标上,成为新的默认图标。

图 5.1 窗口控件的图标列表

Page 95: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·85·

图 5.2 窗口控件的名字列表

5.1.3 将控件放置到窗口上

将控件放置到窗口上的操作步骤如下。

(1)用窗口画板打开欲放置控件的窗口。

(2)单击控件列表图标上的三角符号,打开控件列表,通过单击选择要放置的控件。如

果要放置的控件刚好出现在控件列表图标上,那么直接单击该控件图标。

(3)将鼠标指针移动到窗口上要放置所选控件的位置,单击鼠标左键,所选控件即被放

置到窗口上,控件大小使用系统的默认设置。

5.1.4 控件名的默认前缀

每种控件系统都提供了一个默认的名称前缀,它们通常是控件类型的英文缩写。通过前

缀,开发人员能够很容易地分辨出控件的类型。表 5.1 中列出了各控件的默认前缀。

表 5.1 控件的默认前缀

控 件 名 称 控件的默认前缀 控 件 名 称 控件的默认前缀

命令按钮(CommandButton) cb_ 单行编辑框(SingleLineEdit) Sle_

图片按钮(PictureButton) pb_ 编辑掩码控件(EditMask) Em_

复选框(CheckBox) Cbx_ 多行编辑框(MultiLineEdit) mle_

单选钮(RadioButton) rb_ 超文本编辑框(RichTextEdit) Rte_

静态文本(StaticText) st_ 水平滚动条(HscrollBar) hsb_

静态超链接(StaticHyperLink) Shl_ 垂直滚动条(VscrollBar) vsb_

图片框(Picture) p_ 水平进度条(HprogressBar) hpb_

树形控件(TreeViex) tv_ 垂直进度条(VprogressBar) vbp_

Page 96: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·86·

续表

控 件 名 称 控件的默认前缀 控 件 名 称 控件的默认前缀

组框(GroupBox) gb_ 水平轨迹条(HtrackBar) Htb_

线段(Line) ln_ 垂直轨迹条(VtrackBar) Vtb_

椭圆(Oval) oval_ 下拉列表框(DropDownListBox) Ddlb_

矩形控件(Rectangle) r_ 图片列表框(PictureListBox) Plb_

圆角矩形(RoundRectangle) rr_ 列表浏览控件(ListView) lv_

下拉图片列表框(Drop Down

Picture List Box) ddplb_ 图片超链接(PictureHyperLink) Phl_

列表框(ListBox) lb_ Tab 控件(Tab) Tab_

OLE 控件(OLE) ole_ 数据窗口控件(DataWindow) dw_

用户对象控件(User Object) uo_ 统计图(Graph) gr_

5.1.5 对控件可进行的操作

将各种控件放入窗口后,可对控件进行如下操作:

� 选择控件;

� 移动控件;

� 改变控件大小;

� 删除控件;

� 对齐控件;

� Tab 次序。

5.2 窗口控件的操作技术

合理地布局窗口上的控件是界面设计的一个重要方面。最初放置控件时,控件的位置通

常不会恰到好处,控件的大小也只是系统默认的尺寸,不一定符合应用程序的要求;因此需

要通过移动控件的位置和改变控件的大小来合理地布局窗口。当某个控件不再需要时,可以

将其删除。无论是移动控件,还是改变控件大小,或是删除控件,在操作之前,首先应该完

成的工作是选择要操作的控件。

5.2.1 选择控件

在窗口画板中操作窗口上的控件之前,要首先选择控件。选择的过程实际上就是告诉窗

口画板下一步要操作的对象。控件被选择后,在控件的 4 个角上出现 4 个黑点,没有被选中

的控件则没有这 4 个黑点。

1.选中单个控件

在窗口画板中选中窗口上单个控件的方法很简单:单击该控件,此时控件周围出现 4 个

黑点,表示控件处于选中状态。

Page 97: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·87·

2.选择相邻的多个控件

在该相邻控件的一角按住鼠标左键;拖动鼠标在希望选择的控件上扫过,拖动过程中有

个方框随鼠标指针的移动放大或缩小;放开鼠标左键,方框所含区域中的所有控件均被选中。

3.选中不相邻的多个控件

单击要选择的第一个控件;按住 Ctrl 键,单击其余要选控件,此时,选中控件的边框上

均显示选中标志(4 个小黑点)。

5.2.2 移动控件

我们可以用鼠标移动控件,也可以用键盘完成同样的任务。鼠标移动控件的方法用于较

长距离的移动,而键盘移动控件的方法常用于精细调整。

1.鼠标移动控件

选择要被移动的一个或多个控件;在其中一个被选控件上按住鼠标左键,然后拖动到所

需位置,放开鼠标左键。拖动过程中,代表所选控件的一组方框随鼠标指针一起移动。

2.键盘移动控件

选择要被移动的一个或多个控件;按箭头键朝需要移动的方向移动。其中:↑箭头表示

向上移动,↓箭头表示向下移动,←箭头表示向左移动,→箭头表示向右移动。

3.改变控件大小

与移动控件时的情况相似,改变控件大小时,既可以使用鼠标,也可以使用键盘。

(1)用鼠标改变控件大小。选择控件,将鼠标指针移到要改变大小的控件的边界上;出

现双箭头鼠标指针时按住鼠标左键,朝需要改变大小的方向移动,直至所需大小时放开鼠标

左键。若同时修改控件的高度与宽度,只要将鼠标指针移动到控件的某个角上,当出现斜方

向的双箭头鼠标指针时按住鼠标左键,朝需要改变大小的方向移动,直至所需大小时放开鼠

标左键。

注:该方法一次只能修改一个控件的尺寸。

(2)用键盘改变控件大小。选择要被改变控件大小的一个或多个控件,按住 Shift 键,然

后按箭头键朝需要改变大小的方向更改控件大小。其中:Shift+↑表示调小控件高度,Shift+↓

表示调大控件高度,Shift+←表示调窄控件宽度,Shift+→表示调宽控件宽度。

注:该方法可以同时改变多个控件的大小。

4.删除控件

删除控件的办法也很简单,有如下几种:

� 选中欲删除控件,按 Del 键。

� 选中欲删除控件,选择“Edit”菜单的“Clear”菜单项。

� 选中欲删除控件,单击窗口画板工具栏上的“Clear”图标。

� 右击要删除控件,从弹出菜单中选择“Clear”菜单项。

Page 98: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·88·

5.对齐控件

在窗口上放置了多个控件后,往往需要让控件按某种方式排列整齐,以使应用程序界面

更加美观。虽然通过移动控件的方法能够手工对齐控件,但比较烦琐且不易控制,特别在没

有选中窗口画板对齐到网格功能时更是如此。PowerBuilder 窗口画板提供了对齐控件的菜单

项,利用它们可以轻易地完成控件的对齐任务。

对齐多个控件的方法为:选中要对齐的多个控件,从“Format”菜单中选择“Align”菜

单项,系统显示如图 5.3 所示的级联菜单,从级联菜单中选择所需的对齐方式。

图 5.3 Tab 键顺序的设置过程

6.复制与粘贴控件

除了利用 Ctrl+T 键在窗口内复制所选控件外,还可以在窗口内或窗口之间复制与粘贴控

件。复制控件时,系统把控件复制到剪贴板上;粘贴控件时,系统把复制到剪贴板上的控件粘

贴到当前窗口上。所粘贴控件的位置、大小以及事件处理程序等控件特性与原控件完全相同。

7.焦点与 Tab 次序

通常情况下,当我们在窗体上放置控件时,会放上多种、多个控件,通过它们的协调工

作,共同完成程序功能。在窗体上放置多个控件后,程序运行时哪些控件能够获得输入焦点,

哪些控件不能获得输入焦点,以及用户按键盘上的 Tab 键时从一个控件跳转到另一个控件的

次序等问题对应用程序来说都是至关重要的。

设计应用程序界面时,除了考虑鼠标操作外,也应该关注键盘操作。在 PowerBuilder 中,

控件的 Tab 属性决定了用户按 Tab 键时焦点的移动次序。下面简要介绍焦点的概念以及设置

控件跳转次序的方法。

(1)焦点。焦点是接收用户鼠标或键盘输入的能力。当控件具有焦点时,才能接收用户

的输入。例如,在有几个文本框的窗口中,只有得到焦点的那个文本框才接收由键盘输入的

文本。

当对象得到焦点时,它将产生 GotFocus 事件;当对象失去焦点时,它将产生 LostFocus

事件。窗口和多数控件都支持这两个事件。

程序运行时,窗口上的大多数控件从外观上就可以看出它是否得到了焦点。得到焦点的

控件周围有一圈虚点。

控件或窗口得到焦点的途径有以下三条:

Page 99: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·89·

� 运行时用户选择对象;

� 运行时用户使用访问键(带下划线的键)选择对象;

� 在代码中使用 SetFocus() 对象函数设置焦点。

(2)设置 Tab 次序。将控件放到窗口上后,PowerBuilder 自动给每个控件(但绘图控件

如直线、椭圆等除外)都赋予一个 Tab 值。该值决定了默认情况下程序运行后用户按 Tab 键

时输入焦点的跳转次序。如果在窗口上新增或删除了控件,PowerBuilder 将自动调整其他控

件的跳转次序。

PowerBuilder 根据如下顺序决定控件的 Tab 值:

� 控件离窗口顶部的距离(Y 值);

� 控件离窗口左边界的距离(X 值)。

具有最小 Y 值的控件是默认跳转次序中的第一个控件,它的 Tab 值也最小;具有次小 Y

值的控件是默认跳转次序中的第二个控件,它的 Tab 值也是次小。如果多个控件的 Y 值相同,

则按照 X 值的大小依次排序。一般情况下,系统按序列 10、20、30 的次序设置各控件的 Tab

值。

如果默认的跳转次序不能满足应用程序的需要,那么我们可以自行设置。修改跳转次序

的步骤为如下。

① 在窗口画板中,从“Design”菜单中选择“Tab Order”菜单项,或单击窗口画板工具

栏上的“Tab Order”图标,系统进入 Tab 模式。

② Tab 模式中每个控件旁边都显示一个红色数字,如图 5.3 所示,这些数字就是控件的

Tab 值。

③ 通过鼠标单击或按 Tab 键,将输入焦点移动到要修改的 Tab 值处。

④ 输入新的 Tab 值,其取值范围为 0~999。

⑤ 按类似方法修改其他控件的 Tab 值。

⑥ 重新选择“Design”菜单的“Tab Order”菜单项,或单击窗口画板工具栏上的“Tab

Order”图标,返回窗口设计状态。

5.3 控件属性、事件和函数

5.3.1 控件属性的设置

窗口画板属性视图区最多有 4 个选项卡,分别为 General、Scroll、Toolbar、Other。根据

当前所选择对象的不同,属性视图区选择卡也有所不同。但是不管选择什么控件,都至少有

General 和 Other 两个选项卡。

General 选项卡:General 选项卡可设置的属性较多,其中 X、Y、Width 和 Height 确定控

件的位置和大小,在设计阶段一般不直接设置其属性,而是通过鼠标或键盘操作间接修改它

们的值。

在 PowerBuilder 窗口及各种控件几乎都由 Enabled 和 Visiblen 属性指定控件的可访问性。

1.使用 Visible 属性

在控件属性对话框中,当“Visible”复选框被选中时,该控件显示在窗口中。如果希望

Page 100: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·90·

某个控件初始时不显示,那么不选中“Visible”复选框即可。

默认情况下,Visible 复选框未被选中的控件在窗口画板中也不显示。要想在窗口画板中

显示被隐藏的控件,那么从“Design”菜单中选择 “Show Invisible”选项。

被隐藏的控件在代码中可通过将 Visible 属性设置为 TRUE 的语句而使控件显示。

例如:cb_1.Visible = TRUE //将显示被隐藏的命令按钮 cb_1

2.使用 Enabled 属性

在控件属性对话框中,当“Enabled”复选框被选中时,该控件处于活动状态,它能够响

应用户的操作。例如,用户在单击处于活动状态的命令按钮时,将触发该按钮的 Clicked 事件。

如果希望某个控件只是显示而不响应用户的操作,那么选中“Visible”复选框,不选中

“Enabled”复选框。处于不活动状态的控件不响应用户操作。例如,将某个按钮置于不活动

状态后,用户即使单击该按钮,也不会触发按钮的 Clicked 事件,从而也就不会执行该事件的

事件处理程序。

在程序中可以通过给控件的 Enabled 属性赋以 TRUE 值而使控件处于活动状态。

例如:cb_2.Enabled = TRUE //将使命令按钮 cb_2 可用

5.3.2 控件事件及其脚本

不同控件类别所具有的事件各不相同,但多数控件都有单击、双击、拖放等响应用户操

作的事件,也有构造(Constructor)、析构(Destructor)、计时等系统事件。

脚本是事件的实现部分,可通过脚本视图区创建。

5.3.3 控件函数

在程序代码中,可以通过控件函数直接操作控件对象,PowerBuilder 9.0 中定义了大量的

控件函数,下面介绍几种常用的控件函数。

1.Hide()

隐藏控件,使控件不可见。不可见的对象用户不能对其进行操作,也不响应任何事件,

其效果等价于使对象处于不可用(Disabled)状态。

2.Show()

当指定控件被隐藏时调用该函数显示该控件。若对象已经可见,Show()函数把该对象显

示在其他对象的前面。

3.Move()

将控件移动到指定的位置。对大多数控件来说,该位置相对于其父窗口;对某些窗口对

象来说,该位置相对于屏幕。

4.Drag(dragmode)

开始或结束控件的拖曳操作。其中 dragmode 指定希望进行的拖曳操作类型,此参数是一

个 DrageMode 类型的值,各值的意义分别说明如下。

Page 101: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·91·

Begin!:进入拖曳模式。

Cancel!:停止拖曳操作但不触发 DragDrop 事件。

End!:停止拖曳操作,如果被拖曳控件位于某个拖曳操作的目的对象上,那么触发该对

象的 DragDrop 事件。

5.Print()

在打印作业中打印控件或窗口。

6.Resize(Objectmane,Width,Height)

改变控件或对象的大小。该函数首先修改控件或对象的 Width 和 Height 属性,然后重绘

该控件或对象。参数说明如下。

Objectmane:所要改变其大小的控件或对象名称。

Width:修改后的对象或控件的宽度,以 PBU 为单位。

Height:修改后的对象或控件的高度,以 PBU 为单位。

7.SetFocus()

将焦点设置到指定控件上。

8.SetRedraw(boolean)

指定每次修改控件属性后是否自动重绘控件。其中 boolean 为 Boolean 型,指定修改控件

的属性后 PowerBuilder 是否自动对控件进行重绘,其有效取值如下。

TRUE:修改属性后自动重绘该控件。

FALSE:修改属性后不自动重绘该控件。

5.4 重要控件的应用

5.4.1 命令按钮

命令按钮在窗口画板工具栏控件图标列表中的图标为 。命令按钮总以三维形象显示,

它没有其他大多数控件具备的 Border(边框)属性,也不能修改按钮的标题字符颜色和背景

颜色。当用户单击按钮时,它自动显示成按下的状态。

1.设置命令按钮属性

命令按钮属性对话框由三个标签页组成。

(1)“General”标签页用于定义命令按钮的一般属性,包括名称、标题、是否显示、是

否可用等。其中:

�“Name”编辑框指定按钮的变量名。

�“Text”编辑框指定显示在按钮上的文字(按钮标题)。

�“Visible”复选框被选中时按钮显示在窗口上,否则被隐藏。

�“Enabled”复选框被选中时按钮可用,否则用户不能操作该按钮。

Page 102: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·92·

�“Default”复选框被选中时,该按钮成为当前窗口的默认按钮;程序运行时,即使输

入焦点位于其他控件上,用户按下 Enter 键也将触发默认按钮的 Clicked 事件,默认按

钮有个浓重的黑色轮廓。

�“Cancel”复选框被选中时,该按钮成为当前窗口的取消按钮,用户按下 Esc 键将触发

默认按钮的 Clicked 事件。

(2)“Font”标签页用于定义命令按钮标题的显示字体。

(3)“Other”标签页用于定义命令按钮的以下属性:

�“Position”属性用于定义命令按钮的放置位置、宽度和高度。

�“Pointer”属性用于定义当鼠标指针位于该命令按钮上时鼠标指针的形状。

�“Drag & Drop”属性用于定义当拖曳该命令按钮时鼠标指针的形状。

2.命令按钮的事件

命令按钮有十几个事件,其中最常用、最重要的事件是 Clicked 事件,该事件在被单击时

触发。我们在这个事件的事件处理程序中编写按钮被按下时要执行的代码。

5.4.2 静态文本编辑及显示控件

1.静态文本控件

静态文本控件在窗口画板工具栏控件图标列表中的图标为 ,常用于向用户显示提示信

息或说明没有标题控件的作用。

(1)静态文本控件的属性。静态文本控件是 PowerBuilder 众多对象之一,其常用属性如

下:

�“Text”属性设置静态文本控件上显示的文本。

�“Border”下拉列表框用于选择该控件的边框。

�“Alignment”下拉列表框指定显示文本的对齐方式。

�“Border Color”选择边框的颜色。

�“Fill Pattern”指定填充图案。

(2)静态文本控件的事件。静态文本控件有一组事件(如 Clicked、DoubleClicked 等),

但通常极少对其编程。

2.单行编辑框

单行编辑框(SingleLineEdit) 通常用于输入一行文本或键入用户保密字等。

(1)单行编辑框的属性。

�“Text”属性保存用户键入的内容以及当前显示的文本。

� 如果选中“Password”复选框,则单行编辑框中显示星号(*)而不是用户键入的实际

字符,实际字符保存在“Text”属性中,该功能常用于设计保密字的输入。

� 选中复选框“Auto HScroll”后,将允许用户键入超过单行编辑框实际长度的文本。当

到达单行编辑框的末尾时,随着输入的继续,文本自动向左滚动。

� 选中“Display Only”复选框将禁止用户输入。

�“Case”列表框指定是否强制性地将用户键入的字母进行大小写转换:Any——不作转

Page 103: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·93·

换,lower——全部转换成小写,UPPER——全部转换成大写。

�“Limit”指定可以输入的最大字符个数,有效值在 0~32 767 之间,其中 0 表示不限

制输入字符个数。

�“Accelerator”中可以输入一个字符(如 m),用于指定单行编辑框的访问键,这样用

户通过按 Alt+字符(如 Alt+m)键就能将输入焦点转到该控件。

�“Border”指定单行编辑框的边框风格。其中:None——无边框,Box——方框边框,

ShadowBox——阴影方框边框,3D Raised——三维上凸,3D Lowered——三维下凹。

(2)单行编辑框的事件。

� Modified 事件:当用户修改了单行编辑框显示的文本并用 Tab 键或鼠标移走输入焦点

时,触发该事件。可以在这个事件的事件处理程序中检查用户输入是否有效,从而决

定是否允许移走输入焦点。

� GetFocus 事件:当用户用 Tab 键或鼠标把输入焦点移动到该控件时,触发该事件。在

这个事件的事件处理程序中可以完成一些准备工作。

� LoseFocus 事件:当移走输入焦点时触发该事件。

3.多行编辑框

多行编辑框(MultiLineEdit)在窗口画板工具栏控件图标列表中的图标为 。该编辑框

常用于输入大块的文字,如人员简历、长篇文章等。

(1)多行编辑框属性。其中与单行编辑框同名的属性,其用法和功能也相同,下面介绍

多行编辑框特有的属性。

� 选中“Auto VScroll”复选框将自动下滚文本。

� 选中“Auto HScroll”复选框后,随着用户键入或删除文字,多行编辑框中的内容自动

向左或向右滚动。

� 选中“HScroll Bar”或“VScroll Bar”复选框后,将在多行编辑框上分别加上水平滚

动条或垂直滚动条。

� 选中“Ignore Default Button”复选框后,用户在多行编辑框中键入 Enter 键时不会触

发当前窗口上默认按钮的 Clicked 事件,而是在多行编辑框中生成一个新行。否则,

用户在多行编辑框中键入 Enter 键时将触发当前窗口上默认按钮的 Clicked 事件,而不

是生成一个新行,此时,用户想生成新行时,需要按 Ctrl+Enter 组合键。

�“Alignment”列表框指定多行编辑框中文字的对齐方式:Left——左对齐,Right——

右对齐,Center——居中对齐;

�“Tab Stop”定义按 Tab 键时跳多少个字符,默认值为 8。

(2)多行编辑框事件。多行编辑框使用的常用事件依然是 Modified、GetFocus、LoseFocus,

其触发时机和用法与单行编辑框相同。

4.编辑掩码控件

编辑掩码控件(EditMask)在窗口画板工具栏控件图标列表中的图标为 。该控件能够

创建一个掩码,使用户必须按指定格式输入字符(因而也只接受指定格式的字符),并且它能

够完成用户输入的自动格式化,因此可以把编辑掩码控件想像成一个聪明的单行编辑框——

它知道输入数据的格式。

Page 104: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·94·

编辑掩码控件属性:掩码编辑框的属性对话框的“General”标签页与单行编辑框相同,

各属性的含义也一样,在此不再重复。

单击“Mask”标签,可看到设置掩码风格的标签页,如图 5.4 所示,各属性的含义为:

图 5.4 编辑掩码控件的“Mask”标签

� 在“Mask Data Type”列表框中指定要输入数据的类型。单击“Mask Data Type”旁边

的向下小三角,可以见到 6 种类型:datemask!(日期类型)、datetimemask!(日期

时间类型)、decimalmask!(小数类型)、numericmask!(数值类型)、stringmask!(字

符串类型)和 timemask!(时间类型)。选择不同类型后,“Mask”列表框中的掩码

格式也随之改变。

�“Mask”列表框中列出了所有有效的掩码字符以及一些实例。单击其中任意一行就会

将该行内容加入到“Mask”编辑框中。

�“Mask”编辑框定义所需要的用户输入格式。通过单击“Mask”列表框中相应行或直

接输入格式字符来定义输入格式。例如,当选择字符串类型“stringmask!”,输入掩

码“##-#!!#”后,用户如果输入 345ab6,该编辑框自动将用户输入格式化为 34-5AB6。

各种数据类型所使用的具体掩码字符请参阅相关资料。

� 选中“Spin”复选框后,其他几个选项才能使用。这时,掩码编辑框的右边界上出现

两个滚动小按钮,单击该按钮可调整掩码编辑框的值。

� 选中“UseCode Table”复选框时,以列表形式调整,否则以数值形式调整。

5.4.3 单选钮、复选框与组框

使用图形界面的目的是为了在直观明了的同时能方便用户的操作。通过简单选择就能完

成的任务何苦还要用户费力劳神地一个个地键入呢?单选钮、复选框正是为了方便用户做出

抉择而设计的。单选钮用来表示一组互斥的选项,用户只能从中选择一个。

单选钮带有一个圆形图案,当被选中时,其图案中心出现一个黑点;未被选中时,其图

Page 105: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·95·

案中心为空白。

复选框用来表示是/否或真/假两种状态,它常常被成组使用,同一组中可有多个复选框被

选中。复选框被选中时,方框内出现一个叉(×)号;未被选中时,方框内为空白。

单选钮、复选框的分组通过组框来实现,因此,我们通常看到的界面中,组框与单选钮、

复选框常常结伴而行。

1.单选钮

单选钮(RadioButton)又称做选项按钮和单选框,它在窗口画板工具栏控件图标列表中

的图标为 。我们既可以把多个单选钮放在一个窗口中(这时窗口中的所有单选钮成为一

组),也可以用组框把单选钮分成不同的组,同组中的单选钮联手协作,当选中其中一个时,

其余单选钮自动解除选中状态。

(1)属性。

�“Automatic”指定单击该单选钮时,是系统自动将其置为选中状态(显示一个圆点),

还是通过开发人员编写事件处理程序而将其置为选中状态(手工方式)。选中

“Automatic”复选框时系统自动处理,否则需要在单选钮的 Clicked 事件中编写相应的

事件处理程序。需要说明的是,当单选钮处于组框中时,“Automatic”属性被忽略,

系统自动调整选中单选钮的选中状态。

�“Text”编辑框中键入显示在单选钮上的标题。选中“Left Text”复选框时,单选钮的

标题显示在圆形图案的左边,否则显示在右边。

�“Checked”复选框指定该单选钮初始时是否被选中,一组单选钮中总应该有一个单选

钮被初始选中。

�“Border”列表框用于选择单选钮的边框类型。其中:None——无边框,3D Raised——

三维上凸,3D Lowered——三维下凹。

另外,单选钮的文本字体、前景颜色、背景颜色等属性在“Font(字体)”标签中设置。

(2)事件。单选钮的常用事件是 Clicked,它在用户单击单选钮时触发。

2.复选框

复选框(CheckBox)用于让用户设置独立的选项,多个复选框彼此相互独立,即使把它

们放到一个组框中,也不影响复选框的行为,它们依然彼此独立。复选框在窗口画板工具栏

控件图标列表中的图标为 。

(1)属性。复选框中大部分属性的含义与单选钮相同,下面就其不同属性予以说明。

�“Automatic”属性指定当用户单击该复选框时,由系统自动处理选中状态的设置,还

是由开发人员通过程序进行手工控制。选中“Automatic”时,系统自动处理,此时,

如果复选框处于选中状态,用户单击后将变成非选中状态。未选中“Automatic”时,

则需要编写相应的事件处理程序。

�“Three State”属性用于指定复选框是否使用除“是/否”两种状态之外的第三种选择,

又称为第三态。当应用程序需要处理第三态时,选中“Three State”,此时用户单击

复选框时,复选框在三种状态之间循环。复选框的第三态看上去像选中状态,但其方

框的背景是灰色的。

� 选中“Three State”属性后,可以通过选中“Third State”而使复选框以第三态作为其

Page 106: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·96·

初始状态。“Third State”与“Checked”属性互斥,同一时刻只能选择其中之一。

(2)事件:Clicked 事件是复选框的常用事件,它响应用户的单击操作,在 Clicked 事件

的事件处理程序中可以做一些验证与处理工作。

3.组框

组框(GroupBox) 有两个用途:一是装饰界面,二是对单选钮分组。因此在一个窗

口中可以有几组单选钮。组框的分组作用只对单选钮有效,对其他控件,组框只具有装饰效

果。

组框的属性很简单,“Text”属性指定显示在组框上的标题,通过在字母前放上&字符,

可以为组框指定访问键;组框的其他属性与其他控件的相同属性功能相似,在此不再重复。

在组框中放置单选钮的步骤如下:

� 在窗口上放置一个组框;

� 单击窗口画板工具栏上的单选钮(RadioButton)图标;

� 移动鼠标指针到组框中,然后单击鼠标;

� 放置多个单选钮时,按 Ctrl+T 键进行连续复制。

5.4.4 修饰性控件

1.直线(Line)

直线控件前缀为 ln_,具有较少的属性,其属性为设置视图区的 Other 选项卡。

2.椭圆(Oval)

椭圆控件前缀为 oval_,具有较少的属性,其属性为设置视图区的 Other 选项卡。

3.图片框(Picture)

PowerBuilder 提供的图片框控件前缀为 p_,以便利的方式展现多姿多彩的图像。在图片

框控件中能够显示 BMP、RLE、JPG、GIF 或 WMF 格式的图像。

4.动画

动画能够使应用程序界面更活泼有趣,以便进一步吸引用户的注意力。利用图片框,通

过简单的编程就可以构造出动画。动画的基本做法如下。

选择一个能够显示图像的对象,然后在程序运行时动态变换图像或改变图像的显示位置。

因此,在具体制作动画之前,必须首先设计或选择一幅或多幅图像,多幅图像时图像之间应

该相对连贯。现在,图像文件多如牛毛,PowerBuilder 本身也携带了许多图像。如果它们不

能使你满意,那么用 PowerBuilder 携带的图像编辑器 WATCOM Image Editor 创建几幅图像也

不是件难事。

当通过移动对象来得到动画时,对象的移动方法就有讲究了。最容易想到的方法是动态

地改变对象的 X,Y 属性。例如,想让一幅图片沿窗口四周移动,可以这么做:在窗口上的

左上角放一个图片框,然后为图片框定义一个图像文件,在窗口的 DoubleClicked 事件中键入

下述代码即可。

Page 107: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·97·

integer li_x,li_y

li_x=p_1.x

li_y=p_1.y

Do While p_1.x < (this.Width - 250)

p_1.x++

Loop

Do While p_1.y < (this.Height / 2)

p_1.y++

Loop

Do While p_1.x > li_x

p_1.x --

Loop

Do While p_1.y > li_y

p_1.y --

Loop 运行程序后在窗口上双击,图片就在窗口中移动起来,动画效果已经有了,但存在一个

恼人的问题,就是移动过程中的闪烁现象,这虽说不是个大问题,但终究是个缺陷,难以令

人满意。

使用图片框的对象函数 Draw()可避免移动过程中的闪烁现象。

语法:picturename.Draw(xlocation,ylocation)

其中,(xlocation,ylocation)是图像移动到的新位置。

Draw()函数并非真的移动图片框的位置,而是直接在窗口上绘制图片框中的图像,这种

方式避免了重绘图片框控件和窗口所花的时间,因此速度更快,减少和避免了闪烁。在 Draw()

函数绘制下一幅图像时,它并不自动清除前一幅图像,因此,用 Draw()函数制作动画时会在

窗口上留下一些痕迹。解决的方法有两个:

� 设计图像时,让图像的背景颜色与窗口的背景颜色相同。

� 在窗口上再放置一个图片框,该图片框中的图片选择窗口的背景颜色,移动前一个图

片框时,让后一个图片框跟在前一个图片框后面移动,由后一个图片框覆盖掉前一个

图片框遗留的痕迹。

现在改造前面的示例,使用 Draw()函数替代修改图片框的 X、Y 属性,代码为:

integer li_x,li_y

li_x=p_1.x

li_y=p_1.y

Do While li_x < (this.Width - 250)

li_x++

p_1.Draw(li_x,li_y)

Loop

Do While li_y < (this.Height / 2)

li_y++

p_1.Draw(li_x,li_y)

Loop

Do While li_x > p_1.x

li_x--

Page 108: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·98·

p_1.Draw(li_x,li_y)

Loop

Do While li_y > p_1.y

li_y --

p_1.Draw(li_x,li_y)

Loop 运行程序后,双击窗口,动画效果就流畅多了。

5.4.5 标签控件

标签控件(Tab)是我们在 PowerBuilder 开发环境中使用最多的控件之一。当设置某个对

象的属性时,打开的属性对话框使用的就是标签控件。标签控件能够把多种数据和程序选项

封装在一个控件中,并允许用户通过简单的操作访问这些数据和选项。一般来说,标签控件

由多个标签组成,用户能够看到的总是当前标签页。

1.相关术语

(1)标签控件。标签控件是一个能够放置到窗口或用户对象中的控件。它由两部分组成:

一是放置各标签页标题的标签部分,二是放置标签页的区域。

(2)标签页。标签页是展示数据和选项的场所。一般说来,每个标签控件都有多个标签

页,分别对应多组数据和选项。这些标签页占据标签控件中的相同区域,同一时刻用户只能

看到当前标签页,它覆盖了其他标签页。

(3)标签。标签是标签页的标题,同时也是标签页的标识。当某个标签页被其他标签页

遮挡时,单击该标签页的标题,这个标签页就成为当前标签页,显示在标签控件中,同时遮

挡住其他标签页。

2.建立标签控件

(1)放置标签控件。在窗口上放置标签控件的方法如下。

� 用窗口画笔打开要放置标签控件的窗口。

� 单击窗口画笔工具栏控件图标列表中的标签控件图标,然后在窗口上单击,标签控件

就被放置到窗口上了。

(2)增加新的标签页。在窗口上放置了标签控件后,该控件自动携带了一个空白的标签

页,该标签页称做嵌入式标签页(TabPage)。

在这个标签页中,我们可以像在窗口上放置控件那样放置所需要的各种控件。另外,还

可以把一个可视用户对象作为标签控件的标签页。下面介绍增加嵌入式标签页的方法。

� 在标签控件上部显示标签的区域右击,系统弹出菜单。

� 从弹出的菜单中选择“Insert TabPage”菜单项。

� 一个新的空白嵌入式标签页插入到标签控件中。

� 在该标签页上添加所需控件。

(3)删除标签页。当不需要某个标签页时,可以简单地把它删掉,方法如下。

� 单击要删除标签页的标签,该标签页显示在标签控件中。

� 右击标签页区域(不要在标签区域右击),系统弹出菜单。

� 从弹出的菜单中选择“Delete”菜单项或“Cut”菜单项。

Page 109: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·99·

两者的区别是,“Delete”菜单项清除当前标签页,“Cut”菜单项将当前标签页剪切到

PowerBuilder 剪贴板上。

(4)调整标签位置。如果想重新组织标签控件中各标签的左右次序,可采用下列做法。

右击控件上部显示标签的区域,从弹出的菜单中选择“Properties�”菜单项,再选择“Page Order”标签 ,通过拖曳操作调整各标签的位置直至满意为止。

(5)标签页中的控件。标签控件的长处就在于它能够分类组织多种其他控件,因此,我

们也可以把标签页看成是缩小了的窗口。对嵌入式标签页来说,加入控件的方法与在窗口上

加入控件的方法完全相同。通过复制、剪切、粘贴操作可以在标签页之间、标签页与窗口之

间移动或复制对象,但是,不能通过拖曳操作直接把标签页中的控件拖曳到窗口上;反之,

也不能把窗口上的控件直接拖曳到标签页上,使其成为标签页的一部分。 对标签页上各控件编程时,相应的标签页成为该标签页上其他控件的父对象,因此,要

指明是哪个标签页上的控件。例如:

tab_1.tabpage_1.dw_1.SetTransObject(sqlca)

tab_1.tabpage_1.dw_1.Reset()

tab_1.tabpage_1.em_1.Text = string(today(), ’yyyy’)

tab_1.tabpage_1.em_2.Text = string(today(), ’yyyy’)

tab_1.tabpage_2.dw_2.SetTransObject(sqlca)

tab_1.tabpage_2.dw_2.Reset()

tab_1.tabpage_2.em_3.Text = string(today(), ’yyyy’)

3.标签控件的属性

在设计标签控件时,常常要用到两个属性对话框,一个是标签控件的属性对话框,另一

个是标签页的属性对话框。 标签控件属性对话框设置该控件以及所有标签页公用的属性,标签页属性对话框设置各

个标签页的具体属性,每个标签页都有相应的标签页属性对话框。 打开标签控件属性对话框的方法是:在标签控件上部显示标签的区域右击,从弹出的菜

单中选择“Properties⋯”菜单项,或通过单击选中标签控件后单击窗口画笔工具栏上的

“Properties”图标,系统打开标题为“Tab”的标签控件属性对话框。 在标签控件属性对话框中可以设置标签控件的下列选项(将选项名中包含的空格删除后,

即为相应的属性名,可以在代码中直接引用)。 (1)Name:标签控件的变量名称,为了方便编码,该名称应该具备清晰的意义。 (2)Tag:用于保存你想保存的任何文字。 (3)Alignment:是枚举类型属性,用于指定标签在标签控件上的对齐方式。其中:Left——

左对齐,Right——右对齐,Center——居中对齐。 (4)Bold Selected Text:指定当前标签页的标题(标签)是否以加粗方式显示,选中该复

选框时加粗,否则与其他标签一样显示。 (5)Create On Demand:如果选中该复选框,那么在程序运行后用户选择某个标签时,

相应的标签页才实例化,优点是程序运行后有可能节省系统资源(通常用户不会查看所有的

标签页),否则在创建标签控件时就创建相应的标签页。 (6)Fixed Width:指定标签是固定宽度还是根据文字长短自动调整宽度。选中该复选框

后,标签控件上所有标签的宽度都调整到文字最长标签的宽度;否则,各标签根据自身文字

Page 110: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·100·

的长短调整宽度。

(7)Focus On Button Down:选中该复选框后,当用户通过单击选择某标签页后,相应的

标签上出现一个由点组成的方框。

(8)Multiline:指定标签一行显示不下时的处理方式。选中该复选框后,当一行显示不

下所有标签时,标签被多行显示;否则,当一行显示不下所有标签时,标签控件的右上角显

示一个双箭头,用户可以通过单击箭头使被隐藏的标签出现在标签控件上。

(9)Perpendicular Text:当该复选框被选中时,标签以竖条方式显示,这样每行能放置更

多的标签,但标签页的显示区域却变小了;否则标签以横条方式显示(即我们常见的方式)。

(10)Picture On Right:指定标签上图像的显示位置。选中该复选框时,图像放在标签文

字的右边,否则放在左边。

(11)Power Tips:指定当用户把鼠标指针移动到标签上并稍微停留时,是否显示该标签

的简短提示。需要显示提示时,选中该复选框,并在标签页的属性对话框中设置相应的提示

文字(在 PowerTip Text 单行编辑框中设置)。通常在标签上没有文字只有图片时使用这项功

能。

(12)Ragged Right:选中该复选框时,各标签的宽度由它的标题和“FixedWidth”选项

确定;未选中该复选框时,系统自动调整各标签的宽度,使其沿着控件边沿填满整个标题区

域。

(13)Selected Tab:指定标签控件初始显示的标签页的编号,各标签从左到右编号依次为

1,2,3,⋯。

(14)Show Picture:指定标签上是否显示图片。选中该复选框时,标签上显示图片,否

则不显示。

(15)Show Text:指定标签上是否显示文字。选中该复选框时,标签上显示文字,否则

不显示。

(16)Tab Position:指定标签显示在标签控件上的位置。

(17)Background Color:设置标签控件的背景颜色。

4.标签页属性

每个标签页都有一组属性,它们用于设置各标签页的外观和功能。在标签页属性对话框

的“General”标签页中可以设置标签页的下述属性。

(1)Name:标签页的变量名,应该起个有意义的名字。

(2)Tab Text:显示在标签页标签上的文字,简明扼要是对该文字的基本要求。

(3)Tag:用于保存希望与标签页一起保存的任何字符串。

(4)PowerTip Text:标签的提示文字。当标签控件的 PowerTips 属性设置为 TRUE 后,

用户将鼠标指针移动到标签上并稍微停留时,该提示文字出现在鼠标指针的下方。

(5)Background Color:设置标签页的背景颜色。

(6)Tab Background Color:设置标签的背景颜色。

(7)Tab Text Color:设置标签文字的颜色。

5.标签控件的事件

标签控件的属性和函数很多,但它与众不同的事件却比较少,主要有 SelectionChanging

Page 111: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·101·

事件和 SelectionChanged 事件,下面介绍这两个事件的触发时机。

(1)SelectionChanging 事件。该事件在用户选择另一个标签页时触发,它有两个整数类

型的参数:oldindex 和 newindex。oldindex 是当前标签页的位置号,newindex 是用户新选择

标签页的位置号。

在 SelectionChanging 事件的事件处理程序中,可以检查当前标签页的各种选项是否符合

程序要求。当不符合时,返回 1 将阻止用户转移到其他标签页;返回 0 允许用户选择新的标

签页。

(2)SelectionChanged 事件。该事件在用户选择了新的标签页后触发,其参数与

SelectionChanging 事件相同。SelectionChanged 事件通常用于初始化用户新选择的标签页,如

设置某些选项,为数据窗口提取数据等。

5.4.6 列表框、下拉列表框、图片列表框、下拉图片列表框

1.列表框

利用列表框控件可在一个矩形框中显示多行选项,并

允许同时选中一行或多行。列表框的属性视图中有 4 个选

项卡,分别为“General”、“Items”、“Font”和“Other”,

如图 5.5 所示。

(1)列表框控件的属性设置。

① General 选项卡的属性。该属性中的基本属性

“Visible”、“Enabled”、“HScrollbar”和“VScrollbar”同其

他控件类似,在此不再详述。

Sorted:设置列表框中的条目是否按字母顺序排序。

默认值为“True”。

DisableNoScroll:设置列表框的滚动条是否一直可见。

如果设置了此属性,即使数据项很少,不能充满列表框,

滚动条也可见,但处于不可用状态。

MultiSelect:指定是否允许用户同时选择多项。选中

该复选框时,允许用户进行多项选择,此时用户只要单击

多个选项就能选择多个选项,否则用户只能选择一个选项。

ExtenedSelect:该属性与 MultiSelect 属性配合,为用

户提供了更多的多项选择的方法,具体描述如下。首先,

单击选中一个选项。然后,按鼠标左键拖动选中多个连续选项;也可以选中一个选项,按住

“Shift”键后,单击鼠标选中连续多个选项;或按住“Ctrl”键后,单击鼠标选中多个不相连

的选项。

Accelerator 属性:指定是否可以使用热键将输入焦点置到列表框控件上。如果想使用热

键,则在此属性的编辑框上直接输入一个字符。例如,输入 m,则按 Alt+M 组合键就可以将

输入焦点切换到列表框中。

TabStop 属性:此属性设置列表框中条目文字的制表位。

② Item 选项卡的属性。Item 选项卡用于设定列表框中所列项目。输入一行项目文本后

图 5.5 列表框控件的属性

Page 112: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·102·

按“Enter”键即可出现下一行;若想删除一行,单击想要删除行的行号,然后按删除键即可。

(2)列表框控件的常用函数。

AddItem()函数:该函数用于在列表框的尾部增加一个条目。

语法:Listboxname.AddItem(item)

其中,Item 是一个字符串,是要加入列表框的条目。返回值类型为“Integer”,返回新加入的

条目在列表框中的位置。如果列表框是排序的,则返回排序后的位置;若返回-1,表示出错。

如果参数为空,则返回值为空。注意,使用这个函数将时,如果列表框是排序的,条目插入

后列表框将会重新进行排序。此外,列表框允许有重复的条目。

DeleteItem()函数:该函数从列表框中删除指定位置的一个条目。

语法:listboxname.DeleteItem(index)

其中,参数 Index 是要删除条目的位置。返回值类型为“Integer”,返回删除条目后列表框中

条目的个数。返回-1 表示出错。如果参数为空,则返回值为空。

InserItem()函数:在列表框中指定位置之前插入一个条目。

语法:listboxname.InsertItem(item,index)

其中 item 是一个字符串,是要加入列表框的条目;index 是要插入条目的位置。返回值类型

为“Integer”,返回新加入的条目在列表框中的位置,如果列表框是排序的,则返回排序后的

位置。返回-1 表示出错。如果参数为空,则返回值为空。

FindItem()函数:在列表框中搜索条目,并返回查找到的条目位置。

语法:listboxname.FindItem(text,index)

其中,text 是一个字符串,是要搜索的条目;index 是开始搜索条目的位置,如果要搜索整个列

表框,设置此参数为 0。返回值类型为“Integer”,返回找到的第一个条目的位置。PowerBuilder

使用靠左匹配,列表框的条目可以比要搜索的字符串长,只要从开始的位置能和要搜索的字符

串相等就认为匹配成功。如果没找到条目或者出错则返回-1;如果参数为空,则返回值为空。

SelectItem()函数:该函数在列表框中搜索条目,返回查找到的条目位置,并高亮选中找

到的条目。

语法:listboxname.SelectItem(item,index)

其中,Item 是一个字符串,是要搜索并选中的条目;index 是开始搜索条目的位置,如果要搜

索整个列表框,设置此参数为 0。返回值类型为“Integer”,返回找到的第一个条目位置。

PowerBuilder 使用靠左匹配,列表框的条目可以比要搜索的字符串长,只要从开始的位置能

和要搜索的字符串相等就认为匹配成功。如果没找到条目或者出错则返回-1;如果参数为空,

则返回值为空。

SelectedItem()函数:用于获得列表框中被选中条目的文本。

语法:listboxname.SelectedItem()

返回值类型为 String,返回列表框中被选中条目的文本。如果列表框中没有条目被选中,则

返回空串""。如果列表框的设置可以允许多个条目被选中,则此函数返回第一个选中条目的

文本。

SelectedIndex()函数:用于获得列表框中被选中条目的位置。

语法:listboxname.SelectedIndex()

返回值类型为“Integer”,返回列表框中被选中条目的位置。如果列表框中没有条目被选中或

者出错,则返回-1;如果列表框的设置可以允许多个条目被选中,则此函数返回第一个选中

Page 113: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·103·

条目的位置。

State()函数:检查列表框指定位置的条目是否被选中。

语法:listboxname.State(index)

其中,index 是指定的位置。返回值类型为“Integer”,返回 1 表示指定位置的条目被选中,

返回 0 表示指定位置的条目没有被选中。如果给出的位置超出了列表框的条目总数,则返回

-1;如果参数为空,则返回值为空。

SetState()函数:设置列表框中指定条目的高亮状态,这个函数只能在列表框的 MultiSelect

属性为 True 时才能使用。

语法:listboxname.SetState(index,State)

其中,index 是指定的位置;state 是一个布尔值,指明高亮选中状态,为“True”时选中此条

目,为“False”不选中此条目。返回值类型为“Integer”,返回 1 表示成功,返回-1 表示出

错。如果有参数为空,则返回值为空。

Text()函数:获得列表框中指定位置的文本。

语法:listboxname.Text(index)

其中,index 是指定的位置。返回值类型为“String”,返回列表框中指定位置的条目文本。如

果 index 值没有指向任何有效的位置,则返回空串""。

Top()函数:获得当前可见的列表框区域中的第一个条目位置。

语法:listboxname.Top()

返回值类型为“Integer”,返回当前可见的列表框区域中的第一个条目位置。如果出错返回-1。

使用这个函数可以知道用户是否滚动了列表。

SetTop()函数:滚动列表框,使指定位置的条目成为当前可见的列表框区域中的第一个条目。

语法:listboxname.Text(index)

其中,index 是指定的位置。返回值类型为“Integer”,返回 1 表示成功;返回-1 表示出错。

如果参数为空,则返回值为空。使用这个函数滚动列表框中的条目滚到一个合适的位置。

TotalItems()函数:获得列表框中的条目总数。

语法:listboxname.TotalItems()

返回值类型为“Integer”,返回列表框中的条目总数。如果列表框中没有条目,则返回 0,如

果出错返回-1。

TotalSelected()函数:获得列表框中被选中的条目总数。

语法:listboxname.TotalSelected()

返回值类型为“Integer”,返回列表框中被选中的条目总数。如果列表框中没有条目被选中,

则返回 0;如果出错返回-1。注意,这个函数只有当 MultiSelect 属性为 True 时才有效。

Reset()函数:该函数删除列表框中的所有条目。

语法:listboxname.Reset()

返回值类型为“Integer”。成功则返回 1,出错返回-1。

(3)列表框控件的常用事件。

SelectionChanged 事件:当列表框中的一个条目被选中时触发此事件。

2.下拉列表框

下拉列表框就是把单行编辑框与列表框的功能结合起来,并具有这两种控件的特点。

Page 114: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·104·

下拉列表框的属性大多与列表框相同,下面介绍两个比较特殊的属性。

(1)AllowEdit 属性:设置用户是否可以编辑下拉列表框中编辑框内的文本。

(2)ShowList 属性:如果选中这个属性,则选项列表将会一直显示在屏幕上;如果不选

中此项,则只有当用户单击下拉列表框右边的小箭头时才会显示选项列表。

因为下拉列表框具备单行编辑框和列表框的特点,所以其函数和事件也兼备了两种控

件的特点。前面内容仔细地介绍过这两种控件的函数和事件,这里不再说明。

3.图片列表框

图片列表框与列表框非常相近,它是在列表条目中除文本外加了一幅小图片。图片列表

框的属性和列表框的属性非常相近,图片列表框的属性多了一个“Pictures”选项卡,其中包

括下列 4 个属性。

(1)PictureName 属性:该属性用于设置图片列表框所使用的全部图片,可以从下拉列表

中选择一个 PowerBuilder 预定义的图片,也可以单击浏览按钮,从磁盘中选择一个图像文件;

图像文件的类型可以是 BMP 文件、GIF 文件、JPG(JPEG)文件或者一个图标文件(*.ICO);

图片左边的数字是该图片的编号,这个编号用于与列表项联系。

(2)PictureMaskColor 属性:此属性设置列表框对图片进行掩码运算的颜色,默认时为透

明(Transparent)方式。

(3)PictureWidth 属性:设置图片的宽度,有如下 3 个选项。

� Default:按图片本身的宽度显示。

� 16:图片按 16 像素宽度显示。

� 32:图片按 32 像素宽度显示。

(4)PictureHeight 属性:设置图片的高度,有如下 3 个选项。

� Default:按图片本身的高度显示。

� 16:图片按 16 像素高度显示。

� 32:图片按 32 像素高度显示。

图片列表框的 Items 选项卡和普通列表框的 Items 选项卡略有不同,其中多了一列图片编

号,因此该编号对应的图片会显示在列表框条目文本的左边。图片列表框控件的常用函数和

事件与列表框相同。

4.下拉图片列表框

下拉图片列表框的属性和下拉列表框的属性有很多都相同,也是多了一个关于图片的

Pictures 选项卡,该选项卡的设置方法同图片列表框控件。

5.4.7 OLE 控件

OLE 控件可将 Windows 系统的对象嵌入到 PowerBuilder 的窗口中,它可以集成一些已有

的应用,如字处理软件、多媒体播放软件等。

1.放置 OLE 控件

使用 OLE 控件之前,首先需要把它放置到窗口上,可以使用如下的步骤。

(1)用窗口画板打开要放置 OLE 控件的窗口。

Page 115: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·105·

(2)单击窗口画板工具栏控件图标列表中的 OLE 控件图标,系统打开“InsertObject”对

话框,如图 5.6 所示。

图 5.6 插入 OLE 控件

该对话框中有 3 个标签,每个选项卡都有不同的用途。“Create New”选项卡为所定义的

OLE 控件选择一个服务器应用程序;“Create From File”选项卡为所定义的 OLE 控件选择一

个已存在的对象;“Insert Control”选项卡在 OLE 控件中插入一个 OCX 定制控件。

2.设置 OLE 控件的属性

(1)Display Name 属性:该编辑框中用于输入一些提示性文字供 OLE 服务器使用,有些

OLE 服务器会把该文字显示在窗口的标题栏上。

(2)Focus Rectangle 属性:选中该复选框时,当 OLE 控件得到焦点后,系统将在 OLE

控件的周围显示一个由虚线组成的方框(虚框),以提示用户当前的焦点位置;否则,即使

OLE 控件得到焦点也不显示虚框。

(3)Activation 属性:该下拉列表框用于定义 OLE 控件的激活方式,其取值有以下 3 种。

� ActivationDoubleClick!:用户双击控件时激活服务器应用程序。

� ActivationGetFocus!:当 OLE 控件得到输入焦点(例如,用户单击了该控件或用 Tab

将焦点移到该控件)时,激活服务器应用程序。

� ActivationManual!:OLE 控件只能通过在程序中调用 Activate()函数,来激活服务器应

用程序。

(4)DisplayType 属性:该下拉列表框用来控制 OLE 控件内的显示内容,其取值有以下

两种。

� DisplayasContents!:在控件内以内容形式显示。

� Displayaslcon!:显示与数据相关的图标,通常该图标由服务器程序提供。

(5)ContentsAllowed 属性:该下拉列表框用来决定在运行时能够插入的对象类型,其取

值有以下 3 种。

� ContainAny!:既可以插入一个链接对象也可以插入一个嵌入对象。

Page 116: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·106·

� ContainEmbededOnly!:可以嵌入一个对象。

� ContainLinkedOnly!:可以链接一个对象。

(6)LinkUpdateOption 属性:该下拉列表框用来指定在链接方式下如何修改链接信息,

其取值有以下两种。

� LinkUpdateAutomatic!:如果由于某种原因链接被断开,找不到要链接的文件,则自动

显示对话框让用户重新定义链接。

� LinkUpdateManual!:如果由于某种原因链接被断开,则对象不能激活,此时只能在程

序中通过使用函数 UpDateLinksDialog()打开对话框,重新建立链接。

5.4.8 滚动条控件、跟踪条控件和进度条控件

滚动条控件、跟踪条控件和进度条控件均为图形控件。根据用户设定的值可使图形条滚

动,以表示某一过程的进度,如图 5.7 所示。它有水平方向和垂直方向两种。

进度条

滚动条

跟踪条

图 5.7 滚动条控件、跟踪条控件和进度条控件

1.滚动条控件

(1)滚动条的属性设置。

Position:该属性设置了滚动块的位置,当拖动滚动块时,Position 的值自动更新。

MinPosition:该属性设置 Position 的最小值。

MaxPostion:该属性设置 Position 的最大值。

以上 3 个属性共同控制了滚动块的滚动区间和每次滚动的增量。

StdHeight 属性:该属性将滚动条控件的高度设置为 Windows 系统的默认高度。

(2)滚动条控件的常用事件。

LineLeft 事件:该事件在单击水平滚动条的向左箭头时触发。

LineRight 事件:该事件在单击水平滚动条的向右箭头时触发。

Moved 事件:该事件在单击滚动条箭头或拖动滚动块引起滚动块移动时触发。

PageLeft 事件:该事件在单击水平滚动条或滚动块左边的空白位置时触发,通常这是用

于向左翻页。

Page 117: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·107·

PageRight 事件:该事件在单击水平滚动条或滚动块右边的空白位置时触发,通常这是用

于向右翻页。

2.跟踪条控件

跟踪条控件和滚动条控件的作用相同,但是跟踪条控件的边上有着一些间距相同的刻度。

(1)General 选项卡的属性。

TickFrequency:设置跟踪条控件刻度的精度,这个属性决定了刻度线的多少。例如,

MinPosition 设为 0,MaxPosition 设为 100,TickFrequency 设为 10,则跟踪条上会有 10 个刻

度。

PageSize:设置当鼠标单击跟踪条空白区域或按下翻页键时,滑动块移动的距离。

LineSize:设置当使用键盘的方向键移动滑动块时移动的距离。

SliderSize:设置滑动块的宽度,当此值为 0 时为默认的宽度。

TickMarks:设置跟踪条刻度的显示位置,有下列 4 个值。

� hticksontop!:显示在上边。

� hticksonbottom!:显示在下边。

� hticksonneither!:都不显示。

� hticksonboth!:上下都显示。

Slider:设置跟踪条要不要显示滑动块。默认值为 True,显示滑动块。

(2)跟踪条控件的常用事件。

这个控件的常用事件和滚动条控件相似,用法也相似,请参阅前面的内容。

3.进度条控件

可以使用进度条控件来显示一个长时间操作过程的进度。例如,一个耗时很长的数据处

理过程。这种进度条是一个用系统高亮颜色填充的正方形区域。

(1)General 选项卡的属性。

SetStep:该属性设置进度条高亮部分向右前进的步长。

SmoothScroll:该属性设置进度条是否使用平滑滚动。默认情况下采用的是一个个小方块

向右滚动的方式。

(2)进度条控件的常用函数。

OffsetPos():该函数用于设置进度条上的起始进度位置。

语法:control.OffsetPos(increment)

其中,increment 设置起始进度位置的数值。返回值为 Integer。返回 1 表示成功,返回-1 表示

出错。

SetRange():该函数用于设置进度条上的进度范围。

语法:controlname.SetRange(startpos,endpos)

其中,Sartpos 是进度条范围的开始值;Edpos 是进度条范围的结束值。返回值为 Integer,返

回 1 表示成功,返回-1 表示出错。注意,默认情况下进度条的取值范围是 0~100。

Steplt():根据进度条控件的 SetStep 属性设置数值。

语法:controlname.Steplt()

Page 118: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·108·

返回值为 Integer,返回 1 表示成功,返回-1 表示出错。

5.4.9 RichText 编辑框控件

RichText 编辑框是一个功能十分强大的文本编辑器,它可以使用 Windows 系统支持的所

有字体、字型及颜色,它有自己的工具栏和标尺。利用该控件,用户能够输入、编辑、格式

化以及保存与打印文本。

1.RichText 编辑框属性

RichText 编辑框属性“General”选项卡中的属性与单行文本框的属性相同。同时它还具

有一个 Document 选项卡,下面介绍“Document”选项卡的属性。

DocumentName:该编辑框中输入的文本将作为打印该 RichText 编辑框内容时的文档名

称。

RuleBar:用于指定是否显示标尺。

TabBar:用于指定是否显示 TabBar。

ToolBar:用于指定是否显示工具栏。

HeaderFooter:用于指定是否加上题头/脚注。

PopMenu:选中该复选框后,用户通过右击可以打开用于编辑文字的弹出式菜单。其中,

Insertfile 用于向 RichText 编辑框中插入文件;Cut、Copy、Paste 和 Delete 这组菜单用来进行

文字编辑的增、删、改功能;Find、FindNext、FindPrevious 和 Replace 这组菜单,用来进行

编辑文字中的查找和替换功能。

ReturnsVisible:选中该复选框时,系统以字符“ 啊来显示用户输入到 RichText 编辑框中

的换行符。

SpacesVisible:选中该复选框时,系统以字符“.”来显示用户输入到 RichText 编辑框框

中的空格符。

TabsVisible:选中该复选框时,系统以字符“→”来显示用户输入到 RichText 编辑框中

的制表符。

InputFieldsVisible:选中该复选框时,RichText 编辑框会显示字段值。

InputFieldsNameVisible:选中该复选框时,RichText 编辑框会显示字段名。

WordWrap:选中该复选框时,RichText 编辑框会在输入文本到达右边界时自动换行;如

果不选中此属性,则会出现一个水平滚动条。

PicturesAsFrame:选中该复选框时,RichText 编辑框中的图像只显示为一个空白的框。

DisplayOnly.:选中该复选框时,RichText 编辑框中的文本为只读文本,不能进行修改。

LnputFieldsBackColor.:设置输入域的背景颜色。

UndoDepth:设置编辑框可以执行 UnDo()函数进行恢复的最大次数。

LeftMargin 属性、RightMargin 属性、TopMargin 属性和 BottomMargin 属性,分别指定打

印页的左空白、右空白、上空白和下空白的大小。

2.RichText 编辑框的常用函数

RichText 编辑框的函数很多,如表 5.2 所示。

Page 119: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·109·

表 5.2 RichText 编辑框控件的函数

函 数 名 称 返 回 值 函 数 用 法

CopyRTF() String 复制 RichText 编辑框中所选中的文本成为一个 Rtf 格式的字符

串,这个字符串就是函数返回值

DataSource() Integer 将一个数据窗口联系到 RichText 编辑框控件中

Find() Integer 在控件中查找字符串

FindNext() Integer 查找用 Find 函数查找到的结果的下一个符合条件的值

GetAlignment() Alignment 获得选中文本的对齐方式

GetParagraphSetting() Long 获得指定的边距信息

GetTextColor() Long 返回选中文本的颜色

GetTextStyle() Boolean 获得选中文本的字体设置

InputFieldChangeData() Integer 用自定的字符串来修改给出名称的输入域中的文本内容

InputFieldCurrentName() String 获得输入域中的内容

InputFieldDeleteCurrent() Integer 删除当前输入域中的文本

InputFieldGetData() String 获得当前指定输入域中的数据

InputFieldInsert() Integer 在当前输入域的插入点的位置插入一个字符串

InputFieldLocate() String 在 RichText 编辑框的输入域中定位

InsertDovument() Integer

在 RichText 编辑框中插入一个文件。该文件将会代替当前控件

中的文字,或者从插入点插入文件至控件中的文字内。该文件可

以以 RTF 和 ASCII 两种格式被插入

InsertPicture() Integer 在 RichText 文件的输入点处插入一个位图文件

IsPreview() Boolean 检查 RichText 编辑框是否处于预览模式

LineCount() Integer 返回 RichText 编辑框中的文件的行数

LineLength() Integer 返回 RichText 编辑框当前行的长度

PageCount() Integer 返回 RichText 编辑框中文件的页数

PasteRTF() Long 在 RichText 编辑框中的插入点的位置插入一个 RTF 格式的字

符串

Position() Integer 返回选中文本或当前插入点的位置

ReplaceText() Integer 替换文本中的字符串

SaveDocument() Integer 将当前的文件保存为 PTF 或者 ASCII 文本格式

Scroll() Integer 按照指定的方向和函数滚动 RichText 编辑框中的内容

ScrollNextPage() Integer 将 RichText 编辑框中的文件向下滚动一页

ScrollNextRow() Long 滚动到下一行

ScrollPriorPage() Long 向前滚动一页

ScrollPriorRow() Long 滚动到上一行

ScrollToRow() Long 滚动到指定行

SelectedLine() Long 返回当前所在的行的行号

SelectedPage() Long 返回当前所在的行的页号

SelectedStart() Integer 返回当前选中文本的起始位置

SelectTextAll() integer 选中控件中所有的文本

SelectTextLine() Integer 返回所选中的文本的行数

TextLine() String 返回当前光标所在的行的文本

Page 120: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·110·

3.RichText 编辑框的常用事件

FileExists 事件:当把超文本编辑框的内容保存到文件,并且指定的文件已经存在时,触

发该事件。

LnputFieldSelected 事件:当用户双击一个输入域或者单击该域并按 Enter 键后,触发此

事件。

Key 事件:当用户按下一个键时触发此事件。

其中,Key 为按下的键代码,如 KeyA!或者 Keyn!;KeyFlags:是否按下控制键的标志,取值

如下。

�“1”表示是否按下了 Shift 键。

�“2”表示是否按下了 Ctrl 键。

�“3”表示是否同时按下了 Ctrl 键和 Shift 键。

返回值为 0 表示正常,1 表示没有键被按下。

MouseDown 事件:当用户在编辑框中按下鼠标时触发此事件。

5.5 高级控件——树形视图

树形视图(TreeView)具备下述功能。

� 通过展开或折叠结点来遍历数据。

� 以图形和文字两种方式表示结点。

� 支持拖放操作。

� 可以剪切、复制、粘贴结点。

5.5.1 树形视图的属性

单击在窗口画笔工具栏控件的树形视图(TreeView)图标,然后在窗口上单击,树形视

图控件就被放置到窗口上。树形视图控件的属性较多,其一般属性各选项的意义如下。

“Name”编辑框指定 TreeView 控件的变量名。

选中“Visible”复选框时该控件显示出来,否则被隐藏。

选中复选框“Enabled”时该控件可用,否则用户不能操作该控件。

选中复选框“Delete Items”时,用户能够使用删除键 Delete 删掉 TreeView 控件中选中的

列表项,否则用户不能删除列表项;选中复选框“Show Buttons”时,树形视图控件在父结点

项前显示加(+)或减(-)号。

选中复选框“Hide Selection”时,即使 TreeView 控件失去焦点,选中的列表项依然加亮

显示;否则,当 TreeView 控件失去焦点时,选中的列表项恢复常态,不再加亮显示。

选中复选框“Disable Drag Drop”时,不能对列表项执行拖放操作。否则用户能够拖放列

表项。

选中复选框“Edit Labels”时,用户能够编辑列表项的标题,否则不能编辑。

选中复选框“Show Lines”时,树形视图控件在结点间显示连线。

选中复选框“Lines At Root”时,树形视图控件用连线连接所有根结点。

编辑框“Indentation”指定缩进的宽度,以 PowerBuilder 单位表示。

Page 121: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·111·

列表框“Sort”指定列表项排序方式。其中:Ascending——升序,Descending——降序,

Unsorted——不排序,UserDefined——用户定义排序方式。选择 UserDefined 排序方式后,程

序运行时将会触发树形视图控件的 Sort 事件。

5.5.2 添加与删除列表项

当设置了树形视图的各种属性后,就该建立它的数据项了,但在树形视图的属性对话框

中不能直接添加和删除列表项,这就是说,只能通过编程才能向树形视图中增加和删除数据。

树形视图的每个数据项都是一个 TreeViewItem 对象,只能通过调用相应函数来增加和删除列

表项。

1.树形视图数据项的结构

树形视图的每个数据项都是一个 TreeViewItem 对象,它包括了一组属性,各属性的意义

如表 5.3 所示。

表 5.3 树形视图属性表

属 性 名 数 据 类 型 用途与意义

Data Any 开发人员希望与数据项一起保存的任何数据

ItemHandle Long 引用当前项的惟一编号

Label String 当前项的显示文本

Level Integer 当前项在树形视图层次结构中的层数

PictureIndex Integer 这是个图片索引号,相应图片显示在该项标题的左边

SelectedPictureIndex Integer 用于指示当前项被选中的图片的索引

Selected Boolean 指示当前项是否被选中

Children Boolean 指定当前项是否带有子项

StatePictureIndex Integer 该项使用的状态图像列表中的图片索引号

2.添加树形视图列表项

(1)InsertItem 函数。InsertItem 函数在指定位置插入列表项,其语法格式为:

treeviewname.InsertItem ( handleparent, handleafter, item ) InsertItem 函数在 handleafter 项后面插入一个列表项,并使 handleparent 项成为当前项的

父项。使用前要定义当前项的完整数据,并将其保存在 item 变量中。

各参数的意义如下。

treeviewname:树形视图控件的名称;

handleparent:该项父结点项的句柄(一个长整数,每个结点都有一个惟一代表该结点的

句柄),对第一层结点,该项的值为 0。

handleafter:在同一层中句柄为 handleafter 的项后面插入新项。

label:当前项的标题,即显示在树形视图控件中的文字。

pictureindex:当前项标题前显示图片的索引号。

item:一个完整的列表项,是一个 TreeViewItem 对象。

Page 122: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·112·

(2)InsertItemLast 函数。InsertItemLast 函数在指定父结点的层中的最后位置插入列表项,

其语法格式为:

treeviewname.InsertItemLast ( handleparent, item ) 父结点相同的项位于同一层中。InsertItemFirst ()函数在指定层中插入一个新的列表项,

并把它放在列表的第一个位置上。要求定义当前项的完整数据(在 item 变量中)。函数参数

的意义同 InsertItem 函数。

(3)FindItem 函数。从前面叙述中可以看出,在操作列表项时,往往需要知道列表项的

句柄。这时,可以使用查找列表项的句柄 FindItem 函数,其语法格式为:

treeviewname.FindItem ( navigationcode, itemhandle ) 各参数的意义如下。

treeviewname:树形视图控件的名称。

itemhandle:查找起点列表项的句柄。

navigationcode:查找代码,也就是说按什么要求查找列表项,该参数的类型是枚举数据

类型 TreeNavigation,其有效取值如下。

� RootTreeItem!:查找第一层的第一个列表项,如果树形视图控件中还没有列表项,那

么 FindItem 函数返回-1。

� NextTreeItem!:查找与 itemhandle 列表项同一个父结点中同一层的下一个列表项,无

下一个列表项时返回-1。

� PreviousTreeItem!:查找与 itemhandle 列表项同一个父结点中同一层的前一个列表项。

� ParentTreeItem!:查找 itemhandle 列表项的父结点。如果 itemhandle 列表项是第一层的

列表项,那么 FindItem 函数返回-1。

� ChildTreeItem!:查找 itemhandle 结点的第一个子列表项。如果该列表项被折叠,那么

用 ChildTreeItem!参数调用 FindItem 函数后,该列表项被展开显示。如果没有子列表

项,该函数返回-1。

� FirstVisibleTreeItem!:找出树形视图控件当前可视区域中显示的第一个列表项,而不

管该列表项位于哪一层上。树形视图控件上滚动条的位置决定了哪一个列表项是第一

个可视列表项。

� NextVisibleTreeItem!:找到 itemhandle 之后的下一个已展开列表项,而不考虑该列表

项的层次。当已经到达树形视图控件的最后一个已展开列表项时,该函数返回-1。

� PreviousVisibleTreeItem!:找到 itemhandle 前面一个已展开列表项,而不考虑该列表项

的层次。当已经到达树形视图控件的第一个根列表项时,该函数返回-1。

� CurrentTreeItem! :找出当前所选项。

� DropHighlightTreeItem!:找出 DropHighlighted 属性最近被设置为 TRUE 的列表项。

注:除了使用 ChildTreeItem!参数外,FindItem 函数不查找任何折叠的列表项。

下面是 FindItem 函数的两个示例。

示例一:得到树形视图控件中当前所选项的句柄。

long ll_tvi

ll_tvi = tv_list.FindItem(CurrentTreeItem!, 0)

Page 123: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·113·

示例二:得到树形视图控件中第一层第一个列表项的句柄。

long ll_tvi

ll_tvi = tv_list.FindItem(RootTreeItem!, 0)

3.其他常用树形视图控件函数

在 PowerBuilder 中,还有一些其他的树形视图控件函数,其功能和参数如表 5.4 所示。

表 5.4 其他常用树形视图控件函数

函 数 名 参 数 用 途

AddPicture() picturename 在图像列表中增加图片

CollapseItem() itemhandle 折叠 itemhandle 指定的列表项

GetItem() itemhandle, item 将指定项的所有数据放到 TreeViewItem 变量 item 中

SelectItem() itemhandle 将指定项选择为当前项

SetItem() itemhandle, item 使用 TreeViewItem 变量 item 中的数据设置指定项

5.5.3 树形视图控件的事件

在了解了树形视图控件属性设置的步骤和增加、删除列表项的方法后,还需要考察一下

它的几个重要事件及其触发时机。树形视图控件的常用事件包括如下两个事件。

(1)ItemPopulate 事件:当第一次展开某项时触发。该事件返回 1 阻止被展开,返回 0

完成展开。如果列表项没有子项,那么就不能被展开。一般来说,该事件或 ItemExpanding

事件常用于生成相应列表项的子列表项。

(2)SelectionChanged 事件:当用户选择新的选项后触发。

5.6 本章实例

1.创建注册窗口

打开上一章实例中创建的 PB 源文件,创建主窗口 w_main,在 w_main 的 open 事件中添

加代码:

open(w_login) 下面继续我们的工作。再创建一个登录窗口 w_login,在这个窗口中,输入用户名和密码,

经验证进入应用系统主窗口。这里输入的用户名和密码存在表 t_user 中,这个实例将涉及数

据库操作。

先在数据库画板中在表 t_user 中放入一条记录,以便登录窗口使用。例如,用户名为

“admin”,密码为“admin”。然后,在应用程序“pbapp”的“open”事件中添加如下代码。

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "Connectstring=’DSN=bussiness’"

connect;

Page 124: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·114·

open(w_main) 这一段代码的功能是在进入应用程序后连接数据库,以后就可以直接使用 SQL 语言操纵

数据库了。

这一段代码可以在数据库配置(DB Profile)窗口中的“Preview”选项卡中找到,如

图 5.8 所示,可以将其复制并粘贴到所需之处。

图 5.8 连接数据库的代码

下面介绍窗口设计的具体步骤。

(1)在 layout 视图区建立如图 5.9 所示的 6 个控件。

图 5.9 登录窗口设计

Page 125: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·115·

“用户名”和“密码”为静态文本,其余 4 个控件如下:

� sle_1:单行文本框,用于输入用户名。

� sle_2:单行文本框,用于输入密码,需将属性的“General”卡的“Password”复选框

选中,这样在输入密码时不显示输入内容,使用若干“*”号代替。

� cb_1:按钮,单击事件完成登录。

� cb_2:按钮,单击事件退出系统。

(2)为控件添加代码。

① 在登录按钮 cb_1 的单击事件 click 中添加如下代码。

string user

select user_id

into :user

from t_user

where user_id = :sle_1.text and password = :sle_2.text;

if len(user) <> 0 then

messagebox("欢迎您登录","当前管理员" + user)

close(parent)

return

else

messagebox("输入有误","您的用户名密码有误")

return

end if ② 在取消按钮 cb_2 的单击事件 click 中添加如下代码。

close(w_main)

return 按 F5 键运行一下看看效果如何,如图 5.10 所示,

怎么样,挺简单的,是吧!

2.标签页的使用

下面再介绍一个组织程序的方法,使用标签页

tab,具体步骤如下。

(1)创建窗口,名称为“w_baseinf”,标题为“基本数据管理”。

(2)在窗口内插入 tab 控件,按前面所述的方法增加以下 3 个页面。

� tab_1.tabpage_1:标题为“员工管理”。

� tab_1.tabpage_2:标题为“商品管理”。

� tab_1.tabpage_3:标题为“供应商客户管理”。

在窗口内插入两个按钮控件,一个在标签页内,另一个在标签页外。

� cb_1:增加按钮。

� cb_2:退出按钮。

在标签页内添加员工管理控件,如图 5.11 所示。

其中,生日为掩码编辑框,其“Mask”选项页的“MaskDataType”框选择“DateType”,“Mask”

图 5.10 登录界面

Page 126: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·116·

格式为“yyyy/mm/dd”。

(3)添加代码。

① 在 cb_1 中添加如下代码:

string sex

if rb_1.checked = true then

sex = ’男’

else

sex = ’女’

end if

insert into t_employee (t_employee.emp_id,

t_employee.emp_name,

t_employee.sex,

t_employee.birthday,

t_employee.address,

t_employee.tel,

t_employee.code)

values (:sle_1.text,

:sle_2.text,

:sex,

:em_1.text,

:sle_3.text,

:sle_4.text,

:sle_5.text) using sqlca;

if sqlca.sqlcode = 0 then

messagebox("系统消息","您已提交成功")

commit;

else

messagebox("系统消息","提交失败")

rollback;

end if ② 在 cb_2 中添加如下代码:

Close(parent)

保存后运行,结果如图 5.11 所示。

由于 PB 提供了对 SQL 语言的嵌入,使得在程序上可以不加修饰的编写 SQL 脚本。本例

只介绍了对员工登记进行的处理。请大家按照本例,创建其他部分,如:商品管理、客户供

应商管理等。

3.对数据库的多表操作

建立一个入库单程序,如图 5.13 所示。该程序涉及 3 个表:入库单、商品表和客户/供应

商表。输入商品代码和客户代码(供应商代码)时,可单击旁边的按钮弹出输入窗口。

第一步:新建窗口,添加如图 5.13 所示的控件。

Page 127: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·117·

图 5.11 基本信息管理窗口设计

图 5.12 基本信息管理

第二步:添加代码。在添加按钮的 click 事件中添加如下代码:

insert into t_input (t_input.batch,//将输入的数据插入数据库

t_input.id,

�t_input.client_id,

�t_input.number,

�t_input.price_in,

�t_input.date_in,

�t_input.expire_day,

�t_input.location,

�t_input.buyer,

Page 128: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·118·

�t_input.emp_id)

values (:sle_1.text,

�:sle_2.text,

�:sle_7.text,

�:sle_8.text,

�:em_3.text,

�:em_2.text,

�:em_1.text,

�:sle_4.text,

�:sle_5.text,

�:sle_6.text) using sqlca;

if sqlca.sqlcode = 0 then

�messagebox("系统消息","您已提交成功")

�commit;

else

messagebox("系统消息","提交失败")

rollback;

end if

cb_3 cb_4

sle_1

sle_2

sle_7

sle_4

em_3

em_2 em_1

sle_8

sle_5

sle_6

cb_1

cb_2

图 5.13 添加入库单窗口设计

① cb_1 的 click 事件代码如下:open(w_shop) //弹出商品代码输入窗口

② cb_2 的 click 事件代码如下:open(w_client) //弹出客户代码输入窗口

运行结果如图 5.14 所示。

第三步:设计录入商品编号窗口,如图 5.15 所示。

Page 129: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·119·

sle_1

sle_2 cb_1

图 5.14 入库单录入 图 5.15 商品编号录入

① cb_1 按钮 click 事件代码如下:

if len(sle_1.text) < 5 then

messagebox("输入错误","请重新填写商品编号")

w_input.sle_2.text = ""

w_input.sle_3.text = ""

close(w_shop)

else

w_input.sle_2.text = sle_1.text

w_input.sle_3.text = sle_2.text

close(w_shop)

end if ② sel_1 的 modified 事件代码如下:

string name_1

if len(sle_1.text) = 5 then

select name into :name_1

from t_client

where client_id = :sle_1.text;

if len(name_1) = 0 then

messagebox("输入错误","没有该客户")

return

else

sle_2.text = name_1

end if

end if 第四步:设计录入客户编号窗口,如图 5.16 所示。

Page 130: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·120·

sle_2 cb_1

sle_1

图 5.16 客户编号录入

① cb_1 按钮 click 事件代码如下:

if len(sle_1.text) < 5 then

messagebox("输入错误","请重新填写客户编号")

w_input.sle_7.text = ""

w_input.sle_9.text = ""

close(w_client)

else

w_input.sle_7.text = sle_1.text

w_input.sle_9.text = sle_2.text

close(w_client)

end if ② sel_1 的 modified 事件代码如下:

string name_1

if len(sle_1.text) = 5 then

select name into :name_1

from t_client

where client_id = :sle_1.text;

if len(name_1) = 0 then

messagebox("输入错误","没有该客户")

return

else

sle_2.text = name_1

end if

end if

本 章 小 结

本章叙述了如何为窗口添加控件;介绍了窗口控件的属性、事件和函数,一些重要控件

的用途和使用方法,与界面设计有关的高级控件的使用;同时通过 3 个实例介绍了窗口控件

的应用。通过本章的学习,应熟练掌握控件常用属性的设置方法,控件的常用事件和函数的

使用,为可视化程序设计打下基础。

Page 131: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·121·

练 习

1.窗口控件有哪些种类?

2.怎样向窗口中添加控件?

3.窗口控件有哪些通用属性?

4.组框的用途有哪些?

5.试验掩码编辑框的“MaskDataType”的各种选择方案与“Mask”格式的关系,它在

实际设计中非常有用。

6.创建一个具有 4 个选项页的选项卡,在每个选项页中放置一些其他窗口控件。

7.完成商品管理、客户供应商管理程序。

8.完成出库单录入程序。

Page 132: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·122·

第 6 章 菜 单

菜单是图形用户界面最基本的要素。现在绝大多数应用程序都使用菜单,它已经成为商

业化程序的标准界面元素。菜单利用菜单画板定义制作。

菜单由一系列命令或选项(菜单项)构成,用户通过选择选项发出命令,指示程序完成

用户期待的任务。除了子窗口和响应窗口外,其他类型的窗口都可以拥有菜单,但只有 MDI

和带微帮助的 MDI 窗口才可显示菜单。

在 PowerBuilder 中,菜单也是一种对象,所以在应用程序设计过程中随时都可以创建和

修改菜单对象。单独使用菜单对象是没有意义的,当菜单对象创建好后,要将其挂接到某窗

口上,才能发挥菜单应有的作用。

6.1 菜单的创建

6.1.1 菜单类型

菜单有 3 种类型:下拉菜单、弹出式菜单和级联菜单,如图 6.1 所示。

下拉菜单级联菜单

图 6.1 下拉菜单和级联菜单

1.下拉菜单

下拉菜单由菜单标题和菜单项组成,可通过单击菜单标题来激活。

2.弹出式菜单

弹出式菜单与对象相关联,通常又称为上下文相关菜单或快捷菜单。一般来说,当用户

右击某个对象时,即出现弹出式菜单。

3.级联菜单

级联菜单可以出现在前两种菜单中,在其父菜单项后面有个箭头符号,指示该菜单项后

Page 133: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·123·

面有级联菜单。

6.1.2 菜单命令特点

无论哪种类型的菜单均由若干命令组成,这些命令的显示特征为用户使用菜单提供了参

考信息。每个命令显示时至少应有菜单名,此外显示出来的菜单还应包括以下几个部分。

(1)图标:显示在每个命令的左边,以图形提示菜单的用途。

(2)访问键:以带下划线的字符表示。当菜单显示时可以按访问键快速访问相应的命令。

访问键的设置使得通过键盘使用命令更为方便。

(3)快捷键:无须打开菜单即可使用相应命令的按键组合。对于频繁使用的命令可以设

置快捷键。

(4)带省略号:这表明该命令将打开一个对话框让用户进行设置或选择。

(5)灰色显示:显示为灰色时,表明当前命令无效。

6.1.3 菜单画板及其功能

菜单的各种操作是通过菜单画板来进行的。菜单画板由下列窗口区域组成,如图 6.2 所

示。

所见即所得子窗口

菜单树子窗口

脚本区、事件列表区、 函数列表区

属性卡

图 6.2 菜单画板

Page 134: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·124·

(1)所见即所得窗口(WYSIWYG Menu View):用于显示设计好的菜单的外观。

(2)菜单树子窗口(Tree Menu View):用于显示各级菜单的逻辑结构,并在其上完成设

计。

(3)属性卡(Properties):用于设定菜单的属性。

(4)事件列表区(Event List):用于设计菜单事件。

(5)函数列表区(Function List):用于定义函数。

(6)脚本区(Script):用于编辑脚本。

(7)变量说明区(Variable):用于定义变量。

(8)结构列表区(Structure List):给出可使用的结构。

(9)结构定义区(Structure):用于定义结构。

以上各区域可通过单击菜单“View”弹出菜单区域列表,如

图 6.3 所示,选择需要的菜单项放入菜单画板。

利用菜单画板设计菜单时可实现下列操作。

� 设置访问键;

� 删除菜单项或命令;

� 移动菜单项或命令;

� 为命令添加脚本;

� 查看菜单的布局。

6.1.4 创建新菜单

1.下拉菜单

创建下拉菜单对象的操作步骤如下。

(1)单击 New 图标或从 File 菜单选择“New...”菜单项;在 PB Object 选项卡中选择

Menu 图标并双击,即可产生新的菜单对象。

(2)新的菜单对象中没有内容,需要为其添加菜单项。这项任务可以在菜单树子窗口中

进行,由于未保存,所以菜单根项为 Untitled0;在菜单根项 Untitled0 上单击鼠标右键,出现

弹出式菜单,如图 6.4 所示;单击“Insert SubMenu Item ”菜单项,在 Untitled0 下出现一

个可编辑的空白框,这就是菜单栏上的第一个菜单标题;在此框或在属性卡的“Text”栏中

输入需要的菜单标题,如“系统维护”,在所见即所得子窗口中可见到新加入的菜单标题;此

时默认的菜单名为“m_系统维护”。依此类推,可将“基本数据维护”,“采购管理”,“销售

管理”,“资金管理”,“统计查询”等菜单项添加到菜单中。

(3)在“基本数据维护”菜单标题上单击鼠标右键,出现与前面相同的弹出式菜单,对

菜单的所有操作均可通过该弹出式菜单进行。选择“Insert Submenu Item”菜单项,在该菜单

下出现一个可编辑的空白框,输入“商品管理”,这样就添加好了一个联级菜单。依此类推,

可将第 1 章所述实例的所有功能添加到菜单中,实现如图 6.1 所示的联级菜单。

(4)保存菜单。单击工具栏上的 图标,在弹出的对话框中输入“m_main”后单击“OK”

按钮。一般情况下菜单对象保存的前缀为“m_”。

(5)将菜单添加到主窗体。打开主窗口 w_main,在窗口画板的属性 General 中选择

MenuName 属性,在下边的文本框中输入所保存的菜单 m_main,即添加完成。

图 6.3 菜单区域列表

Page 135: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·125·

图 6.4 添加菜单项

2.弹出式菜单

创建弹出式菜单对象的操作步骤如下。

弹出式菜单是一种非常灵活的菜单,可以为用户提供一个上下文相关的操作环境,丰富

了应用程序界面的表达能力。Windows 中的许多设置功能就是用弹出式菜单实现的。一般来

说,人们通过右击鼠标激活弹出式菜单,因此需要在某对象的右击 RButtonDown 事件(注意,

不是菜单的右击 RButtonDown 事件)中编写激活弹出式菜单的代码。下面通过实例介绍具体

方法。

(1)弹出与窗口菜单栏中的某一部分相同的菜单。当用户右击某对象或控件时,将窗口

上某菜单标题下的下拉菜单或某菜单项的子菜单作为弹出式菜单显示,使用户既可通过窗口

上的菜单项完成操作,也可通过弹出式菜单完成操作。这时,只要在需要有弹出菜单的对象

或控件的 RbuttonDown 事件中写出下列代码即可。

菜单对象名.弹出菜单名.PopMenu(横坐标,纵坐标)

打开主窗口 w_main,在脚本编辑窗口中选择 w_main,再选择 RbuttonDown 事件,如图

6.5 所示。在编辑区添加如下代码:

m_main.popmenu(PointerX(),PointerY())

图 6.5 脚本编辑窗口的选择

(2)显示某个模块的弹出菜单代码如下:

m_main.m_基本数据管理. popmenu(PointerX(),PointerY())

Page 136: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·126·

其中,菜单对象名是放置在窗口上的菜单对象名称;弹出菜单名是某个菜单或子菜单标题的

名称,该标题下的菜单项将构成弹出式菜单,即可通过右击该项显示弹出式菜单的那个菜单

标题的名称;PopMenu()是显示弹出式菜单的菜单对象函数,用于在参数指定的位置显示弹出

式菜单。为了在鼠标右击位置显示弹出式菜单,使用函数 PointerX(),PointerY()得到鼠标右击

的位置,如图 6.6 和图 6.7 所示。不过还有一个问题需要说明,在所制作的窗口上可看到一幅

图片,它是一个图片控件,覆盖了整个窗口,当用鼠标右击时,即是右击在了图片上,所以,

应当把弹出菜单的代码写在图片控件的右击事件中。

图 6.6 显示全部内容的弹出式菜单

图 6.7 只显示“基本数据维护”内容

一般应将常用的菜单作为弹出式菜单显示,这时应将代码改写如下:

m_main.m_基本数据维护.visible=false

m_main.PopMenu(PointerX(),PointerY())

m_main.m_基本数据维护.visible=true

这样,用户右击定义了的弹出式菜单的对象后,只有“m_基本数据维护”不被显示;但

是选择了弹出的菜单项后,“m_基本数据维护”还会被显示出来。

(3)把尚未与窗口关联的菜单对象作为弹出式菜单。假设没有把 m_main 菜单对象与

Page 137: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·127·

w_main 窗口对象关联,代码将改写如下:

m_main m_test //说明菜单变量 m_new

m_test = Create m_main //创建菜单实例

m_main.PopMenu(PointerX( ), PointerY( )) //像窗口菜单一样使用 m_new

Destroy m_main //释放资源

效果如图 6.8 所示。

图 6.8 未与窗口关联时的弹出式菜单

6.2 设置菜单属性

菜单有两个属性页,分别为“General”属性页和“Toolbar”

属性页,如图 6.9 所示。

6.2.1 General 属性页

“General”属性页包括以下内容。

(1)Name:菜单名称,用来标识菜单对象或子对象,顶

层菜单对象的名字与其一致,而菜单项名字在默认状态下为

“m_菜单项文本”。

(2)Lock Name:此项是一个选择框,被选中时,菜单

名称被锁定,不能更改。

(3)Text:菜单项文本,作为菜单显示的内容。

(4)MicroHelp:微帮助文本,如果所使用菜单的窗口是

一个带微帮助的窗口,菜单被选中时,窗口下端的微帮助行

显示此文本。

(5)Visible:未被选中时,此菜单项不显示,在程序

中可用逻辑常量“False”和“True”来设定菜单项是否被

显示。

(6)Checked:加选中标记。

图 6.9 General 属性页

Page 138: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·128·

(7)Default:设置默认菜单项,项目加深、加粗显示。

(8)ShiftToRight:使继承菜单可以插入新菜单项。

(9)MergeOption:定义 OLE 服务程序的菜单与用户应用程序的菜单合并的方式,共有

以下 6 种。

① exclude!:在激活 OLE 服务程序时应用程序菜单不在服务程序的菜单中显示。

② merge!:将应用程序菜单项添加在 OLE 服务程序菜单栏的第一个菜单标题之后。

③ windowmenu!:使用应用程序的窗口菜单项,不使用 OLE 服务程序的窗口菜单。

④ filemenu!:将应用程序的 file 菜单项添加在 OLE 服务程序菜单栏的最左边。

⑤ editmenu!:使用 OLE 服务程序的 edit 菜单项,而不使用应用程序的 edit 菜单项。

⑥ helpmenu!:使用 OLE 服务程序的 help 菜单项,替代应用程序的 help 菜单项。

(10)MenuItemType:菜单项类型。

(11)Shortcut Key:定义快捷键。

6.2.2 Toolbar 属性页

“Toolbar”属性页用于为应用程序定义工具栏,如图 6.10

所示。Toolbar 属性页包括以下内容。

(1)ToolbarItemText:在图标按钮上显示的文本。

(2)ToolbarItemName:图标按钮的名字,它即可以是

PowerBuilder 提供的各种小图标,也可以是来自外部的小图

形文件。

(3)ToolbarItemDownName:单击工具栏图标按钮,左

键按下后显示的图标按钮的名字,使用方法同上。

(4)ToolbarItemVisible:图标按钮是否显示在工具栏上。

(5)ToolbarItemDown:图标按钮的初始状态是否为“按

下”状态。

(6)ToolbarItemSpace:图标按钮间的间隔。

(7)ToolbarItemOrder:图标按钮的排列顺序。

(8)ToolbarItemBarIndex:Powerbuilder 支持多行工具栏,

该属性表示此图标按钮属于哪一行。

(9)Object Type:表示图标按钮的类型,它有以下两种选择。

①“Menu”:普通图标按钮。

②“MenuCascade”:下拉式组合按钮,它可以集成一组按钮。

注:工具栏只能用于 MDI 窗口。

6.2.3 定义菜单项的加速键和快捷键

1.定义菜单的加速键

只需在输入菜单项的文字时,在加速字符前加入符号&,显示为加下划线的字母。例如,

&File 定义加速键为 F,显示为 File;Ma&xmize 定义加速键为 X, 显示为 Maxmize。

图 6.10 Toolbar 属性页

Page 139: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·129·

2.定义菜单的快捷键

选中要为其定义快捷键的菜单项,从菜单属性“Shortcut Key”下拉列表框中选择快捷键,

根据需要,选中“Alt”、“Ctrl”、“Shift”复选框中的一个或多个。

6.2.4 在菜单里加入分割线

在菜单里的菜单项之间加入分割线,只要输入“-”符号作为该菜单项的文字即可。

6.2.5 保存菜单

从“File”菜单里选择“Save”项,在“Menus”框里给菜单命名,并填写菜单注释,指

定保存菜单的库,单击“OK”按钮就完成了对菜单对象的保存。

6.3 菜单事件及其编程

菜单的事件很简单且只有 3 个:Clicked 事件、Help 事件和 Selected 事件。一般来说,菜

单中的每个菜单项都需要对 Clicked 事件编程,以响应用户的选择操作;Selected 事件更多用

于显示提示信息,像微帮助那样说明菜单项的作用等;而 Help 事件很少用。

6.3.1 菜单事件

1.Clicked 事件

Clicked 事件在下述情况下触发:

� 用鼠标单击菜单对象;

� 用键盘选中菜单对象(该对象被加亮),然后按 Enter(回车)键;

� 按菜单的快捷键;

� 菜单对象被显示在屏幕上后,单击访问键。

然而,只有当菜单对象的 Visible 属性和 Enabled 属性均为 True(选中)时,菜单对象才

会响应鼠标单击或键盘操作。

通常对每个菜单项的 Clicked 事件都要编写事件处理程序,但对于下列菜单项一般不编写

事件处理程序:

� 菜单栏上的菜单标题,通常菜单标题用于拉出下拉菜单;

� 弹出级联菜单的菜单项。

2.Selected 事件

Selected 事件只是在菜单对象被选择时(此时菜单对象被加亮显示)才会触发。

6.3.2 菜单事件处理程序编写步骤

进入菜单画板,通过单击选择要编程的菜单项;单击菜单画板工具栏上的编程图标或启

动脚本画板,在事件列表框中选择要编程的事件,输入所需代码。

例如:open(w_test),close(ParentWindow)等。

Page 140: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·130·

6.3.3 编程设置菜单属性

菜单属性设置程序如下:

m_main.m_sys.m_system.enabled = false //使菜单不可用

m_main.m_基本数据维护.visible=false //使菜单不可见

m_main.m_sys.m_system.checked = true //检测为有效

本 章 小 结

本章介绍菜单类型及命令特点,学生应掌握创建和修改菜单、设置菜单属性的方法,并

掌握菜单事件及其如何针对事件进行编程。

练 习

1.按表 6.1 中所列的要求建立下拉菜单。

表 6.1 下拉菜单要求

菜单项 菜单名 子菜单项 子菜单名

修改密码 M_changpswd 系统管理 M_system

系统退出 M_exit

学生信息 M_student

课程信息 M_course 数据管理 M_manager

成绩管理 M_score

查询统计 M_query

垂直排列 M_tilevertical

水平排列 M_tilehorizon

平铺排列 M_layer

层叠排列 M_cascade

工具条 M_settoolbar

窗口管理 M_window

关闭窗口 M_closewind

关于 M_help 版本信息 M_about

2.将题 1 的系统管理和数据管理的内容制作成工具栏。

3.将题 1 的数据管理子菜单制作成弹出式菜单。

Page 141: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·131·

第 7 章 数据窗口对象

数据窗口是 PowerBuilder 一个很重要的组成部分,它前连用户窗口,后连数据库,就

像-座桥梁,连接着河流的两岸(数据与用户界面)。数据窗口把数据从数据库中提取出来,

发送到用户窗口中,使用户能够观看、使用和更新数据。

数据窗口是 PowerBuilder 提供给开发人员快速建立应用程序的强有力的工具,也是

PowerBuilder 与其他面向对象的数据库应用前端开发工具的最主要区别。它以自动化的用

户-数据库接口为开发人员最大限度地节省了时间和精力,但这种自动化并不限制开发人员的

主观能动性,开发者能够以独具特色的方式灵活地运用数据窗口。

数据窗口技术是 PowerBuilder 快速开发工具的核心技术,其具体使用涉及到数据窗口对

象和数据窗口控件两大部分。数据窗口对象主要用于展示数据并允许用户增、删、改数据,

数据窗口控件则把数据窗口对象放置到窗口上并呈现在用户面前。本章主要介绍数据窗口对

象。

7.1 数据窗口对象概念

构造数据窗口对象时,首先要考虑两方面的内容:数据和显示风格。数据窗口对象中的

数据来源于数据源,数据源决定数据窗口对象从什么地方得到数据。显示风格决定数据窗口

以何种方式展示、表现数据。

PowerBuilder 支持 5 种数据源:快速选择、SQL 选择、查询对象、外部数据源以及存储

过程。每种数据源都有其独到之处,开发应用程序时往往会多种数据源并用。

PowerBuilder 的数据窗口提供了 11 种显示风格:列表(Tabular)、表格(Grid)、自由格

式(Freeform)、标签(Label)、分栏(N-Up)、分组(Group)、交叉列表(Crosstab)、统计

图(Graph)、OLE 2.0、超文本(RichText)以及复合(Composite)风格。

在数据窗口对象内部,能够校验、过滤、排序其中的数据,并随时查看设计效果。

使用数据窗口对象的一般方法如下:

� 使用数据窗口画笔创建数据窗口对象,并把它保存到应用库中。

� 在窗口或用户对象中建立一个数据窗口控件。

� 将数据窗口控件与数据窗口对象联系起来,使其成为一个整体。

� 在窗口画笔或用户对象画笔中编写代码,使数据窗口完成对数据库的各项操作。

7.2 创建数据窗口对象

PowerBuilder 提供了创建数据窗口对象的向导,利用它可以方便、快捷地创建出数据窗

口对象,下面介绍具体步骤。

单击“PowerBar1”工具栏中的“New”按钮,激活“DataWindow”选项卡,如图 7.1 所示。

Page 142: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·132·

图 7.1 DataWindow 选项卡

在“New”对话框中,有 11 种数据窗口显示风格,选择其中的一种显示风格,假设选择

“Grid”;单击“OK”按钮,进入“Choose Data Source for Grid DataWindow”对话框,如图

7.2 所示。

图 7.2 选择数据源

在“Choose Data Source for Grid DataWindow”对

话框中,有 5 种数据源可供选择,假设选择“SQL Select”

数据源。注意,选择不同的数据源,后续操作的方法略

有不同。

单击“Next”按钮,出现“Select Tables”对话框,

如图 7.3 所示。“Select Tables”对话框中列出了可供选

择的表名或视图名,单击所要选择的表,然后单击

“Open”按钮,将打开该数据表。

单击数据表中所要出现在数据窗口上的列名,如

图 7.4 所示,同时可以在图中设定数据的选择条件。

图 7.3 选择表

Page 143: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·133·

单击 PainterBar1 工具栏中的“Return”按钮,如图 7.5 所示,出现“Select Color and Border

Settings” 对话框,如图 7.6 所示,在此对话框中可完成数据窗口的背景颜色、编辑框字体和

边框颜色及列颜色的设置。如果采用 PowerBuilder 默认属性,则直接单击“Next”按钮即可。

返回按钮

图 7.4 选择列名 图 7.5 返回按钮

图 7.6 设置数据窗口外观

设置完毕后,单击对话框中的“Next”按钮,打开“Ready to Create Grid DataWindow”

对话框,如图 7.7 所示。在该对话框中列出了所要创建数据窗口的属性设置,如果这时并不

满意这些属性的设置,可以单击该对话框的“Back”按钮返回,重新设置其属性。

单击“Ready to Create Grid DataWindow”对话框中的“Finish”按钮即可完成数据窗口的

设置,此时如果不满意,也可通过修改数据窗口的属性重新进行设置。

单击 PainterBar1 工具栏中的“Close”按钮或保存按钮 ,出现一个信息提示框,提示

存储数据窗口,单击“是”按钮,出现“Save DataWindow”对话框。

在“Save DataWindow”对话框的 DataWindow 编辑框中输入数据窗口名称,在 Comments

编辑框中输入对该数据窗口的注释信息;输入完毕后,单击“OK”按钮,完成数据窗口的创

建。创建好的数据窗口如图 7.8 所示。

Page 144: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·134·

图 7.7 已创建好的数据窗口属性列表 �

图 7.8 已创建好的数据窗口

7.3 定义数据源

数据源决定了数据窗口对象获取数据的方式,也就是数据窗口从哪里得到数据,用什么

方法得到数据。下面介绍 PowerBuilder 支持的 5 种数据源。

1.快速选择(Quick Select)

Quick Select 是最简单的一种数据源,它允许开发人员从一个表或与该表有外部键关联

的表中选择一个或多个列。Quick Select 数据源定义出一条简单的 Select 语句,这条语句中

可以指定选择的列、查询条件以及排序方式,但不支持分组、计算列、提取参数等复杂的

SQL Select 功能。

定义快速选择数据源的方法与上一节中介绍的定义“SQL Select”数据源的方法大体一

致,只是在选择表这一步不同,如图 7.9 所示,这里可以设定排序方式和检索条件,也可以

将相关联的表的列选中。其中:排序方法分为升序——“Ascending”、降序——“Descending”

和不排序——“[not sorted]”三种。在查询条件中可以使用 SQL 关系操作符,如=、>、>=、

Page 145: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·135·

<、<=、<>、LIKE 和 IN 等,系统默认值为“=”,也可以使用逻辑运算符“AND”或“OR”。

这种方法既简单又直观,是建立数据窗口对象的常用方法。 �

图 7.9 使用快速数据源创建数据窗口

2.SQL 选择(SQL Select)

以可视化的方式建立 SQL Select 语句,SQL Select 语句的所有细节均能通过该界面创建。

SQL Select 数据源能够从多个表中选择列、指定查询条件、对数据排序和分组、增加计

算列、定义提取参数等,主要用于从一个或多个表中建立复杂的 SQL Select 语句,当然也能

生成各种各样的计算列。例如:计算应付账款,对于一笔进货,分两次付款,设计的数据表

有:客户/供应商档案(t_client)、入库单(t_input)和付款明细(t_repay_record),要计算的

内容为当前应付余额。创建数据窗口过程如下:

选定显示风格为“grid”,数据源为“SQL Select”。

选择表后开始设定数据窗口的列,包括“供应商编号”、“供应商名”、“进货金额”、“已

付金额”和“应付余额”;第一项和第二项为表列,其余项均为计算列;单击“t_client”表中

的“client”列和“name”列,即可设定第一项和第二项。

单击数据窗口画板最下端的“Computer”选项卡,进入设定计算列。在书写计算列公式

的区域内,单击鼠标右键,可弹出表列清单和函数,编辑完计算公式后按 Enter 键,增加一个

空行,供编辑计算列使用。相应的计算公式如图 7.10 所示。

按照 SQL 的语法要求要进行分组,单击“Group”选项卡,将所用到的属性列进行分组,

单击“Return”按钮,完成数据窗口对象的设计。

Page 146: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·136·

图 7.10 含计算列的数据窗口的设计

3.查询(Query)数据源

Query 数据源选取 Query 对象作为数据源,Query 对象实际上就是保存在应用库中的

SELECT 语句。定义 Query 对象的目的是为了在多个数据窗口中重复使用相同的 SELECT 语

句而避免反复定义。与定义 SQL Select 数据源相似,在 Query 对象中可以定义检索参数,指

定排序方式和分组方式,定义检索条件等。

4.外部(External)数据源

External 数据源从外部文件(如文本文件)中提取数据,它是数据窗口惟一不需要连接数

据库的数据源,其数据或由应用程序生成,或由用户输入。定义外部数据源的数据窗口时,

必须定义它的每一列及其数据类型。

5.存储过程(Stored Procedure)

Stored Procedure 数据源就是把存储过程作为数据源。存储过程(StoredProcedure)是一

组保存在数据库中的、经过预先编译和优化的、执行数据库操作的 SQL 语句。与其他 SQL

语句相比,存储过程的执行效率更高(省掉了每次执行时的编译与优化时间)。Stored

Procedure 数据源只在当前连接的数据库支持存储过程时才会出现在“New DataWindow”对

话框中。

7.4 数据窗口对象的显示风格

PowerBuilder 的数据窗口对象有 11 种显示风格,每种风格都有其独特的外观,这 11 种显示风

Page 147: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·137·

格为:列表(Tabular)、表格(Grid)、自由格式(Freeform)、标签(Label)、分栏(N-Up)、分组

(Group)、交叉列表(Crosstab)、统计图(Graph)、OLE 2.0、超文本(RichText)、复合(Composite)。

1.列表(Tabular)风格

在列表风格数据窗口中,数据按列排列在数据窗口中,每列的上方都有一个标题,说明该列

的数据。每屏显示的数据行数取决于数据窗口的大小,而且支持运行时由用户调整各列位置。另

外,在每页中都可以显示页标题。列表风格的数据窗口常用于数据输入,也可用于生成报表。

2.表格(Grid)风格

在表格风格数据窗口中,数据的行与列之间通过网格线分隔,数据的每一项都位于其中

一个网格中。运行时用户通过拖曳操作既能改变列的宽度,也能调整列的左右位置。但是,

在设计数据窗口对象时不能移动列以及列标题的左右次序,这一点有别于列表风格和自由风

格。表格风格的数据窗口既可用于数据输入,又能作为报表输出。

3.自由格式(Freeform)

自由格式数据的显示样式十分灵活,所有字段前面都加有字段标题(称为标签),并且以

垂直方式排列在数据窗口中。在数据窗口画笔里,能够根据需要灵活地安排字段、标签以及

其他对象的位置。一般情况下,自由格式的数据窗口一屏显示一条记录,常用于单记录输入。

4.标签(Label)风格

标签风格的数据窗口以标签形式显示每行数据,用它可以制作各种标签。如果选择了标

签风格,则在定义数据源后,还必须在“Set Label Specifications”对话框中定义标签的各项

参数,如图 7.11 所示。

图 7.11 设定标签参数

5.分栏(N-Up)风格

分栏风格能够在一行中显示多条记录,如果选择了这种风格,在定义数据源之后,系统

Page 148: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·138·

显示“Set Number of Rows per Band”对话框,在这个对话框中指定一行显示几条记录(即分

成几栏),如图 7.12 所示;然后在“Select Color and Border Setings”对话框中设定文本颜色和

边框,如图 7.13 所示。

图 7.12 设定每行的记录数

图 7.13 设定分栏式数据窗口的颜色和边框

6.分组(Group)风格

分组风格的数据窗口提供了一种对数据进行分组的简便途径,在这种风格下,数据被分

成一个一个的组,组中可以带有统计数据。实际上,可以把分组风格看成带有分组特性的列

表风格。当选择了此风格且定义了数据集后,系统将弹出“Set Report Definition”对话框,在

这个对话框中指定按哪些列进行分组,如图 7.14 所示。分组的操作方法是在“Source Data”

栏中选定分组的属性列,按下鼠标左键将其拖入右侧的“Columns”栏中。

Page 149: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·139·

图 7.14 设定数据窗口的分组

7.交叉列表(Crosstab)风格

交叉列表风格支持按行和/或按列分析数据,该风格的数据窗口对数据进行加工处理后以汇

总形式展现出来。当选择了此风格并定义了数据集后,系统将弹出“Define Crosstab Rows,

Columns, Values”对话框,如图 7.15 所示。在这个对话框中分配交叉列表中的行、列及行列交

叉点的数据值,通过双击分配后的行、列或值可以编辑相应的表达式。

图 7.15 设定数据窗口的交叉列表参数

8.统计图(Graph)风格

统计图风格的数据窗口以统计图的形式表现数据。在这里,数据不是通过行、列一个个

孤立地显示出来,而是以图形的方式呈现在用户面前。该风格的数据窗口提供了多种统计图,

其中包括:面积图(Area)、条形图(Bar)、列形图(Column)、线形图(Line)、饼图(Pie)、

散点图(Scatter)、堆积图(Stacked)以及上述图形的三维形式。

Page 150: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·140·

9.OLE 2.0 风格

OLE 2.0 风格的数据窗口既能够显示非数据库数据(如 Word 文档),也能够显示数据库

中的 BLOB(二进制大对象)列。

10.超文本(RichText)风格

超文本风格的数据窗口能够处理超文本数据,它可以利用 Windows 系统的字体、字形、颜色

等属性以丰富多彩的形式显示与编辑超文本,并且能够将数据库中的数据插入到超文本文档中。

11.复合(Composite)风格

复合风格的数据窗口没有自己的数据源,它通过特殊方式将其他数据窗口对象组合起来,

从而创建形式更复杂的数据窗口。

7.5 数据窗口画板

7.5.1 数据窗口画板的功能

选择了数据风格,定义了数据源之后就进入了数据窗口画板,如图 7.16 所示。数据窗口

画板用于对数据窗口进行进一步的设计。

图 7.16 数据窗口画板

Page 151: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·141·

数据窗口画板包括如下 6 个子窗口。

(1)Design 子窗口:设计数据窗口布局及外观。

(2)Properties 子窗口:设置数据窗口对象及其中控件的属性。

(3)Preview 子窗口:显示数据窗口的效果。

(4)ControlList 子窗口:给出可在数据窗口对象中使用的控件列表。

(5)Data 子窗口:显示数据窗口检索到的数据。

(6)Column Specifications 子窗口:显示在数据源中选择的属性列表,并可以维护其部分

扩展属性。

7.5.2 使用数据窗口画板设计数据窗口对象

1.数据窗口中选择对象的方法

在数据窗口画板中,显示的所有项目都是可以选择的对象。一般来说,无论要对这些对

象进行什么操作,首要的任务就是选择对象。对象被选中后,对象的四角出现四个黑点,没

有被选中的对象则没有这四个黑点。

选择对象的方法有两种:一种方法与窗口画笔中选择控件的方法相同,即单击选中一个

对象,多次“Ctrl+单击”选中多个对象;另一种方法则使用菜单项来完成,这在对象被遮挡

的情况下尤其有用,下面介绍这种方法。

从“Edit”菜单中选择“Select”菜单项,系统弹出级联菜单。

其中:菜单项“Select All”选中所有对象;

菜单项“Select Above”选中当前选中对象上面的对象;

菜单项“Select Below”选中当前选中对象下面的对象;

菜单项“Select Right”选中当前选中对象右边的对象;

菜单项“Select Left”选中当前选中对象左边的对象;

菜单项“Select Columns”选中所有的列对象;

菜单项“Select Text”选中所有的文本对象。

2.移动与改变对象的大小

移动与改变对象大小的方法与窗口画笔中移动和改变控件大小的方法完全相同。

3.对齐对象、调整对象间距与大小

数据窗口中的对象能够沿共同轴线对齐,也能够使它们隔开相同的间距,还能够使选中

的对象具备相同的大小。对齐对象、调整对象间距与大小的方法与窗口画笔中对应的操作控

件的方法相同。

4.使用网格和标尺

PowerBuilder 提供的网格和标尺工具有助于对齐对象、调整对象间距与大小。网格就是

显示在数据窗口画笔中的一个个小点,这些小点将来并不会出现在运行的数据窗口中。标尺

主要用于设计报表,它的度量单位在数据窗口的属性页中指定,从标尺上能够看到数据窗口

的实际大小。

Page 152: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·142·

下面介绍设置网格大小以及显示标尺的方法。

(1)从“Design”菜单中选择“Options⋯”菜单项,系统显示如图 7.17 所示的

“DataWindow Options”对话框。

图 7.17 “DataWindow Options”对话框

(2)“General”选项卡中有关选项功能的设置如下。

选中“Show Grid”复选框后,系统将在数据窗口画笔工作区中显示网格,否则不显示网格。

选中“Snap to Grid”复选框后,移动或放置数据窗口中的对象时,对象自动与最近的网

格线对齐。

选中“Show Ruler”复选框后,系统在数据窗口画笔工作区的边缘显示标尺,帮助开发

人员确定数据窗口的大小。

X、Y 编辑框用来指定网格线之间的像素数,默认值为 8。如果将其设置为 4,用起来更

为灵活。

选中“Show Edges”复选框后,系统将在没有边框的对象周围显示一个方框,以表明对

象的外形尺寸。

选中“Retain Data to Design”复选框后,PowerBuilder 会把当前数据窗口的数据保存到

临时文件中。这样,在设计模式和预览模式之间进行转换时,系统就不需要每次都从数据库

中重新检索数据了。

选中“Retrieve on Preview ”复选框后,从设计模式切换到预览模式时系统将检索数据。

5.改变数据窗口的显示比例

(1)从“Design”菜单中选择“Zoom⋯”菜单项,系统显示如图 7.18 所示的对话框。

(2)该选项卡中预设了 4 种缩放比例:200%(放大两倍),100%(正常显示),65%(比

标准显示稍小),30%(最小显示)。

Page 153: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·143·

(3)当这些选项不能满足使用要求时,通过单击选中

“Custom”单选钮,然后在该选项后面的编辑框中键入希望的缩

放比例,数字大于 100 时放大视图,小于 100 时缩小视图。

6.对象的跳转次序

与窗口中控件的跳转次序相似,数据窗口中的对象也有跳转

次序。跳转次序是个 0~999 的整数,表示用户按 Tab 键移动焦

点时,焦点从当前对象移动到那个对象。在跳转次序中,序号 0

具有特殊的含义。

设置数据窗口中对象跳转次序的步骤如下。

(1)单击数据窗口画笔工具栏上的“Tab Order(跳转次序)”图标,数据窗口画笔进入设

置跳转次序模式,此时大多数菜单项和窗口画笔工具栏上的图标处于不可用状态,如图 7.19

所示。

图 7.19 设置跳转次序模式

(2)红色数字出现在各列的上方,文本对象、线段、方框、椭圆、位图、计算列、按钮、

组框等对象没有跳转次序。

(3)通过单击选中某列上方的红色数字,输入新的序号,即设置了该列的跳转次序。序

号的有效值为 0~999,其中 0 表示该列不能得到焦点,因此运行时也就不能修改该列的值。

其他数字的意义为:运行时当数据窗口得到焦点时,焦点首先移动到序号最小的列;用户第

一次按 Tab 时,焦点移动到序号第二小的列;用户第二次按 Tab 时,焦点移动到序号第三小

的列;依此类推。定义跳转次序时选择的序号值只要保持合适的大小次序也就可以了,因为

退出设置跳转次序模式后并重新进入该模式时,PowerBuilder 自动以 10 增量重新设置跳转次

序。

(4)单击数据窗口画笔工具栏上的“Tab Order(跳转次序)”图标或选择“Design”菜单

中的“Tab Order”菜单项,返回设计模式。

7.预览数据窗口对象

在设计数据窗口对象的过程中,随时可以通过预览(Preview Object)查看数据窗口的运

行效果,预览时不仅能够看到数据窗口的外观,而且看到的结果就是实际运行时的结果,这

点与窗口对象的预览不同。

7.5.3 数据窗口的布局结构

本节介绍 Design 子窗口中包括的 6 个区域。

图 7.18 “Zoom”对话框

Page 154: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·144·

1.页眉区

页眉区(Header)主要用来放置每页或每屏顶部显示的信息,如报表名、列标题等。

2.组标题区

只有选择了分组风格或创建了分组后,PowerBuilder 才会自动把组标题区(Group Header)

放进数据窗口。在组标题区通常放置每组数据前出现的信息,如按部门分组时的部门名称。

3.细目区

细目区(Detail)主要用于显示查询到的数据。

4.组尾区

与组标题区相似,只有选择了分组风格或创建了分组时,PowerBuilder 才会自动把组标

题区与组尾区(Group Trailer)一起显示在数据窗口中。在该区中通常放置每组数据的统计与

汇总信息。每个分组只有一个组尾区。

5.汇总区

汇总区(Summary)里的数据只有当显示完所有细目数据后才会出现在最后一屏或最后

一页数据的后面。通常在该区中汇总整个数据窗口的统计信息,如数据行总数等。

6.脚注区

脚注区(Footer)与页眉区相对应,该区中的数据出现在每一屏或每一页的底部。通常在

脚注区中放置一些计算列,如显示页码等。

7.5.4 控制列对象的显示与编辑

数据窗口主要用于显示和输入数据,它提供的显示格式可以定义列的显示方式,编辑风

格能够控制用户如何输入数据,有效性规则判断输入数据的有效性。

1.显示格式

显示格式(Display Format)决定数据以何种方式呈现在用户面前。当用户单击带有显示

格式的列(即将输入焦点移动到该列)时,显示格式消失,代之以编辑风格。显示格式常用

于不允许用户修改的列。设置显示格式的步骤如下。

(1)选择“Properties”,单击“Format”标签。

(2)从右部的格式列表中选择一种格式或直接在“Format”编辑框中键入显示格式,然

后返回。

2.编辑风格

与显示格式相似,编辑风格(Edit Style)改变了数据的显示方式。与显示格式不同的

是,当定义了编辑风格的列得到输入焦点时,编辑风格并不消失。编辑风格影响用户输入

和修改数据的方法。编辑风格有 6 种不同的类型:编辑框(默认风格)(EditBox)、编辑掩

Page 155: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·145·

码(EditMask)、复选框(CheckBox)、单选钮(RadioButton)、下拉列表框(DropDownListBox)、

下拉数据窗口(DropDownDataWindow)。设置列对象编辑风格的步骤如下。

(1)右击要设置编辑风格的列对象,选择“Properties”,单击“Edit”标签,系统显示该

选项卡。

(2)在“Style type”列表框中选择所需要的编辑风格。

(3)在“Style Name”列表框中选择编辑样式,然后返回。

7.5.5 控制数据行

1.记录过滤

过滤针对存放在数据窗口缓冲区中的数据进行,不生成新的 SQL 语句,也不访问数据库。

过滤条件是个逻辑表达式,条件为真(TRUE)的数据被显示,条件为假(FALSE)的数据被

隐藏。定义过滤条件的步骤如下。

(1)从“Rows”菜单中选择“Filter⋯”,弹出如图 7.20 所示的“Specify Filter”对话框。

(2)在编辑框中输入一个逻辑表达式,用来检测每条记录是否满足条件,使逻辑表达式

的值为真(TRUE)的记录被显示,为假(FALSE)的记录不显示。定义逻辑表达式时,通过

在“Functions”列表框中选择函数和在“Columns”列表框中选择列,能够减少键入错误。另

外,使用逻辑运算符 AND、OR 能够构成复杂的逻辑表达式。

(3)单击“Verify”按钮,验证逻辑表达式的有效性。

(4)单击“OK”按钮完成过滤条件的定义。

图 7.20 “Specify Filter”对话框

2.记录排序

定义数据源时,通过 ORDER BY 子句可以对检索到的数据进行排序,这种方式下排序工

作由 DBMS 完成。但有时希望数据检索出来后按不同顺序查看数据,指定数据窗口的排序方

式可以完成这一任务,此刻排序工作由客户端的数据窗口完成。为数据窗口指定排序方式的

步骤如下。

(1)在“Rows”菜单中选择“Sort⋯”,弹击如图 7.21 所示的 “Specify Sort Columns”

Page 156: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·146·

对话框。

(2)将要排序的列依次从左边的列表框中拖曳到右边的列表框中,此刻每个排序项后面

“Ascending”列都有一个复选框,选中该复选框表示按升序排序,否则按降序排序。

(3)如果想按某个表达式排序,那么双击右边列表框中的一列,系统显示“Modify

Expression”对话框,在此对话框中输入所需要的表达式,之后关闭该对话框。

(4)单击“OK”按钮返回画笔工作区。

图 7.21 “Specify Sort Columns”对话框

删除排序的方法是:在“Specify Sort Columns”对话框中,将“Columns”列表框中指定

的排序列重新拖曳到左部的“Source Data”列表框中。

3.记录分组

与记录排序相似,也可以在数据窗口中分组记录,其步骤如下。

(1)在“Rows”菜单中选择“Create Group⋯”,弹出如图 7.22 所示的“Specify Group

Columns”对话框。

图 7.22 “Specify Group Columns”对话框

(2)从“Source Data”列表框中把要分组的列拖曳到“Columns”列表框中。

(3)如果想按某个表达式分组,那么双击右边“Columns”列表框中的一列,之后关闭该

对话框。

Page 157: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·147·

7.6 增强数据窗口对象的功能

除了前面介绍的各种手段可用于定义数据窗口的数据和改进数据窗口的性能外,还可以

在数据窗口对象中放置其他对象,以进一步增强数据窗口的功能。能够放置到数据窗口对象

上的对象包括:静态文本框(Static Text)、计算列(Computed Field)、位图(Picture)、统计

图(Graph)、嵌套报表(NestedReport)、OLE 对象以及各种绘图对象(直线、椭圆、矩形、

圆角矩形)等。这些对象可以通过在数据窗口画笔工具栏的下拉对象图标列表或“Object”菜

单中选择后放置到数据窗口对象中。

7.6.1 增加与删除数据窗口中的对象

初步设计的数据窗口经过适当的修改后可能会更符合应用程序的需求。例如,有个修改

人员档案的数据窗口,人员编号对用户来说意义不大,它无须修改,但人员编号是主键,为

了让数据窗能够自动修改数据库,通常要把这个主键保留在数据窗口的 Select 语句中,而在

数据窗口对象中把人员编号列删除。删除了某列后发现操作失误,但没有关系,再把它增加

到数据窗口对象中就可以了。

1.删除列对象

删除数据窗口对象中的列对象的步骤如下。

(1)在数据窗口画笔工作区中选择要删除的列。

(2)按 Delete 键或单击画笔工具栏上的“Clear”图标,选中列即被删除。

2.增加列对象

在数据窗口对象中增加列对象的步骤如下。

(1)单击数据窗口画笔工具栏图标上的箭头,系统打开对象图标列表,通过单击选择列

对象图标。

(2)单击数据窗口中要放置该列的位置,系统显示“Select Column”对话框。

(3)在这个对话框中通过单击选择所需列,然后单击“OK”按钮关闭对话框。

(4)选择的列即被放置到数据窗口对象中。

在数据窗口中增加其他对象的方法与此类似,可参照使用。

7.6.2 静态文本对象

在生成数据窗口时,根据数据源的不同,系统自动在数据窗口中添加一些标题或标签,

用于说明数据的作用,这些标题或标签都是静态文本对象。需要时开发人员可以在数据窗口

中增加额外的静态文本对象。

静态文本对象的放置方法是:通过单击在数据窗口画笔工具栏的下拉对象图标列表中选

择静态文本图标,然后在希望放置该对象的地方单击。放置了静态文本对象后,在文字风格

栏中可以修改它的标题、对齐方式、字体、字形、文字大小等。如果还想改变它的其他属性,

那么双击该对象,在属性对话框中进一步设置。修改静态文本对象的标题时,可以通过在标

题中加入回车(~r)换行(~n)字符而使静态文本对象的标题多行显示。

Page 158: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·148·

例如,当某个静态文本对象的标题修改为:“这是~r~n 静态文本对象~r~n 标题”,该

标题将显示为三行。

7.6.3 计算域

在定义数据窗口对象的数据源时,我们能够定义一个计算列,此时计算列的数值在数据

检索时就被计算出来,在下次检索之前,计算列的值保持不变,计算过程由数据库管理系统

承担,数据窗口只不过按要求的格式显示出来。但有时希望计算列的内容随用户数据的输入

而调整,此时就需要在数据窗口中定义计算列(这种计算列又称做计算域),这时,计算任务

在客户端完成。在数据窗口中插入一个计算域的方法如下。

单击菜单“Insert”→“Control”→“Computed Fileld”后,在要插入计算域的地方用鼠标

左键单击,弹出“Modify Expression”对话框,如图 7.23 所示;在“Expression”栏输入计算公

式,单击“OK”按钮,完成计算域的插入。图 7.24 所示为插入了入库单进货金额的计算域。

图 7.23 输入计算域公式

图 7.24 插入好的计算域

7.7 本章实例

实例内容:使用数据窗口对象对人员档案进行修改、删除操作。

Page 159: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·149·

在前几章中我们都是用窗口的编辑控件录入数据,使用 SQL 语句完成对数据库的访问,

但 PB 的数据窗口对象几乎可以完成对数据库访问的所有操作,包括报表、图表等。下面首

先创建一个数据窗口对象,单击按钮“New”,弹出“New”对话框;选择 Freeform 图标(意

思是自由风格),单击“OK”按钮,关闭对话框;弹出选择数据源对话框,在这里选择默认

的“Quick Select”数据源,单击“Next”按钮;出现“Select Tables”对话框,在 Tables 栏里

选择 t_employee,在 Columns 栏中选择所有字段,单击“OK”按钮,关闭对话框。

然后选择颜色,单击“下一步”按钮,在这一页会显示出所选择的信息;单击“Finish”

按钮,打开数据窗口对象画板,如图 7.25 所示。

图 7.25 人员管理数据窗口设计

图 7.26 预览数据窗口实例

另外,需要把相应的标签改成中文。

为了完成相应的删除、修改操作,在数据窗口控件中添加 5 个按钮,分别是添加、删除、

更新、向上、向下,对应的动作分别为 InsertRow(12)、DeleteRow(10)、UpdateRow(13)、

PagePrior(5)、PageNext(4)。通过 Action 属性修改 ,并保存为 d_employee_edit。

Page 160: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·150·

对于新建窗口,在窗口上放置一个数据窗口控件 ,并将其放到窗口上合适的位置,

数据窗口对象控件的名成为 dw_1,下一步我们只需要将刚刚做好的数据窗口对象添加到这里

就可以了。

今天再留给大家一个作业,将前两章的添加操作更新一下,让你的系统更加完善。

本 章 小 结

本章主要介绍数据窗口对象。首先介绍数据窗口对象概念,然后介绍如何创建数据窗口

对象和如何定义数据源,最后介绍数据窗口对象的各种显示风格以及如何增强数据窗口对象

的功能。

练 习

1.怎样创建数据窗口对象?

2.PowerBuilder 提供了哪几种数据源?各自适合用于什么场合?

3.PowerBuilder 有几种显示风格?各种显示风格有什么特点?

4.数据窗口对象与数据窗口对象的字段各有哪些属性?它们的用途是什么?怎样进行调

整?

5.数据窗口对象的字段标签与数据窗口对象的字段有什么区别?

6.数据窗口对象的字段有哪几种显示格式?各自适合显示什么类型的数据?

7.为什么要设置数据窗口对象的有效性检查?怎样设置数据窗口对象的有效性检查?

8.怎样设置数据窗口对象的排序?

9.为什么要使用数据窗口对象的过滤?怎样设置数据窗口对象的过滤?

10.PowerBuilder 支持哪些文件类型的导入和导出?怎样进行数据窗口对象数据的导入

和导出?

Page 161: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·151·

第 8 章 数据窗口控件

数据窗口对象作为一种 PowerBuilder 对象,要想在应用程序中使用必须通过数据窗口控

件来实现。数据窗口控件是窗口中的一种控件,数据窗口控件与数据窗口对象结合才能使数

据库数据在窗口中展现出来。当然,它不是惟一的在窗口中展现数据库数据的技术,但作为

PowerBuilder 的专利技术它包含一整套完整的操作数据、表现数据的方法,使用起来方便、

快捷、灵活,使之成为 PowerBuilder 的核心技术。

数据窗口在处理数据时很有特色,它在客户机的本地内存中开辟了 4 个缓冲区:主缓冲

区、删除缓冲区、过滤缓冲区、原始缓冲区。从数据库中检索到数据后,数据窗口根据不同

情况把数据放置到不同的缓冲区。4 个缓冲区各司其职,协作完成数据的增、删、改,最后

把结果提交给数据库管理系统。

数据窗口的属性、事件和函数是灵活运用数据窗口的基础,也是数据窗口的博大精深之

所在。事实上,只要有足够的代码(不考虑效率的话),数据窗口就能够完成任何功能。

8.1 建立数据窗口控件与数据窗口对象的连接

在数据窗口画板中定义一个数据窗口对象后,要把数据窗口控件放置在窗口中才能利用

它来处理数据。数据窗口控件是标准的 PowerBuilder 控件,可以像使用其他控件一样使用它,

即用户先要在窗口中添加一个数据窗口控件,然后将在数据窗口画板中创建的数据窗口对象

与这个数据窗口控件连接起来,如图 8.1 所示。

数据窗口画板

数据窗口对象

窗 口 画 板

窗 口

数据窗口控件

图 8.1 数据窗口对象与数据窗口控件的连接

8.1.1 数据窗口的运用

运用数据窗口的一般步骤如下。

� 使用数据窗口画板创建数据窗口对象;

� 在窗口上放置数据窗口控件;

� 通过属性设置或编码将数据窗口控件与数据窗口对象联系起来;

Page 162: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·152·

� 设置数据窗口控件的属性,以控制它的外观和行为。

如果应用程序尚未与数据库建立连接,那么在某个事件处理程序中使用 CONNECT 语句

与数据库建立连接。

使用数据窗口控件的对象函数 SetTransObject ()或 SetTrans(),将数据窗口控件与事务对

象联系起来。

使用数据窗口控件的对象函数 Retrieve ()把数据库中的数据装入数据窗口中。

针对具体应用,编写某些数据窗口控件事件的事件处理程序,响应用户的操作。

需要时使用数据窗口控件的对象函数 Update()保存用户对数据的修改。

8.1.2 放置数据窗口控件

通过数据窗口控件运用数据窗口对象是数据窗口的最常见用法。数据窗口控件可以放置

到窗口上,也可以放置到定制可视用户对象中,其处理方法一致。

在窗口上放置数据窗口控件步骤如下。

� 单击画板栏上的窗口画板,打开要放置数据窗口控件的窗口。

� 单击窗口画板工具栏图标上的箭头,打开控件图标列表,从中选择数据窗口控件

图标。

� 单击窗口上想放置数据窗口控件的地方,此处即出现一个空白的方框,该方框就是数

据窗口控件。

� 根据需要移动数据窗口控件的位置和改变它的大小。

8.1.3 连接数据窗口控件与对象

窗口上放置了数据窗口控件后,还需要将数据窗口对象与它结合起来才能发挥数据窗口

控件的作用,其结合方法如下。

双击放置在窗口上的数据窗口控件,或右击数据窗口控件并从弹出的菜单中选择

“Properties”菜单项。

系统显示“DataWindow”属性对话框。

在“General”选项卡中,“DataWindow Object Name”编辑框用于指定与数据窗口控件

相关联的数据窗口对象;在该编辑框中可以直接键入数据窗口对象的名字,不过更常用的方

法是单击“Browse⋯”按钮,系统显示如图 8.2 所示的“Select Object”对话框。

在该对话框底部的“Application Libraries”列表框中单击包含要选择数据窗口对象的应

用库。

通过单击,在中部列表框中选择数据窗口对象,此时该对象的名称出现在顶部的编辑框

中,相应数据窗口对象的注释显示在“Comments”中(当然,直接在编辑框中键入数据窗口

对象名也可以)。

单击“OK”按钮返回属性对话框。

在属性对话框中单击“OK”按钮,就把数据窗口对象与数据窗口控件结合起来了。

8.1.4 动态更换数据窗口对象

数据窗口控件与数据窗口对象的关联是通过给数据窗口控件的 dataobject 属性赋值实现

的,dataobject 属性的数据类型为字符串(String)。程序中通过给 dataobject 属性赋不同的值

Page 163: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·153·

而让数据窗口控件关联不同的数据窗口对象,这个值就是数据窗口对象的名称。

例如,将数据窗口控件 dw_1 关联的数据窗口对象换成名为 d_graph,在按钮程序中写上

下述语句:

dw_1.reset() //清除数据窗口控件 dw_1 数据窗口中的所有数据

dw_1.dataobject="d_graph" //将数据窗口控件 dw_1 关联的数据窗口对象换成名为 d_graph

dw_1.settransobject(SQLCA) //让数据窗口控件 d_graph 使用系统默认的事务对象 SQLCA

dw_1.retrieve() //让数据窗口控件 d_graph 从数据库中提取数据

图 8.2 “Select Object”对话框

8.2 数据窗口控件与数据库

在窗口画板中,把一个数据窗口对象与一个数据窗口控件连接后,如果预览该数据窗口,

数据窗口会显示一个没有数据的数据窗口控件。应用程序是通过数据窗口控件与数据窗口对

象交互的,如果要想在数据窗口控件中显示数据,必须把定义数据窗口对象的数据源连接到

数据窗口控件中,也就是说要创建应用程序与数据库的连接。

创建一个应用程序与数据库的连接需完成以下步骤:

� 将事务对象(Transaction Object)设置为相应的值;

� 与数据库连接;

� 为数据窗口控件设置事务对象;

� 进行数据库处理;

Page 164: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·154·

� 断开与数据库的连接。

8.2.1 与数据库建立连接

应用程序与数据库的连接通过事务对象来完成,在建立连接前需要首先给事务对象的相

关属性赋值,然后用嵌入式 SQL 语句 CONNECT 建立连接。

如果应用程序只访问一个数据库,那么使用 PowerBuilder 的默认事务对象 SQLCA 就可

以了。SQLCA 是个全局对象,在应用程序的任何地方都可以访问。下面是使用 SQLCA 与

ODBC 数据源建立连接的简单示例。

//设置事务对象属性

// Profile stock

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "ConnectString=’DSN=stock;UID=sa;PWD=’" //与数据库连接

CONNECT USING SQLCA; //检查连接是否成功

If SQLCA.SQLCode<0 Then

MessageBox("连接失败",SQLCA.SQLErrText,Exclamation!)

End If

8.2.2 为数据窗口控件分配事务对象

在使用数据窗口控件检索数据之前,必须通知数据窗口使用哪个事务对象来操作数据库

(实际上也就是告诉数据窗口从哪个数据库中检索数据)。

要完成这个任务,可以使用数据窗口控件的对象函数 SetTransObject()。其语法格式为:

dwcontrol.SetTransObject ( transaction )

其中:

dwcontrol 是数据窗口控件的名称;

transaction:是事务对象名。

SetTransObject()函数执行成功时返回 1,失败时返回-1。通过该函数的返回值,应用程

序能够知道 SetTransObject()函数的执行情况。

例如:若要把数据窗口控件 dw_1 与连接数据库的事务对象 SQLCA 联系在一起,可写为:

dw_1.SetTransObject (SQLCA) 一般来说,在数据窗口控件所在窗口的 Open 事件中执行 SetTransObject()函数

8.2.3 检索数据

1.Retrieve 函数

数据窗口控件与事务对象建立联系之后,即在两者之间架起了一座桥梁。但是,数据还

在数据库中,现在需要调用数据窗口控件的对象函数 Retrieve()把数据装入数据窗口中。

Retrieve 的语法格式为:dwcontrol.Retrieve ( {argument, argument . . .} )

该函数执行成功时返回一个长整数指示显示的数据行数(即主缓冲区中的数据行数),

失败时返回-1。如果参数中有空值(NULL),则该函数返回空值。

Page 165: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·155·

【例 1】 语句 lrc=dw_1.Retrieve ()执行无参数检索,返回值放到 long 型变量 lrc 中。

【例 2】 假定数据窗口控件 dw_1 包含的数据窗口对象使用下述 SQL SELECT 语句:

SELECT indate, sid, quantity,unit,cost From instock

WHERE indate between :a_date1 and :a_date2

:a_date1 和:a_date2 是数据窗口画板中定义的参数,对应的检索语句可以为:

lrc=dw_1.Retrieve (date(�2000-01-01�, �2001-01-01�)) 检索数据时发生的事件执行 Retrieve 函数时,触发下列的数据窗口控件事件:

DBError:检索失败时触发。

2.RetrieveRow 事件

每检索一行数据触发一次该事件。利用它可向用户提供当前已检索数据条数的信息,并

可在检索过程中终止检索。但对该事件编程后,将会显著增加检索时间,严重影响程序的运

行效率。该事件的返回值为:0—继续检索(默认值),1—停止检索。

3.RetrieveStart 事件

检索开始时触发该事件,此时数据库尚未检索数据,应用程序可以控制是否继续检索、

是否不作任何处理停止检索以及是否把新检索出的行添加到数据窗口原有行末尾。上述动作

通过该事件的不同返回值来控制。RetrieveStart 事件的返回值为:0—继续检索(默认值),

1—停止检索,2—在检索数据前不清除数据窗口控件的缓冲区和显示行。

4.RetrieveEnd 事件

当检索结束时触发该事件。

8.2.4 更新数据库

用户修改了数据窗口中的数据后,就需要把修改过的数据保存到数据库中,最简便的方

法是使用函数 Update()。该函数语法格式为:

dwcontrol.Update ( {accept {,resetflag}})

参数说明:

dwcontrol:数据窗口控件名;

Accept:可选参数,它用一个 Boolean 值指明,在更新数据库数据前是否先执行 AcceptText()

函数把用户当前输入的数据放到数据窗口中。有效取值为:TRUE—默认值,自动执行

AcceptText()函数,若未通过数据有效性校验,则取消更新操作;FALSE—不执行 AcceptText()

函数。

Resetflag:可选参数,它用一个 Boolean 值指明该控件是否自动复位更新标志。有效取值

为:TRUE——默认值,自动复位更新标志;FALSE——不复位更新标志。

如果更新成功,Update()函数的返回值为 1;如果失败,返回值为-1。执行该函数后,应

该检查返回值,当返回值为 1 时,使用 COMMIT 语句提交修改,让数据库永久性地记录数据

的修改;否则,使用 ROLLBACK 语句撤销所有修改。

下面是 Update()函数的一个应用示例。

Page 166: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·156·

integer rc

string str

rc=dw_1.Update()

if rc>0 then

COMMIT USING SQLCA;

MessageBox("提示信息","提交成功!")

Else

Str = "错误号="+String(SQLCA.SQLDBCode)+"原因为:"+SQLCA.SQLErrText

ROLLBACK USING SQLCA ;

MessageBox("数据库出错", str)

end if

Update()函数可触发下述事件:

DBError:更新失败时触发。

SQLPreview:在 SQL 语句发送到数据库时触发。

UpdateStart:更新开始时触发。

UpdateEnd:更新结束时触发。

如果 accept 参数设置为 TRUE,那么 Update()函数还会触发下述事件:

ItemChanged

ItemError

8.3 数据窗口项的引用

8.3.1 数据窗口控件的缓冲区

数据窗口从数据库中检索到的数据都放置在客户机的内存中,这片内存被分成 4 个区域,

分别为:

� 主缓冲区(Primary Buffer)

� 删除缓冲区(Delete Buffer)

� 过滤缓冲区(Filter Buffer)

� 原始缓冲区(Original Buffer)

代码中可以直接访问这 4 个缓冲区。

主缓冲区保存显示在数据窗口控件中的所有数据行,以及这些行和各个列的状态。当

使用数据提取函数 Retrieve()检索数据时,检索到的数据放置在主缓冲区中;当插入数据

时,插入的数据也存放在主缓冲区。行和列的状态用于数据窗口保存数据时生成合适的

SQL 语句。

当删除数据行时(不管是使用 DeleteRow()函数直接删除一行,还是使用 RowsMove()函

数在缓冲区之间移动数据行),被删除数据行从主缓冲区移动到删除缓冲区。当使用数据窗

口控件的对象函数 Update()将数据窗口的修改发送到数据库管理系统后,被成功删除的记录

均从删除缓冲区中清除。在保存数据时,删除缓冲区用于生成 DELETE 语句。

过滤缓冲区用于保存那些满足数据源定义(即满足 SELECT 语句中的条件)而不满足过

滤条件的行。过滤缓冲区与主缓冲区一起在更新数据时生成所需的 INSERT 语句或 UPDATE

语句。

原始缓冲区保存数据窗口从数据库中检索出的原始数据,这些数据用于构造修改数据库

Page 167: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·157·

数据的 SQL 语句的 WHERE 子句。原始缓冲区在 5.0 以前的版本中应用程序不能直接访问,

现在可以通过把 GetItem 簇函数(包括 GetItemString()、GetItemDecimal()、GetItemDate()等)

的入口参数设置为 TRUE 来访问原始缓冲区中的数据。

8.3.2 编辑状态标志

在数据窗口控件的主缓冲区、过滤缓冲区和删除缓冲区中,每一行和每一行中的每个列

(即每个数据项)都有一个编辑状态标志(Edit Status Flag);这个标志指示了相应行是否是

新增加的行,相应列的数据是否被修改。在往数据库中保存数据时,数据窗口利用这个标志

值来决定产生什么类型的 SQL 语句。

8.3.3 插入行与删除行

1.插入行 InsertRow()

InsertRow()函数在数据窗口的主缓冲区中插入一个空行,其语法格式为:

dwcontrol.InsertRow ( row )

其中:row 是个长整数(long 型),它指定插入行的插入位置。

例如,若要在数据窗口 dw_1 中插入一行,并让该行成为数据窗口的第 10 行,那么语句

dw_1.InsertRow ( 10 ) 即能完成这个任务。

row 等于 0 时含义特殊,它表示在主缓冲区最后一行后面插入一行。

InsertRow()函数执行成功时,返回一个 long 型值指示插入行的行号,执行失败时返回 -1。

2.删除行 DeleteRow()

DeleteRow()函数在数据窗口的主缓冲区(即显示在用户面前的数据中)中删除一行,语

法格式为:

dwcontrol.DeleteRow ( row )

其中:row 为要删除行的行号,row 等于 0 时删除当前行。

例如,语句 dw_1.DeleteRow (10) // 删除数据窗口控件 dw_1 中的第 10 行。

DeleteRow ()函数执行成功时返回 1,失败时返回-1。

8.3.4 编辑控件

使用数据窗口控件时,需要理解的最重要的概念之一是编辑控件(EditControl)。请注

意,这里讲述的编辑控件不是放置在窗口上的编辑框。

当数据窗口中的列可以编辑时,系统自动创建一个编辑控件“漂浮”在得到输入焦点的

可编辑项上,这个编辑控件没有边框,从外观上只能看到插入指针在闪动。当用户按 Tab 键

或通过单击改变输入焦点时,编辑控件随之移动到得到焦点的项上,同时编辑控件根据该项

的设置及相应列的编辑风格自动调整将编辑控件数据放到数据窗口列中。因此,本质上用户

是在编辑控件中键入、编辑、修改数据。编辑控件是个文本型控件,在它里面输入的所有数

据都被当做字符串保存。

Page 168: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·158·

列的编辑风格控制着数据的显示和操作方式,而显示格式则控制着编辑控件不再有效时

(也就是输入焦点离开该列时)数据的显示方式。

当用户按 Tab 键或通过单击改变输入焦点时,数据窗口接受编辑控件中的数据(当然数

据要通过适当的有效性检查,后文将介绍检查步骤),并将其置入相应的数据项中(放到数

据窗口的主缓冲区中)。

(1)在编辑控件中的数据被放到主缓冲区之前获取用户在编辑控件中输入的值,可以使

用数据窗口控件的对象函数 GetText()。GetText()函数的语法为:

dwcontrol.GetText() 无论编辑控件当前所在行的数据类型是什么,GetText()函数都返回一个字符串。应用程

序负责适当的数据类型转换。如果数据窗口中没有可编辑列,那么 GetText()函数返回空串。

一般来说,GetText()函数在数据窗口控件的 ItemChanged 事件和 ItemError 事件的事件处

理程序中调用。

(2)有时候需要在代码中设置编辑控件的值,比如,用户输入了某个选择项的一部分时,

程序自动填充整个选项。此时可以使用数据窗口控件的对象函数 SetText()达到目的。

(3)将编辑控件数据放到数据窗口列中。前面曾经讲到,用户输入数据时,实际上是在

编辑控件中输入,该控件框“漂浮”在当前列上面,用户移动输入焦点后,数据窗口把编辑

控件中的数据移到列中。当用户没有移动输入焦点时,怎么把编辑控件中的数据送到列中呢?

这就要使用 AcceptText()函数了,它告诉数据窗口控件:如果编辑控件中还有数据未检验,

那么现在检验它并把它放入主缓冲区中。AcceptText ()函数的格式为:

dwcontrol.AcceptText ()

这个函数没有参数,返回值 1 表示执行成功,返回值-1 表示执行出错。AcceptText ()函

数可触发 ItemChanged 事件和 ItemError 事件。

8.3.5 得到与设置当前行/列

当前行和当前列是目前正操作的行和列。例如,用户在编辑数据时,当前行和当前列就

是用户正编辑数据项所在的行和列。

1.得到当前行号 GetRow ()

GetRow ()函数返回当前行的行号。语法格式为:

dwcontrol.GetRow () 该函数返回一个 long 型值,表示当前行号。如果没有选中任何一行,则返回 0,出错时

返回-1。

2.设置某行为当前行 SetRow ()

SetRow(row)函数把参数 row 指定的行设置成当前行。语法格式为:

dwcontrol.SetRow ( row ) 设置成功时该函数返回 1,否则返回-1。如果 row 的值小于 1 或大于数据窗口中的总行

Page 169: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·159·

数,则 SetRow ()函数执行失败。SetRow ()函数可能触发下述事件:

ItemChanged

ItemError

ItemFocusChanged

RowFocusChanged

3.得到记录行数 dwcontrol. RowCount()

该数据窗口控件的对象函数可以返回当前数据窗口中的记录个数。

【例 3】 按钮“下一条”可以改变数据窗口的当前行。

long row, rsm

rsm = dw_1.RowCount()

row = dw_1.GetRow()

if row >= rsm then

row = 1

else

row ++

end if

dw_1.SetRow() 注:为了清楚显示,可在窗口事件中加入下列语句:

dw_1.SetRowFocusIndicator(Hand!) //设置行光标指示为手

4.得到当前列号 GetColumn ()

GetColumn ()函数返回当前列号。语法格式为:

dwcontrol.GetColumn () 该函数返回一个 integer 型值,表示当前行号。返回值为 0 表示无当前列,返回值为-1

表示操作失败。

5.设置某列为当前列 SetColumn ()

SetColumn ()函数把参数 column 指定的列设置为当前列。语法格式为:

dwcontrol.SetColumn ( column ) 设置成功时该函数返回 1,否则返回-1。如果 column 的值小于 1 或大于数据窗口中的

总列数,则 SetColumn ()函数执行失败。参数 column 可以是列号(integer),也可以是列

名(String)。

SetColumn ()函数可能触发下述事件:

ItemChanged

ItemError

ItemFocusChanged

Page 170: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·160·

8.3.6 得到所设置数据项的值

数据窗口中任意一行和任意一列可表示为:控件名.Object.列名[行号]。

例如:dw_1.object.name[1]

【例 4】 编写按钮控件事件,在控件 dw_1 中的顾客表中插入一条记录,然后赋值。

Long �row

Row = Dw_1.InsertRow(0)

Dw_1.ScrollToRow(row)

Dw_1.object.cname[row] = "无"

Dw_1.object.age[row] = 20

【例 5】 编写按钮控件事件,将控件 dw_1 中的顾客表中凡年龄大于或等于 18 的顾客的

备注中写入“成年人”,否则写入“少年儿童”。

long I, row, rsm

rsm = dw_1.RowCount()

for I=1 to rsm

if dw_1.object.age[I] >= 18 then

dw_1.object.memory[I] = "成年人"

else

dw_1.object.memory[I] = "少年儿童"

end if

next

8.4 与数据窗口有关的函数

8.4.1 滚动数据行

除了用户直接操作滚动显示在数据窗口中的数据行外,通过编程同样可以滚动数据行。

完成数据行滚动的函数有 6 个:Scroll()、ScrollToRow()、ScrollNextRow ()、ScrollPriorRow ()、

ScrollNextPage ()、ScrollPriorPage ()。本节介绍其中的两个函数,其余函数的用法参见附录。

1.Scroll()函数

它滚动“漂浮”数据窗口上的编辑控件中的文本行,使相应行显示在编辑控件中。其语

法格式为:

dwcontrol.Scroll ( number )

其中,dwcontrol—数据窗口控件名;number—long 类型,指定要滚动的行数和方向。

参数 number 的值大于 0 时向下滚动 number 行,number 的值小于 0 时向上滚动 number 行。

如果 number 的值超过余下可滚动行数,那么该函数滚动到编辑控件中数据的开头或结尾

(依据滚动方向)。

返回值:Long。

Page 171: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·161·

函数执行成功时,Scroll()函数返回编辑框中第一个可见行的行号;发生错误时返回-1。

如果任何参数的值为 NULL,则 Scroll()函数返回 NULL。

用法:如果 Scroll()函数参数中指定的滚动行数超过了编辑框中余下的实际行数,则该函

数将回绕滚动。

【例 6】 下面的代码把数据窗口控件当前编辑框的内容向下滚动 4 行:

dw_Employee.Scroll(4)

【例 7】 下面的代码把数据窗口控件当前编辑框的内容向上滚动 4 行:

dw_Employee.Scroll(-4)

2.ScrollToRow()函数

当在数据窗口主缓冲区的末尾插入一行时,新行并不一定能在数据窗口中看到,这时可

以使用函数 ScrollToRow()。

将该行滚动到窗口视野中,让用户不用按滚动条就看到新行。同时,ScrollToRow()函数

还把指定行设置为当前行,但它并不改变当前列。

功能:滚动数据窗口控件的显示到指定行,该函数改变当前行但不改变当前列。其语法

格式为:

dwcontrol.ScrollToRow ( row )

其中,dwcontrol—数据窗口控件名;row—long 类型,指明要滚动到哪一行。如果 row

参数设置为 0,则滚动到第一行;如果 row 参数的值大于最后一行的行号,则滚动到最后一行。

用法:执行了 ScrollToRow()函数后,指定的行成为新的当前行。如果该行已经显示在数

据窗口中(即用户可以直接看到该行),那么显示行不会发生变化。如果该行不可见,则显

示行向所需方向滚动,以把当前行显示在数据窗口中。

ScrollToRow()并不加亮(或称选中)当前行。如果想加亮当前行,请使用数据窗口控件

的对象函数 SelectRow()。ScrollToRow()函数可能触发数据窗口的下述事件:

ItemChangedn

ItemErrorn

ItemFocusChangedn

RowFocusChanged

注:该函数隐含地把第 row 行设置为当前行,但它并不改变当前列。

8.4.2 改变当前行光带

功能:在数据窗口控件中选择或去掉选择(加亮或去掉加亮)指定的行。

语法格式:dwcontrol. SelectRow(row, boolean)

参数:dwcontrol——数据窗口控件名;row——long 类型,指定要选择或去掉选择行的

行号。该参数的值指定为 0 时,选择或去掉选择所有的行;boolean——boolean 类型,指定要

选择行或是去掉选择行。有效取值为:

TRUE 选中指定的行,被选中行被加亮显示;

FALSE 不选中指定的行,这些行正常显示。

返回值:Integer。

Page 172: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·162·

函数执行成功时返回 1,发生错误时返回-1。如果任何参数的值为 NULL,则 SelectRow()

函数返回 NULL。

【例 8】 在 dw_1 的 rowfocuschanged 事件中写入

dw_1.SelectRow(0, FALSE)

dw_1.SelectRow(CurrentRow, TRUE) // CurrentRow 当前行

8.4.3 清除所有行

功能:清除数据窗口控件中的所有数据。

语法格式:dwcontrol.Reset ()

参数:dwcontrol——数据窗口控件名。

返回值:Integer。

函数执行成功时返回 1,发生错误时返回-1。如果 dwcontrol 的值为 NULL,则 Reset()

函数返回 NULL。

数据窗口在检索数据前自动清除原有数据,因此检索前不需要调用该函数。Reset ()函数

的功能与删除数据窗口的所有行有些差别:执行 Reset ()函数后再执行 Update()函数并不会清

除数据库中的数据,而删除数据窗口的所有行后再执行 Update()函数就会清除数据库中的

数据。

【例 9】 下面的语句清除数据窗口控件 dw_employee 的内容:

dw_employee.Reset()

8.4.4 修改过滤条件及过滤数据

1.SetFilter()函数

功能:定义数据窗口控件的过滤条件。

语法结构:dwcontrol.SetFilter ( format )

参数:dwcontrol——数据窗口控件名;format——string 类型,其值是用做过滤条件的逻

辑表达式。表达式中可以使用列名或列号,使用列号时,在列号前加上符号#。如果 format

参数的值为 NULL,那么程序运行时 PowerBuilder 会提醒用户输入过滤条件。

返回值:Integer。函数执行成功时返回 1,发生错误时返回-1。如果任何参数的值为 NULL,

则 SetFilter()函数返回 NULL。

用法:在定义数据窗口对象时,可以同时定义过滤条件,这样,程序运行时,检索出数

据窗口中的数据后,不满足过滤条件的数据立刻从主缓冲区被移动到过滤缓冲区。

执行 SetFilter()函数后,新的过滤条件将取代原来的过滤条件(如果原来有过滤条件的

话)。此时,数据窗口并没有真正地过滤数据,要完成过滤任务,还需要执行数据窗口控件

的对象函数 Filter()。该函数把不满足过滤条件的数据从主缓冲区移动到过滤缓冲区。

过滤表达式是由列名或列号、关系操作符以及要比较的值组成的逻辑表达式。逻辑表达

式中可以使用 AND、OR、NOT 逻辑操作符连接不同的部分。使用括号可以改变求值顺序。

2.Filter()函数

功能:在数据窗口控件中显示满足当前过滤条件的行,不满足过滤条件的行从主缓冲区

Page 173: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·163·

中移动到过滤缓冲区。

语法结构:dwcontrol.Filter ()

参数:dwcontrol——数据窗口控件名。

返回值:Integer。函数执行成功时返回 1,出现错误时返回-1。如果 dwcontrol 的值为

NULL,则 Filter()函数返回 NULL。

用法:Filter()函数使用数据窗口当前的过滤条件过滤数据窗口中的数据,函数执行之后,

数据窗口中只显示满足过滤条件的数据。

使用 SetFilter()函数改变当前的过滤条件。定义了新的过滤条件后,使用 Filter()函数把不

满足条件的数据移动到过滤缓冲区中。

【例 10】 dw_1.SetFilter("age>20 and sex=’男’")

dw_1.Filter()

【例 11】 清除过滤条件。

dw_1.SetFilter(’’)

dw_1.Filter()

8.5 数据窗口事件应用实例

【例 12】 实现营业员表的主从显示。

解:dw_1 作为主表采用 grid 风格,dw_2 作为从表采用自由风格,且可按营业员号检索。

在 dw_1 的 rowfocuschanged 事件中,有如下脚本

long row, rsm, id

rsm = this.RowCount()

row = this.GetRow()

if row>0 and row<=rsm then

id = this.Object.SalerID[row]

row = dw_2.retrieve(id)

end if

【例 13】 在 dw_2 输入营业员编号的过程中,当输入的营业员编号与以前的营业员编号

重复时,应报警提示。

解:在 dw_2 的 itemchanged 事件中,编写以下脚本

/*********************

* 防止不合法的 ID 号 *

*********************/

string str

long i, num

if dwo.Name="salerid" then

num = dw_1.RowCount()

for i=1 to num

if (integer(dw_2.GetText())=dw_1.Object.salerid[i]) then

�str = "当前 ID 号与第"+string(i)+"条记录的 ID 号重复"

Page 174: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·164·

�MessageBox("错误信息", str, stopsign!)

�dw_2.SetColumn(dw_2.GetColumn())

�return 2

end if

next

end if

return 0

8.6 数据窗口应用

8.6.1 数据存储对象

应用程序的数据处理离不开数据窗口对象,可是有些情况下在一个具体的应用程序中需

要有数据窗口的功能,但是并不希望用数据窗口控件来显示数据窗口对象,这时可以使用数

据存储对象(DataStore)。

数据存储(DataStore)是 PowerBuilder 的系统对象,是个看不见的数据窗口控件,除了

可视方面的属性外,数据存储的行为与数据窗口控件完全相同。在处理等量数据的条件下,

与数据窗口控件相比,数据存储将节省大量的系统资源。

数据存储通常使用在下述 4 个方面:

� 进行后台数据库数据处理;

� 为多个窗口上共享数据的数据窗口控件服务;

� 避免使用嵌入式 SQL 语句操纵数据库中的数据;

� 在分布式应用的服务器中为客户端准备数据。

1.数据存储对象的属性

数据存储对象的属性很简单,只有 3 个(它们也正是数据窗口控件存储数据所需的属性):

(1)DataObject——类型为 String,保存与数据存储对象相关联的数据窗口对象的名称(如

数据窗口对象 d_dept)。

(2)Object——类型为 dwObject,保存数据窗口对象、数据窗口对象内对象以及这些对

象的所有属性。数据存储的 Object 属性用于在代码中直接访问上述对象的各种属性以及保存

在数据存储中的数据。

(3)ClassDefinition——类型为 PowerObject,保存数据存储的类定义信息。

2.数据存储对象的事件和函数

除了与可视性相关的事件和函数外,数据存储对象与数据窗口控件有相似的事件和函数,

开发应用程序时可参照使用,在此不再重复。

3.数据存储对象的使用

使用数据存储对象时,必须先在程序中为这个数据存储对象创建一个实例,然后再为它

赋值一个数据窗口对象。接下来的操作与使用数据窗口控件相同,如设置数据存储对象的事

务对象,检索数据到数据存储对象中。DataStore 类型的变量可以说明为全局变量、共享变量、

Page 175: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·165·

实例变量或局部变量。

例如,当需要把某个 DataStore 类型的变量说明为窗口的实例变量时,可以这样做:

用窗口画板打开窗口,选择“Declare Instance Variables”选项卡,编辑框中输入类似于

下行的说明:

DataStore ids_stock

说明了 DataStore(数据存储对象)类型的变量后,在某个事件处理程序或用户函数中就可

以使用下述的代码创建数据存储对象实例,并把适宜的数据窗口对象与数据存储对象联系起来:

ids_stock=Create DataStore //创建数据存储对象实例

ids_stock.DataObject="d_stock" //将数据窗口对象 d_stock 与数据存储联系起来 除图形操作外,现在对数据窗口控件能够做的一切操作对数据存储同样适用。

例如:ids_stock.SetTransObject(SQLCA) //设置与数据存储相关联的事务对象

ids_stock.Retrieve() //从数据库中检索数据

ids_stock.InsertRow(0) //在数据存储中插入一行

ids_stock.Object.Name[1]="电视机" //设置第一行、Name 列的值

ids_stock.DeleteRow(2) //删除第二行

ids_stock.SetSort("name D") //按 name 列降序排序

ids_stock.Sort() 数据存储对象用毕之后,需要使用下列 Destroy 语句删除该对象。

DESTROY ids_stock

8.6.2 共享数据窗口

1.理解共享数据函数

(1)PowerBuilder 允许两个或多个 DataWindow 共享相同的数据缓冲区。当 DataWindow 控

件共享时,主 DataWindow 与从 DataWindow 共享一个数据缓冲区。任何从 DataWindow 修改

数据的脚本都将影响主 DataWindow 的数据缓冲区并同时出现在两个 DataWindow 中。

(2)共享的 DataWindow 对它们的数据源必须有相同的结果集,每个数据源要有相同的

域数,相同的域类型和长度,也必须按相同的次序选择域。

(3)建立共享函数 ShareData()。

功能:在主数据窗口控件与从数据窗口控件之间共享数据。这种共享并不共享显示格式,

只是共享数据,包括主缓冲区、删除缓冲区以及过滤缓冲区中的数据,同时也共享排序顺序。

语法结构:dw_primary.ShareData(dw_secondary)

参数:dw_primary 用做主数据窗口的数据窗口控件名。主数据窗口拥有数据,当删除该

数据窗口时,数据也同时消失。dw_primary 可以是某个子数据窗口:dw_secondary 用做从数

据窗口的数据窗口控件名。该数据窗口控件与主数据窗口控件共享数据。从数据窗口不能是

交叉表(Crosstab)风格的数据窗口,但可以是子数据窗口。

返回值:Integer。

函数执行成功时返回 1,发生错误时函数返回-1。如果任何参数的值为 NULL,则

ShareData()函数返回 NULL。

Page 176: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·166·

用法:使用 ShareData()函数时,要求主数据窗口控件与从数据窗口控件中的数据窗口对

象的列必须相同,但各自使用的 SELECT 语句可以不一样。例如,在使用下述 SELECT 语句

的数据窗口对象之间可以共享数据:

例如:在客户信息窗口 w_custom 的 Open 事件中。

dw_1.ShareData(dw_2) //在 dw_1 与 dw_2 之间建立数据共享

dw_1.SetTransObject(sqlca) //设置与数据窗口控件相关联的事务对象

dw_1.retrieve() //让数据窗口控件从数据库中提取数据

dw_1.SetRowFocusIndicator(Hand!) //设置数据窗口控件当前行指示符为手形指针

dw_1.SetFocus() //将焦点设置到指定控件 dw_1 上

(4)停止共享数据 ShareDataOff()。

功能:终止数据窗口控件间的数据共享。

语法结构:dwcontrol.ShareDataOff()

参数:dwcontrol 为数据窗口控件名。

返回值:Integer。

函数执行成功时返回 1,发生错误时函数返回-1。如果任何参数的值为 NULL,则

ShareDataOff()函数返回 NULL。

用法:使用数据窗口控件的 ShareData()函数可以实现在多个数据窗口之间共享数据。当

不再需要数据共享时,使用数据窗口控件的对象函数 ShareDataOff()可终止共享关系。当调用

主数据窗口的 ShareDataOff()函数终止共享时,所有从数据窗口与主数据窗口终止数据共享,

从数据窗口中不再包含与显示数据。如果调用从数据窗口的 ShareDataOff()函数终止共享时,

被调用从数据窗口与主数据窗口之间终止数据共享,而其他从数据窗口与主数据窗口之间依

然保持共享关系。

2.主从关系

(1)一个 DataWindow 用做主界面时通常采用列表格式,从 DataWindow 显示记录的详

细内容。当用户滚动列表从中选择行时,记录的详细内容将显示在从表中。

(2)保持从 DataWindow 的同步。

ScrollToRow()函数的功能是滚动数据窗口控件的显示到指定行,该函数改变当前行但不

改变当前列。

语法结构:dwcontrol.ScrollToRow ( row )

参数:dwcontrol——数据窗口控件名;row——long 类型,指明要滚动到哪一行。如果

row 参数设置为 0,则滚动到第 1 行;如果 row 大于最后一行的行号,则滚动到最后一行。

返回值:Integer。

函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,则 ScrollToRow()

函数返回 NULL。

用法:执行了 ScrollToRow()函数后,指定的行成为新的当前行。如果该行已经显示在数

据窗口中(即用户可以直接看到该行),那么显示行不会发生变化。如果该行不可见,则显

示行向所需方向滚动,以把当前行显示在数据窗口中。

ScrollVertical 事件中的代码如下:

Page 177: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·167·

dw_2.scrolltorow(long (dw_1.object.datawindow.firstrowonpage)) // 垂直滚条改变,long()强制转换

成长整型函数 RowsFocusChanged 事件中的代码如下:

// 行光标改变

if dw_2.getrow()< >currentrow then // currentrow 当前行

dw_2.scrolltorow(currentrow) //滚动 dw_2 的显示到当前行

end if

3.禁止从 DataWindow 滚动

/************************************

* 处理主从数据窗口中的键盘事件 *

************************************/

Choose Case Key

Case KeyEnter!, KeyDownArrow!, KeyUpArrow!, KeyPageDown!, KeyPageUp!

// 数据窗口中的默认行为是接受输入值,所以我们执行了同样的动作

this.AcceptText()

//将“漂浮”在数据窗口控件上编辑框的内容放入到数据窗口控件的当前项中(主缓区中)

Return 1

Case KeyTab!

this.SetRedraw(FALSE) //设置当前数据窗口更新状态为假。

this.Post Function ScrollToRow(this.GetRow())

// GetRow()设置指定行为数据窗口控件的当前行。

if KeyFlags=1 then //Shift-Tab 陷阱并捕获光标回到附窗口

dw_1.SetRedraw(FALSE) //修改属性后不自动重绘该控件。

this.Post Function SetFocus() //将焦点设置到指定控件上。

dw_1.Post Function SetRedraw(TRUE) //每次修改属性后自动重绘该控件。

end if

this.Post Function SetRedraw(TRUE)

End Choose 实例:制作一个入库单查询程序,

界面由两部分组成,左侧为列表形式,

用于浏览导航,右侧为入库单细节。

设计方案:左侧使用列表“Grid”风

格 的 数 据 窗 口 , 右 侧 使 用 自 由 格 式

“Freeform”风格的数据窗口。在左侧数

据窗口中,利用“rowfocuschanged” 事

件获取行号,将此行数据送入右侧数据

窗口。

列表数据窗口如图 8.3 所示,入库单

数据窗口如图 8.4 所示,窗口布局如图

8.5 所示。

图 8.3 列表数据窗口

Page 178: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·168·

图 8.4 入库单数据窗口

图 8.5 入库单查询窗口布局

Page 179: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·169·

添加窗口的 open 事件代码如下:

dw_1.SetTransObject(SQLCA)

dw_1.Retrieve(SQLCA)

dw_2.SetTransObject(SQLCA)

dw_2.Retrieve(SQLCA) dw_1 的 rowfocuschanged 事件代码如下:

integer i

i = dw_1.getrow()

dw_2.setfilter("t_input_batch = ’" + string(dw_1.object.batch[i]) + "’")

dw_2.filter() 运行结果如图 8.6 所示。

图 8.6 入库单查询程序运行结果

本 章 小 结

本章介绍数据窗口的控件,主要介绍如何建立数据窗口控件与数据窗口对象的连接、数

据窗口控件与数据库、数据窗口项的引用,以及与数据窗口有关的函数和数据窗口事件。熟

练掌握本章内容,对掌握 PowerBuilder 编程至关重要。

练 习

1.数据窗口对象与数据窗口控件有何不同?各自的作用是什么?

2.数据窗口控件是如何实现将数据库中的数据在应用程序窗口中展现出来的?在实现过程

中,需要哪些设置和关联?

3.在 PowerBuilder 中,数据窗口的数据处理机制是怎样的?有几个数据缓冲区?各个缓

Page 180: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·170·

冲区的作用是什么?

4.试述使用数据窗口控件的基本过程。

5.什么是事务对象?为什么要使用事务对象?

6.怎样使数据窗口控件与数据窗口对象相关联?怎样为数据窗口控件分配事务对象?

7.获取数据窗口指定字段的字符型、数值型和小数型数据分别应当使用什么函数?函数

的参数是什么?

8.SetTransObject 函数和 SetTrans 函数的作用是什么?二者有什么区别?

9.当运行应用程序时,在数据窗口上修改了一个数据,没有进行其他操作,然后退出了

应用程序,这时数据库中的数据是否已经被修改了?为什么?

Page 181: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·171·

第 9 章 自定义对象

前面章节介绍了事务对象、Error 对象、按钮、各种各样的列表框、数据窗口控件等各类

部件,并在其上定义了很多的函数和事件,如窗口的打开、关闭函数、按钮的单击事件等,

这些函数、事件和对象都是 PowerBuilder 预先定义好的,通过把这些函数、事件和对象有机

地结合起来就构成了应用程序的基本框架。虽然这些函数、事件和对象的功能十分强大,但

它们也不能满足应用程序的所有要求。例如,希望 Error 对象能够返回汉字的出错提示;应用

程序需要在多个地方使用功能相似的一组控件和函数,而又不希望在多处重复编写相同的代

码;应用程序的某部分要求有很高的运行速度等。解决这些问题的一个有效途径就是使用用

户自定义的函数、事件和对象。

9.1 自定义函数和结构

PowerBuilder 有数百个预先定义好的函数,给系统的开发带来很大的方便,即使如此,

仍不能完全满足用户的需要。因此在编程的过程中,需要按照应用程序的需要设计自己的函

数。

PowerBuilder 函数分为两类:全局函数和对象函数。全局函数面向整个应用程序,创建

后可以在整个应用程序中使用,它不依附于对象;对象函数依附于某个对象,在对象的使用

过程中创建,对象函数创建后,一般情况下只能在本对象中使用,但若把它的存取属性设定

为公共的,即可在整个应用程序中使用。

9.1.1 创建自定义全局函数

在 PowerBuilder 主窗口中,单击“New”按钮,打开“New ”对话框,在“PB Object”

选项卡中,通过双击“Function”图标,进入全局函数定义画板,如图 9.1 所示。全局函数定

义画板分为两个区域,上边为属性区,下边为代码区。

函数的定义包括函数名、参数及返回值,定义方法如下。

(1)在“Function Name”项中输入函数名,一般情况下使用 f_ 作为前缀。

(2)在“Return Type”项中选择返回值类型,它是一个下拉选择框,列出了各种数据类

型,其中包括 PowerBuilder 对象。

(3)在“Argument Name”项中输入参数名。

(4)在“Argument Type”项中选择参数数据类型,它同返回值类型一样是一个下拉选择

框。

(5)在“Pass By”项中选择参数的传递方式,它包括下列 3 种方式。

① Value:值传递,将实际参数的值赋给函数参数。

② Reference:地址传递,将实际参数的地址传递给函数参数,若在函数中修改了参数的

值,实际参数的值也将被修改。

Page 182: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·172·

③ Readonly:只读地址传递,将实际参数的地址传递给函数参数,但在函数中不允许修

改参数的值。

属性区

代码区

属性区显示/

隐藏按钮

图 9.1 全局函数定义画板

如果想增加参数,用鼠标右键单击属性区,弹出菜单,如图 9.2

所示;选择“add Parameter”项,在属性区就会增加一个参数定义行。

此外,还有一个“Access”项,表示存取属性,它的默认值为

“public”,作为全局函数不允许改变。

属性定义好以后,就可以在代码区编辑代码了,如果觉得代码

区太小,就可以单击如图 9.1 所示的“属性区显示/隐藏按钮”,即

可关闭属性区。

代码编辑完毕,保存后就完成了全局函数的定义。定义好的函数就可以在应用程序中使

用了。

9.1.2 修改自定义全局函数

如果想修改创建好的全局自定义函数,可以在 PowerBuilder 主窗口中,单击“Open”按

钮,弹出“Open”对话框,如图 9.3 所示;在“Objects of Type”项选择“Function”即可列

出自定义全局函数对象列表,选择要修改的函数,单击“OK”按钮,进入函数画板,按需要

修改函数。

此外,也可在工作空间的系统树(System tree)上找到要修改的函数,双击此函数项进

入函数画板,修改函数。

9.1.3 删除自定义全局函数

删除自定义函数的方法:在工作空间的系统树(System tree)上找到要删除的函数,用

鼠标右键单击此函数项弹出菜单,如图 9.4 所示;选择“Delete”项单击,弹出“Library”对

话框,单击“是”按钮,即可删除此函数。注意,删除此函数前一定要关闭此函数。

图 9.2 参数菜单

Page 183: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·173·

选择 PB 对象

图 9.3 “Open”对话框

图 9.4 删除函数

9.1.4 创建、修改和删除自定义对象函数

除了可以创建全局函数外,PowerBuilder 还可以为对象创建函数,即对象函数。

Page 184: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·174·

对象函数一般情况下只能在该对象内使用,但若其 “Access” 属性取值为“public”时,

可供应用程序中的其他对象使用。创建对象函数的方法如下。

先打开要定义函数的对象,然后打开“Script”编辑区,选择下拉列表框“Function”中

的“New Function”选项,如图 9.5 所示;打开与全局函数定义画板几乎一样的对象定义画板,

只是其中的“Access”属性取值是可改变的下拉列表框,其取值有 3 个选项,分别为:

� public:公共的,可供全局使用;

� private:私有的,只能在该对象内使用,并且不能被继承了该对象的对象使用;

� protected:继承的,只能在该对象和继承了该对象的对象内使用。

图 9.5 定义对象函数

对象函数的命名一般以“af_”为前缀。

修改对象函数的方法非常简单,只要在对象的“Script”编辑区,选择下拉列表框“Function”

中要修改的函数就可以了。

修改对象函数时,在“Function List”中用鼠标右键单击要删除的函数,在弹出的菜单中

选择“Delete”项即可删除此函数。

9.1.5 创建、修改和删除结构体

结构体是一组相关的同类型或者不同类型的变量集合。结构体分为全局结构体和对象层

结构体两种。

全局结构体不和任何对象相联系,可以在应用的任何位置声明该结构体的变量或直接引

用。可以将一些相互关联,密不可分的全局变量放在全局结构体中来使用。定义全局结构体

方法如下。

单击“New”按钮,弹出“New”对话框,选择 PBObject 选项卡,即可看见结构体图标

,双击该图标,打开全局结构体定义画板,如图 9.6 所示。

在全局结构体定义画板中的“Type”项中输入成员变量的数据类型,它是一个下拉列表

框,可以是 PowerBuilder 各种数据类型和对象类型;在“Variable Name”项中输入成员变量

的名称。当输入成员变量名称的同时,画板会自动增加一行,若要删除一行,用鼠标右键单

击要删除的行,在弹出的菜单中选择“Delete”项即可。

定义好结构中的各成员变量后,单击画笔工具栏上的“close”按钮,系统会询问是否保

存,选择“是”按钮,出现一个保存结构体的对话框,如图 9.7 所示。

在 Structure 编辑框中输入新结构名称,一般以“s_”作为前缀;在 Comment 编辑框中写

Page 185: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·175·

入说明文字,然后单击“OK”按钮完成新结构的定义。

图 9.6 全局结构体定义画板 图 9.7 “保存结构体”对话框

1.对象层结构体

对象层结构体与窗口、菜单、用户对象等相关联,并在这些对象本身的脚本中使用。当

然,通过声明结构体的访问权限也可以使其他脚本访问这些对象层的结构体。对于那些只在

特定对象中使用的结构体比较适宜采用此种类型,以避免资源的浪费。

定义对象层结构体应先打开预定义结构的对象,然后选择“Insert”菜单中的“Structure”

项;在相应的对象画板中出现对象层结构体定义画板,对象层结构体定义画板几乎与全局结

构体定义画板相同,只是多了一个“Struture Name”编辑框,在此输入结构名称。定义完结

构体后,需要和对象一起保存,不能单独保存结构体。

2.使用结构体

定义结构体,相当于定义一种数据类型。使用结构体,就是把它当做一种数据类型来使

用,用它来声明变量。引用方法如同 C 语言,语法为:结构体名.成员名。

3.删除结构体

删除全局结构体,需要打开 Library 库管理器,找到要删除的结构体,单击鼠标右键,在

弹出的菜单上选择“Delete”项即可删除此结构体。

删除对象层结构体,需要打开结构体所在的对象,在“View” 菜单中选择“Structure List”

项,即可在相应的对象画板中出现对象层结构体列表,找到要删除的结构体,单击鼠标右键,

在弹出的菜单上选择“Delete”项即可删除此结构体。

9.2 用户事件

PowerBuilder 的窗口、控件、用户对象等都有一组系统预先定义好的事件,打开与前面

Page 186: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·176·

所述的某对象相关联的代码编辑器后,在事件列表框中就会看到这组事件。

一般来说,这些系统预定义事件能够满足应用程序的大多数需求。然而,有时候应用程

序需要某种特殊控制,有时候应用程序需要在特定情况下执行某段代码,有时候应用程序中

的对象间需要灵活的通信,此时,开发人员可以根据需要为对象定义自己的事件,这类事件

称做用户事件。在下列情况下经常使用用户事件。

(1)解决用户对象与窗口之间的通信问题。用户事件可以通过参数进行信息传递。

(2)响应特殊操作,这些操作没有相应的 PowerBuilder 预定义事件。例如,希望用户按

下 Enter 键后将输入焦点从一个单行编辑框移动到下一个单行编辑框(正常情况下需要按 Tab

键);再如,在数据窗口控件中,当用户将输入焦点定位在最后一行后,再按↓键或 Enter

键时插入一个空行等。

(3)支持用户通过多种方式完成同一个功能。例如,在更新数据库时,应用程序既允许

用户通过单击窗口上的按钮完成,也允许用户通过选择菜单项完成。使用用户事件后,就只

需要在一个地方编写代码,在需要使用该功能的地方触发相应的用户事件就可以了。

用户事件在许多地方与用户定义函数十分相似,用户事件运用的灵活程度很大程度上反

映出应用程序的灵活性和适应性。

9.2.1 定义用户事件

为窗口、控件、用户对象定义用户事件的方法都是一样的,步骤如下。

(1)用窗口画板或用户对象画板打开要定义用户事件的窗口或用户对象。

(2)通过单击选择要定义用户事件的窗口、控件或用户对象,从“Insert”菜单中选

择“Event”菜单项,系统打开“Events”选项卡。

(3)在事件列表框“Event Name”中输入用户事件名,该名称将会出现在该对象的代码

编辑器的事件列表中。一般来说,事件名应该以 ue_开头。

(4)如果用户事件对应于某个 Windows 消息(如按键事件 pbm_dwnkey),那么既可以

在该行“Event ID”列的编辑框中输入事件标识,也可以在“PasteEvent ID”列表框中单击相

应的 PowerBuilder 预定义事件。

(5)如果用户事件不对应于任何 Windows 消息,那么可以选择一个 PowerBuilder 定制事

件(Pbm_custom01 至 Pbm_custom75),也可以让“Event ID”列的编辑框空着,然后关闭。

常用的用户事件如表 9.1 所示。

表 9.1 常用的用户事件

事 件 号 含 义

Pbm_bmgetcheck 单选按钮或多选按钮是否被选

Pbm_bmgetstate 按钮是否加亮

Pbm_bnclicked 按钮控件被点中

Pbm_bndisable 使按钮控件无效

Pbm_bndoubleclicked 按钮控件被双击

Pbm_bndragdrop 一个对象被放到按钮控件

Pbm_bndragenter 一个对象被拖到按钮控件

Pbm_bndragleave 一个对象被拖离按钮控件

Page 187: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·177·

续表

事 件 号 含 义

Pbm_bndragover 一个对象被拖经按钮控件

Pbm_bnsetfocus 按钮控件将获得聚焦

Pbm_cbndblclk 用户在列表中某一项上双击

Pbm_cbndropdown 列表框的下放区域即将被显示

Pbm_cbneditchange 编辑器控件中的文本发生变化

Pbm_cbneditupdate 列表框编辑器控件中的文本即将被改变

Pbm_cbnerrspace 列表框满,不能再向其中加入项

Pbm_cbnkillfocus 通用列表框失去焦点

Pbm_cbnselchange 列表框中被选文本被改变

Pbm_cbnselendcancel 用户单击“取消”按钮

Pbm_cbnselenok 用户单击“确认”按钮

Pbm_cbnsetfocus 通用对话控件拥有焦点

Pbm_dwclosedropdown 关闭下拉式数据窗口

Pbm_dwnbacktabout 即将通过 Shift+Tab 组合键离开该控件

Pbm_dwndropdown 下拉式列表框的下拉部分即将可见

Pbm_dwnitemchangefocus 数据窗口控件中当前项的焦点改变

Pbm_dwintemvalidationerror 对当前项的修改引起了一个合法性检查错误

Pbm_dwnkey 有键被按下。使用函数 keydown ()处理键盘值

Pbm_dwnlbuttondown 鼠标左键被按下

Pbm_dwnltuttonup 鼠标左键被松开

Pbm_dwnmbuttonclk 鼠标中键单击

Pbm_dwnmbuttondbclk 鼠标中键双击

Pbm_dwnmousemove 鼠标移动

Pbm_dwnprocessenter 回车键被按下

Pbm_dwnrowchange 数据窗口中焦点从一行转向另一行

Pbm_dwntabdownout 用户在数据窗口最后一行按下了下箭头键

Pbm_dwntabout 用户在数据窗口的最后一行/列中按下了 Tab 键

Pbm_dwntabupout 用户在数据窗口的第一行中按下了上箭头键

Pbm_dwscrollend 在数据窗口中卷滚到最后一行

Pbm_dwscrdlhome 在数据窗口中卷滚到第一行

Pbm_dwscrolllineend 卷滚到当前行的行尾(水平方向)

Pbm_dwscrolllinehome 卷滚到当前行的行首(水平方向)

Pbm_ddeddeack 收到一个 DDE 消息

Pbm_ddeddeinitiate 开始一个 DDE 会话

Pbm_ddeddeterminate 终止一个 DDE 会话

Pbm_em emptyundobuffer 清空由 windows 管理的取消操作的缓冲区

Pbm_emlinescrool 水平或垂直卷滚编辑器控件

Page 188: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·178·

续表

事 件 号 含 义

Pbm_emreplacesel 从剪切板或从键盘用新文本替换被选文本

Pbm_emundo 撤销最近的编辑操作

Pbm_enchange 编辑器中的文本发生改变

Pbm_enerrspace 编辑器控件内存缓冲区溢出

Pbm_enhscroll 用户点中上水平卷滚条

Pbm_enmaxtext 用户试图输入比所允许的更多的文本

Pbm_envscroll 用户点中了垂直卷滚条

Pbm_lbaddstring 向列表框中的控件中增加一项或一个字符串

Pbm_lbdeletestring 从列表框中删除一项或一个字符串

Pbm_lbdir 用目录列表填充列表框

Pbm_lbfindstring 在列表框中搜索与所给字符串部分匹配的第一项

Pbm_lefindstringgexact 在列表框中搜索与所给字符串精确匹配的第一项

Pbm_lbinsertstring 向列表框中加入一个新字符串

Pbm_lbresetcontent 重置(消除)列表框中的内容

Pbm_lbsetcaretindex 设置列表框中的某一项拥有焦点

Pbm_lbsetsel 在列表框中选择一个字符串

Pbm_lbresetcontent 重置(消除)列表框中的内容

Pbm_lbsetcareindex 设置列表框中的某一项拥有焦点

Pbm_lbsetsel 在列表框中选择一个字符串

Pbm_lbsettopindex 卷滚列表框使特定的项成为可见的最上面一项

Pbm_lbdbclk 用户在列表框控件中的某一项上双击

Pbm_lbrrspace 用户试图超越可在列表框中输入字符的最大限制

Pbm_lbselcancel 当前选取文本被取消

Pbm_lbselchange 用户在列表框中选择或取消了一项

Pbm_activateapp 被激活的窗口属于另外一个应用

Pbm_char 传送键盘上按下的键

Pbm_chartoitem 通过转换键盘来的字符,帮助列表框定位其中的项

Pbm_childactivate 一个子窗口被移动或激活

Pbm_clear 用户要删除当前编辑器控件中的内容

Pbm_command 用户选择了一个菜单项、控件或使用了加速键

Pbm_compacting 系统内存资源不足;当 windows 占用了多于 1/8 的 CPU 时间紧缩内存时,

产生这条消息

Pbm_fontchange 应用可用的字体数改变

Pbm_initdialog 一个对话框即将被显示

Pbm_initmenu 一个菜单即将被显示

Pbm_initmenupopup 一个弹出式窗口即将被显示

Pbm_keydown 键盘上的一个键被按下

Page 189: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·179·

续表

事 件 号 含 义

Pbm_keyup 键盘上的一个键被释放

Pbm_mdiactive 一个 MDI 子窗口(表单)被激活

Pbm_mdicascade 以重叠的形式重排所有的表单

Pbm_mdicreate 创建一个表单

Pbm_mdidestroy 从 MDI 框架中移去一个表单

Pbm_mdgetactive 获得当前活动的 MDI 表单的句柄

Pbm_mdiiconrange 在一个 MDI 框架中重排最小化表单的图标

Pbm_mdimaximize 最大化一个 MDI 子表单

Pbm_mdinext 激活下一个 MDI 表单(紧接着活动表单的表单)

Pbm_mdirestore 把 MDI 表单恢复到它原来的大小

Pbm_mdisetmenu 将一个菜单与一个 MDI 表单联系起来

Pbm_mdifitle 平铺所有的 MDI 表单

Pbm_menuselect 用户选择了一个菜单项

Pbm_mouseactivate 用户在一个非活动窗口中单击了鼠标

Pbm_mousemove 用户移动了鼠标

Pbm_nclbuttondblclk 用户在非客户区双击了鼠标左键

Pbm_queryendsession 通知消息,说明窗口即将被关闭

Pbm_spoolerstatus 一个打印管理器任务被添加或删除

Pbm_syschar Alt 键和其他某键同时被按下

Pbm_syscolorchange 一种或多种系统颜色被改变

Pbm_syscommand 用户选择了一个系统菜单命令

Pbm_syskeydown 用户按下某键的同时按下了 Alt 键

Pbm_syskeyup 用户释放了 Alt 组合键

Pbm_timechange 系统时钟被修改

Pbm_vscroll 用户单击了垂直卷滚动条

Pbm_windowposchanged 窗口位置发生了改变

Pbm_windowposchanging 窗口位置即将发生改变

9.2.2 用户事件讨论

定义用户事件时,有几个问题需要注意,下面分别予以讨论。

1.理解事件标识

事件标识(Event ID)是系统预先定义的标识符,它对应于某个事件。PowerBuilder 使用

以 Pbm_为前缀的事件标识,每个事件标识都对应于特定的 Windows 消息。PowerBuilder 的

任何手册中都没有提供两者之间的对应关系,但可以从两者名字相似的后半部分推断其对应

关系。

例如,Pbm_mousemove 对应于 Windows 消息 wm_mousemove,Pbm_keydown 对应于

Page 190: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·180·

Windows 消息 wm_keydown。

当 PowerBuilder 事件对应于某个 Windows 消息时,系统会在消息产生时触发相应事件。

除此之外,也可以定义 Windows 系统不会自动触发的事件,这些事件只能通过代码来触发。

此时,可以在选择用户事件时选择 Pbm_custom01 至 Pbm_custom75 之间的定制事件。

2.创建自定制事件

当需要定义只能由代码触发的用户事件时,在“Event Name”列输入事件名后,在“Event

ID”下拉列表框中选择 None,这样就定义了自定制事件。此时,可以为用户事件定义参数。

对于事件参数的修改、删除和添加可以通过快捷菜单来完成。

9.2.3 使用用户事件

定义了用户事件后,还需要完成下述工作才能使用用户事件。

(1)编写用户事件的事件处理程序,没有事件处理程序时,即使发生了该事件,应用程

序也不作任何处理。

(2)必要时编写触发用户事件的代码。如果用户事件对应于某个 Windows 消息(如事件

标识为 Pbm_mousemove 的用户事件 ue_mousemove 对应于 Windows 消息 wm_mousemove),

那么当相应动作在应用程序上发生时,该事件将被自动触发。

如果用户事件不对应于任何 Windows 消息(也就是说事件标识为空或 Pbm_custom01 至

Pbm_custom75),那么必须使用代码触发该事件。

用代码触发事件时,可以使用函数 TriggerEvent()或 PostEvent (),也可以使用下述语句:

objectname. { Trigger|Post} { Static|Dynamic }EVENT EventName( { argumentlist } )

其中:

(1)objectname 是事件所属对象的对象名。

(2)Trigger 选项和 Post 选项只能选择一个,默认时为 Trigger。Trigger 表示立即执行指

定事件的事件处理程序,然后再执行该语句后面的代码;Post 表示将该事件放置到对象的事

件队列中,然后继续执行该语句后面的代码,至于发出去的事件的事件处理程序何时执行,

由操作系统决定。

(3)Static 选项和 Dynamic 选项只能选择一个,默认时为 Static。Static 表示编译时指定

事件必须存在,系统要进行返回值类型检查;Dynamic 表示编译时指定事件可以不存在,系

统把返回值类型检查推迟到应用程序运行时进行。

(4)EVENT 是关键字,表示后面的 EventName 是事件名而不是函数。

(5)argumentlist 是事件参数列表,多个参数时参数之间用逗号分隔。上述语法格式中,

{ Trigger|Post},{ Static|Dynamic }和 EVENT 的先后次序可任意放置,大括号表示该成分可以

省略。如果已经为用户事件定义了参数(使用 9.2.2 节“创建自定制事件”的方法),此时,

就只能使用上述语法触发事件了,而不能使用函数 TriggerEvent()或 PostEvent ()。

【例 1】 下面的语句在编译时不进行类型检查,它调用一个事件。

object.EVENT DYNAMIC EventName( )

【例 2】 下面的语句在编译时进行类型检查,它调用一个事件。

Page 191: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·181·

int li_int

li_int = object.EVENT Static EventName( )

9.3 用户对象

用户对象是拓展 PowerBuilder 功能的最灵活的对象之一。利用用户对象,用户既可以扩

展系统原有对象的功能,增加新的使用方法,又能够创建出高度可重用的自定义部件,在一

个或多个应用程序中反复使用,缩减开发和维护时间,进一步提高应用程序的开发效率。同

时,程序对速度敏感的部分可以用 C++进行开发,然后将其嵌入到 PowerBuilder 应用程序中。

9.3.1 用户对象分类

PowerBuilder 的用户对象分为 2 类 6 种:可视用户对象类似按钮、编辑框,具备可视的

外观,主要完成应用程序与用户之间的信息交流;类用户对象没有屏幕表现形式,它们主要

用于封装和完成一定的业务逻辑。每类用户对象均有 3 种不同的形式,解决应用程序的不同

需求。

用户对象是封装了一组相关代码和属性,完成特定功能的对象。用户对象一般用于完成

通用的功能。例如,应用程序可能经常使用某个“关闭”按钮执行一组操作,之后关闭窗口;

也可能经常使用某个列表框列出所有的部门;还可能对所有的数据窗口控件使用相同的错误

类型检查;或许开发人员还想制作一个文件浏览器,在需要时插入多个窗口中。

无论什么时候,应用程序需要某种反复使用的特性时,都应该定义一个用户对象。用户

对象只需要定义一次,就能够反复多次使用;并且修改一次,就能把修改结果反映到所有使

用该用户对象的地方。

1.可视用户对象

可视用户对象(Visual User Object)是一个可重用控件或一组完成一定功能的控件。例

如,可视用户对象可以由作为一个整体使用的几个按钮组成,每个按钮都可以有自己的事件

处理程序,完成标准的处理功能。当这个用户对象定义之后,在应用程序需要这种用户对象

的地方就可以反复使用它了。可视用户对象有如下 3 种类型。

(1)标准可视用户对象(Standard Visual User Object)。标准可视用户对象是对

PowerBuilder 现有控件的扩充,它在现有控件基本功能的基础上增加应用程序需要的功能。

标准可视用户对象继承了原始控件的各种特征,包括属性、事件和函数。

(2)定制可视用户对象(Custom Visual User Object)。定制可视用户对象将多个控件以

及可视用户对象组合成一个整体,完成一定的功能和操作。

(3)外部可视用户对象(External Visual User Object)。外部可视用户对象实际上就是在

PowerBuilder 应用程序中使用其他语言。

2.类用户对象

类用户对象(Class User Object)没有可视成分,它通常用于封装应用逻辑和特定功能。

类用户对象有如下 3 种类型。

(1)标准类用户对象。标准类用户对象继承 PowerBuilder 内置非可视对象(如事务对象

Page 192: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·182·

或 Error 对象)的定义,开发人员通过编写代码扩展出新的功能,以满足应用程序的特殊需求。

(2)定制类用户对象。定制类用户对象用于封装不需要可视特性的处理过程。这些对象

并不继承某个 PowerBuilder 对象,完全由设计人员通过定义实例变量、函数、事件来实现。

定制类用户对象只有两个系统预定义事件:Constructor 事件和 Destructor 事件。

(3)C++类用户对象。C++类用户对象使用户能够编写对处理速度要求很高的函数。通过

把这些函数组合成动态链接库,置入 PowerBuilder 后,应用程序中就可以像使用其他类用户

对象那样使用 C++类用户对象了。C++类用户对象在提供快速运行的同时,也能够访问大量

现成的 C++代码库。惟一缺陷是开发人员必须熟悉 C++,并了解对参数类型方面的多种限制。

9.3.2 创建用户对象

任何一种用户对象都由用户对象画板创建,当然由于用户对象类型的不同,画板的表现

形式也有所不同。

� 可视用户对象画板中可以打开 Layout(布局)视图区和 Control List(控件列表)视

图区,而类用户对象画板则没有这两个与可视对象相关的视图区。

� 标准可视用户对象和标准类用户对象,在开始创建之前可分别选择一种标准的可视控

件和一种标准的类对象。而创建非标准用户对象则可以直接打开用户对象画板。

要创建用户对象,首先单击 PowerBuilder 主工具栏 PowerBar1 上的“New”按钮,打开

“New”对话框,并激活“ PB Object”选项卡;在该选项卡上列出了当前可创建的所有

PowerBuilder 对象,其中第 1 行全部是用户对象,共 5 种,而没有 C++类用户对象,这是由

于 C++类用户对象只有在安装了 C++ Class Builder 的企业版中才能创建。双击要创建的用户

对象类型即可开始用户对象的创建。

创建用户对象的目的当然是使用它们。可视用户对象可作为控件添加到窗口中,而类用

户对象可用于声明变量的 PowerScript 语句中。

9.3.3 创建标准可视用户对象

在“New ”对话框之“PB Object”选项卡中,双击“Standard Visual”图标,将打开“Select

Standard Visual Type”对话框,如图 9.8 所示。从该对话框的“Types”列表中选择一种标准

系统可视控件即打开用户对象画板,开始可视标准可视用户对象的创建。

要建立标准可视用户对象,继续下列操作:

(1)通过单击,选择要用来建立标准可视用户对象

的 PowerBuilder 控件类型,新建用户对象将继承所选

PowerBuilder 控件的属性、事件、和函数。

(2)单击“OK”按钮,进入用户对象画板工作区,

相应控件显示在工作区中。

(3)在用户对象画板工作区中可以通过拖曳改变标

准可视用户对象的大小,也可以通过双击打开该对象的

属性对话框,之后修改或浏览相应属性。

(4)根据需要在脚本画板中说明用户对象所需的变

量、函数、结构以及用户事件。

(5)右击用户对象,从弹出的菜单中选择“Script”

图 9.8 选择标准可视对象

Page 193: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·183·

菜单项,打开脚本编辑器,编写所需要的事件处理程序。

(6)从“File”菜单中选择“Save”菜单项,保存用户对象。

定义了标准可视用户对象后,就可以在窗口画板、定制可视用户对象等多个地方运用它

了。此时,完全可以把它当成一个新的 PowerBuilder 标准控件。

9.3.4 创建定制可视用户对象

在“New”对话框之“PB Object”选项卡中,双击“Custom Visual”图标,则 PowerBuilder

将创建定制可视用户对象(Custom Visual User Object);单击“OK”按钮,进入用户对象画

板。该画板与窗口画板的十分相似,其中 Layout 视图区左上角的空框用于定制可视用户对象,

在它的上面可以像窗口画板中放置控件那样放置用户对象中要包含的控件。

进一步的操作如下:

(1)在定制可视用户对象中放置所需控件。

(2)修改各控件属性。

(3)根据需要在“Declare”菜单中选择相应的菜单项,说明用户对象所需的变量、函数、

结构以及用户事件。

(4)右击用户对象,从弹出的菜单中选择“Script”菜单项,打开脚本编辑器,编写所

需要的事件处理程序。当然,通常也需要为放置在用户对象中的控件编写相应的事件处理

程序。

(5)从“File”菜单中选择“Save”菜单项,保存用户对象。定制可视用户对象的定义过

程与创建窗口的过程十分相似,可参考前面章节介绍的窗口定义方法及控件使用方法。

标准可视用户对象的定制与可视用户对象的区别主要在于:前者只能继承一种标准可视

控件,可以认为创建标准可视用户对象是对标准控件特性及功能的扩展;而后者则是将多种

标准控件集成到一个用户对象中,可以将定制用户对象看做标准控件的再封装。显然,定制

可视用户对象可实现标准可视用户对象的功能。

9.3.5 创建外部可视用户对象

在“New”对话框之“PB Object”选项卡中,双击“External Visual”图标,则 Power

Builder 将创建定制可视用户对象(Custom Visual User Object);单击“OK”按钮,系统

显示“User Object”对话框。

进一步的操作如下:

(1)在“DLL Name”编辑框中键入用做外部用户对象的 DLL 文件名,或者单击

“Browse⋯”按钮,从系统打开的“Select Custom Control DLL”对话框中选择 DLL 文件。

(2)在“Class Name”编辑框中键入 DLL 中的注册类名(该类名通常由生产 DLL 的厂

商提供)。

(3)在“Text”编辑框中输入显示在控件上的文本(并非所有的 DLL 都需要此项)。

(4)根据需要设置其他属性(如边框类型等)。

(5)单击“OK”按钮,所选对象显示在用户画板工作区中。

(6)说明用户对象所需的函数、事件、变量、结构。

(7)编写用户对象的各种事件处理程序。

(8)从“File”菜单中选择“Save”菜单项,保存用户对象。

Page 194: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·184·

定义了外部可视用户对象后,就可以在窗口画板、定制可视用户对象等多个地方运用该

对象了。

9.3.6 创建定制类用户对象

在“New”对话框之“PB Object”选项卡中,双击“Standard Class”图标,将打开“Select

Standard Class Types”对话框;从该对话框的 Types 列表中选择要创建的用户对象所继承的内

部系统对象,然后单击“OK”按钮,即可打开用户对象画板,开始标准类对象的创建。

进一步的定义步骤如下:

(1)说明用户对象所需的函数、事件、变量、结构。

(2)编写用户对象所需的各种事件处理程序。

(3)从“File”菜单中选择“Save”菜单项,保存用户对象。

定义了定制类用户对象后,就可以在应用程序需要的地方运用该对象了。

9.3.7 创建标准类用户对象

在“New”对话框之“PB Object”选项卡中,双击“Custom Class”图标,则 PowerBuilder

将创建定制可视用户对象(Custom Visual User Object),单击“OK”按钮,打开用户对象画

板。

进一步的操作如下:

(1)声明用户对象所需的函数、事件、变量、结构。

(2)编写用户对象所需的各种事件处理程序。

(3)从“File”菜单中选择“Save”菜单项,保存用户对象。

定义了标准类用户对象后,就可以在应用程序需要的地方运用该对象了。

9.3.8 使用用户对象

创建了用户对象后,在应用程序中就可以随时使用它们了。可视用户对象在使用前需要

放置到窗口或其他定制可视用户对象上,类用户对象则需要在代码中通过编写程序来使用。

1.可视用户对象的使用

通过把可视用户对象放置到窗口或其他定制可视用户对象上来使用这些对象。下面以把

可视用户对象放置到窗口上为例说明放置步骤,把可视用户对象放置到定制可视用户对象上

的过程与此相似,可参照操作。

(1)在窗口画板中打开要放置可视用户对象的窗口。

(2)从窗口画板控件图标列表中选择用户对象图标,系统打开 “Select Object”对话框。

(3)选择要使用的用户对象,单击“OK”按钮,关闭对话框。

(4)在窗口上要放置用户对象的地方单击,所选用户对象即出现在窗口上。

在窗口或定制可视用户对象上放置了可视用户对象后,可以像运用标准控件那样为它命

名、调整大小、调整位置、编写事件处理程序等。

需要注意的是,在窗口画板中不能直接修改所使用的用户对象。需要修改时,关闭窗口

画板,然后使用用户对象画板进行修改。

在代码中可以使用 PowerScript 函数 OpenUserObject()或 OpenUserObjectWithParm()动态

Page 195: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·185·

地往窗口上添加用户对象,用毕后使用 CloseUserObject()函数将其删除。

2.类用户对象的使用

类用户对象没有可视成分,它们不能像可视用户对象那样放置到窗口上。使用类用户对

象时,需要在代码中创建它的一个实例,步骤如下。

(1)声明类用户对象类型的变量,用 CREATE 语句创建该对象的一个实例。

(2)声明类用户对象的实例变量后,在变量的整个作用域中,代码都能访问该对象的属

性、事件、函数,引用方法依然使用点操作符(.),就像使用系统预定义对象那样(如事务

对象)。

(3)不再使用该用户对象时,使用 DESTROY 语句删除该对象,以释放它所占有的内存。

例如,已经创建的一个标准类用户对象 u_ds,它从数据存储对象继承得到。那么,代码

中可以这样使用 u_ds:

u_ds l_ds_delete //说明 u_ds 类型的变量

l_ds_delete = CREATE u_ds //创建用户对象实例

l_ds_delete.DataObject = ’d_user_delete’ //将数据窗口对象与类用户对象联系起来

l_ds_delete.SetTransObject(SQLCA) //设置类用户对象使用的事务对象

li_cnt = l_ds_delete.Retrieve(lstr_data.name) //检索数据

⋯⋯

//应用程序所需的其他处理

DESTROY l_ds_delete //用毕后删除用户对象

本 章 小 结

本章主要介绍自定义函数、结构、事件和对象。这些内容可以提高代码的重用性,也可

以使程序设计更加细化,体现了 PowerBuilder 的强大功能。学习本章,首先应掌握其中的概

念,重点学习事件及函数的使用,提高编程水平。

练 习

1.什么是全局函数及对象函数?它们的区别是什么?

2.定义一个全局的学生结构体,包括以下项目:

学号 字符串类型

姓名 字符串类型

性别 字符串类型

出生日期 日期类型

身高 数值类型

3.给出几个常用的 Windows 消息及其相应的事件标识。

4.用户对象有哪几种?如何创建与使用?

5.为什么要使用用户对象?

6.仿照第 8 章实例三列表风格数据窗口,将商品表中的商品编码和商品名称列在数据窗

口上;编制“rowfocuschanged”事件,将其存为定制可视用户对象。

Page 196: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·186·

第 10 章 数 据 管 道

在移动计算日益普及的今天,将服务器中的部分数据下载到本地机或将本地机中的数据

上载到服务器已经成为应用程序的普遍要求。应用程序不应该忽视用户的这类需求,

PowerBuilder 的数据管道正是完成数据迁移的有效工具。

通过数据管道(Data Pipeline),应用程序能够在不同的数据库表之间移动数据,也就是

说,可以把一个或多个源表中的数据复制到新表或已存在的目的表中。复制的方式根据应用

程序的需要而定,可以删除目的表及其数据后重建目的表,也可以只把最新数据传送到目的

表中。

而且,上述的数据迁移既可以在同一个数据库的不同表之间进行,也能够在同一个数据

库管理系统的不同数据库之间进行,当然,需要时也完全可以在不同数据库管理系统的不同

数据库之间进行。除了迁移常规数据(如数值型、字符型等数据)外,数据管道还可以在数

据库之间迁移图像、声音之类的大二进制对象(Blob 型数据)。

PowerBuilder 的数据管道有两种使用方式:一是在数据管道画板中定义了数据管道后直

接运行数据管道,这种方式方便了开发人员开发和测试应用程序。例如,开发人员可以把服

务器中的数据下载到本地机,然后就不依赖于服务器而进行前期开发工作。二是在应用程序

中通过编写代码使用数据管道,这种方式提供了灵活运用数据管道的手段。

数据管道提供了在数据库内部、数据库之间,甚至不同的数据库管理系统之间快速复制

数据的简便途径。例如:

(1)把一个或多个表中的数据灌入到相同 DBMS 或不同 DBMS 的一个表中。

(2)把整个表一次性地复制到另一个数据库中。

(3)复制表结构。

(4)将网络数据库服务器上的数据复制到本地的 SQL Anywhere 数据库中。

(5)提供了在修改表结构的同时保留表中数据的另一种手段。

10.1 数据管道的概念

数据管道提供了在数据库内部、数据库之间,甚至不同的数据库管理系统之间快速复制

数据的简便途径。利用数据管道复制数据的过程称为灌入数据(Piping Data)。数据管道可

以完成普通方法难以完成的任务,例如:

� 把一个或多个表中的数据灌入到相同 DBMS 或不同 DBMS 的一个表中。例如,它可

以把 Oracle 数据库实例 OO 的一个或多个表中的数据复制到 Oracle 数据库另一个实

例 OR 的一个表中,也能够将这些数据灌入到 Sybase 数据库中。而且,在复制数据

时,数据管道可以把表的属性一起复制。

� 把整个表一次性地复制到另一个数据库中,当然,需要时也可以把 PowerBuilder 的资

源库(Repository Table)复制到另一个数据库中,这在部署使用动态数据窗口的应用

Page 197: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·187·

程序时特别有用,它使开发环境和应用环境达到高度的一致。

� 创建一个与原表有相同结构,但不包含数据的表,即复制表结构。

� 将网络数据库服务器上的数据复制到本地的 SQL Anywhere 数据库中,这样用户就可

以使用客户机本地的数据库而无须每次都使用网络,减轻了网络的通信压力。

� 提供了在修改表结构的同时保留表中数据的另一种手段。用数据库画板或表画板修改

表时,有些选项不能修改。例如,大多数数据库不允许把空列(NULL)修改为非空

列(NO NULL)。此时,可以用数据管道创建一个新表,新表与原表的结构相同,

但属性可按需要设置。

用数据管道复制数据时,可以复制表中所有数据,也可以复制部分数据,甚至还可以复

制出加工了的数据。

10.2 创建数据管道对象

10.2.1 数据管道对象

数据管道是 PowerBuilder 的一个对象,它的使用方法有如下两种:

� 用数据管道画板创建数据管道对象,然后在数据管道画板中运行数据管道对象;

� 用数据管道画板创建并保存数据管道对象,用用户对象画板定义出基于数据管道对象

的用户对象,编写需要的事件处理程序,在代码中运行管道。无论哪种方法,使用之

前都需要首先创建数据管道对象。

创建数据管道对象时,需要确定下述选项:

� 源数据库;

� 目的数据库;

� 要从中复制数据的源表;

� 要存放数据的目的表;

� 要执行的数据管道操作类型;

� 运行数据管道时事务提交的频率;

� 允许出现的最多错误数;

� 是否要把表的扩展属性一起传送到目的数据库中。

实际上,上述选项的结果都将包含到数据管道对象中。那么怎样创建数据管道对象呢?

答案是用数据管道画板(Data Pipeline Painter)进行创建。

10.2.2 启动数据管道画板

在 PowerBuilder 中启动数据管道画板的方法与启动其他 PowerBuilder 对象画板一样,即

通过“New”对话框来创建。启动数据管道的操作步骤如下。

(1)单击主工具栏 PowerBar1 的“New”按钮,打开“New”对话框,在该对话框激活

Database 选项卡。

(2)双击 Data Pipeline 图标,或者选择 Data Pipeline 图标后单击“OK”按钮,系统打开

“New Data Pipeline”对话框。

(3)在“New Data Pipeline”对话框中,全部选项分为了两个组框:Data Source 组框用

Page 198: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·188·

于选择数据源,这些数据源的作用与创建数据窗口时的数据源完全相同,它们生成指定的 SQL

SELECT 语句;Data Connection 组框用于指定提取数据的源表所在数据库所对应的数据库描

述文件和目的表所在数据库所对应的数据库描述文件,如果所需的数据库描述文件没有在列

表框中列出,那么必须使用数据库画板创建相应的数据库描述文件。

(4)分别在 Source Connection(源连接)列表和 Destination Connection(目的连接)列表

中选择源数据库和目的数据库;在 Data Source 中选择数据源,然后单击“OK”按钮;系统

根据所选数据源的不同,出现不同的画面,按照与定义数据窗口数据源相似的方法定义数据

源,定义了数据源之后,系统打开数据管道画板。

经过上述操作后可以在数据管道画板中选择数据源表及其列、定义目的表及其列以及有

关属性。数据管道画板的工具栏除了主工具栏 PowerBar1 外还有 PainterBar1 工具栏,如图 10.1

所示。

编辑数据源

配置源数据库描述文件 关闭画板

保存数据管道 运行数据管道

配置目的数据库描述文件

图 10.1 数据管道画板工具栏

数据管道画板工作区分为 3 个部分:位于左下脚的源表部分(这部分不能直接修改);

位于右下脚的目的表部分;位于上部的数据管道选项。

10.2.3 使用数据管道画板

1.源表

数据管道画板的源表(Source Table)部分显示数据管道要从中提取数据的表的有关信息。

2.目的表

数据管道画板的目的表(Destination Table)部分定义数据管道要把数据传输到什么地方。

3.选择管道操作

在数据管道画板工作区上部指定数据管道选项,这些选项决定了将以何种方式运行管道。

4.改变源数据库和目的数据库

在数据管道画板工作区中,随时可以改变源数据库和目的数据库。

5.运行数据管道

定义了数据管道对象的各种选项后,就可以在数据管道画板中运行数据管道了。运行数

据管道的方法很简单:单击数据管道画板工具栏上的 Execute 图标或选择 Design→Execute 命

令。

Page 199: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·189·

6.数据管道出错处理

在数据管道运行过程中,随时可能因数据完整性等原因而产生错误,PowerBuilder 可自

动把出错的行显示在数据窗口中。

10.3 在应用程序中使用数据管道

如果想在应用程序中使用数据管道,一般必须创建下述对象:

� 用数据管道画板创建数据管道对象;

� 创建一个继承 Pipeline 的标准类用户对象;

� 创建一个窗口,在窗口上放置用于显示数据管道运行过程中出错信息的数据窗口控

件。

在应用程序中使用数据管道的基本步骤如下:

(1)用数据管道画板创建数据管道对象。

(2)用用户对象画板创建继承 Pipeline 的标准类用户对象。

(3)创建窗口,在窗口上放置一个数据窗口控件。

(4)编写代码,代码中依次实现下述操作:初始化事务对象并连接数据库、创建标准类

用户对象实例、将数据管道对象与标准类用户对象实例联系起来、启动数据管道。

(5)处理行错误。

(6)结束管道操作,清理前面创建的实例。

10.3.1 使用数据管道画板创建数据管道对象

由于数据管道是非可视对象,数据管道用户对象也是标准类用户对象,所以应按照创建

标准类用户对象的方法创建,其具体操作步骤如下:

(1)单击主工具栏上的“New”按钮,打开“New”对话框,并激活 Object 选项卡。

(2)选择 Standard Class 图标,然后单击“OK”按钮,打开“Select Standard Class Type”

对话框,从所列出的标准类型中选择 Pipeline,然后单击“OK”按钮,即可打开用户对象画

板。

(3)对简单的应用程序来说,可以直接保存该用户对象。

(4)对复杂的应用程序来说,可以创建该用户对象的实例变量、用户对象,编写所需的

事件处理程序和函数等,最终形成一个可重用的用户对象,然后保存用户对象。

10.3.2 数据管道的属性

数据管道用户对象的属性共有 5 个,反映了当前使用的数据管道对象、语法、数据管道

运行情况等信息,下面分别对 5 个属性进行介绍。

(1)DataObject 属性用于保存数据管道对象名。

(2)RowsInError 属性用于指示数据管道运行过程中发现的错误个数。

(3)RowsRead 属性用于指示数据管道运行过程中当前已经读取的行数。

(4)RowsWritten 属性用于指示数据管道运行过程中当前已经写入的行数。

(5)Syntax 属性用于保存创建数据管道对象的语法。

Page 200: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·190·

1.DataObject 属性

DataObject 属性的数据类型为 String,用于保存数据管道对象名(在数据管道画板中创建

的对象),其作用与数据窗口控件的同名属性的作用十分相似。该属性指定与数据管道用户

对象相关联的数据管道对象名,与数据窗口控件不同,数据管道用户对象的 DataObject 属性

只能在代码中设置。例如:

iu_pipeline.DataObject="pipe_test"

其中,iu_pipeline 是数据管道用户对象的实例,pipe_test 是在数据管道画板中创建的数据管道

对象的名称。

2.RowsInError 属性、RowsRead 属性和 RowsWritten 属性

RowsInError 属性、RowsRead 属性和 RowsWritten 属性提供数据管道运行过程中的状态

信息。这些属性通常显示在应用程序的窗口中,以便让用户了解数据管道的执行进程。

(1)RowsInError 属性的数据类型为 Long,它指示数据管道运行过程中发现的错误个数

(如存在键值重复的行等)。例如,如果数据管道处理了 100 行数据,其中发现了 7 个错误,

那么 RowsInError 的值就是 7。

(2)RowsRead 属性的数据类型为 Long,它指示数据管道运行过程中当前已经读取的行

数。对前面的示例来说,RowsRead 的值为 100。

(3)RowsWritten 属性的数据类型为 Long,它指示数据管道运行过程中当前已经写入的

行数。对前面的示例来说,RowsWritten 的值为 93。

3.Syntax 属性

Syntax 属性的数据类型为 String,保存用于创建数据管道对象的语法(在数据管道画板

中创建的对象)。

10.3.3 数据管道的事件

数据管道有 5 个预定义事件,预定义事件的触发时机如下。

(1)Constructor:在数据管道用户对象创建时触发。

(2)Destructor:在数据管道用户对象删除时触发 。

(3)PipeStart:开始执行 Start()函数或 Repair()函数时触发。

(4)PipeMeter:每次读或写一块数据时触发,设计数据管道对象时定义的 Commit 参数

的大小决定了块的大小。也就是说,数据管道每执行完一个数据库事务时都会触发 PipeMeter

事件。

(5)PipeEnd:Start()函数或 Repair()函数执行结束时触发。

10.3.4 数据管道的函数

数据管道对象有 8 个函数,其中 ClassName()、GetParent()、PostEvent()、TriggerEvent()、

TypeOf()与其他对象相应函数的意义相同,在此不再重复,下面介绍数据管道对象特有的 3

个函数。

Page 201: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·191·

1.Start()函数

Start()函数执行数据管道对象,将数据从源表按 SQL SELECT 语句指定的要求传送到目

的表中。这里所说的数据管道对象是从系统对象 pipeline 继承得到的用户对象的一个属性。

Start()函数的语法格式为:

pipelineobject.Start ( sourcetrans, destinationtrans,errordatawindow {,arg1, arg2,..., argn})

其中:

(1)pipelineobject 是包含要被执行数据管道对象的数据管道用户对象名称。

(2)sourcetrans 是连接到源数据库的事务对象名,可以是默认的事务对象 SQLCA,也可

以是应用程序自己创建的事务对象。

(3)destinationtrans 是连接到目的数据库的事务对象名,可以是默认的事务对象 SQLCA,

也可以是应用程序自己创建的事务对象。

(4)errordatawindow 是个数据窗口控件名,该控件用于显示数据管道运行过程中出现的

错误。程序中无须把某个数据窗口对象关联到该控件上,系统会根据出现的数据管道错误自

动生成所需的数据窗口对象。如果程序中已经在该控件上关联了某个数据窗口对象,运行时

该对象将被数据管道创建的对象取代。

(5)arg1,arg2,...,argn 是可选参数,对应于定义数据管道数据源时 SELECT 语句所需的检

索参数。

下面是运用 Start()函数的一个简单示例:

i_upipe = CREATE u_pipe

i_upipe.DataObject = "p_pipe"

i_upipe.Start(i_src, i_dst, dw_1)

2.Cancel()函数

在数据管道运行过程中,执行 Cancel()函数后将终止数据管道的执行。

Cancel()函数的语法为:pipelineobject.Cancel ( )

该函数执行成功时返回 1,失败时返回 0。

下面是运用 Cancel()函数的一个简单示例:

i_upipe.Cancel()

3.Repair( )函数

数据管道运行后,如果某些行不能传送到目的数据库,就产生了错误,出错的行显示在

与数据管道对象相关联的数据窗口中,用户在数据窗口中修改了数据后,使用 Repair()函数,

将修改结果传送到目的数据库。

Repair()函数的语法格式为:pipelineobject.Repair ( destinationtrans )

其中:

pipelineobject 是包含要被执行数据管道对象的数据管道用户对象名称。

destinationtrans 是连接到目的数据库的事务对象名称。

Page 202: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·192·

本 章 小 结

本章首先介绍数据管道的基本概念,说明数据管道对象的定义方法以及如何在数据管道

画板中运行和修改管道;然后介绍数据管道的属性、事件、函数,并说明程序中使用数据管

道的基本步骤;最后介绍一个完整的数据管道应用示例,并给出一个可重用的数据管道用户

对象。

练 习

1.数据管道有哪几个常用属性?

2.数据管道有哪几个常用事件?

3.数据管道有哪几个常用函数?

4.编程实现将一个数据库中的表复制到另一个数据库中?

Page 203: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·193·

第 11 章 库管理和应用程序创建

11.1 库管理

在开发 PowerBuilder 应用程序过程中,开发者创建的各种对象(窗口对象、菜单对象、

数据窗口对象、用户对象等)都保存在应用库中(.PBL 文件)。

PowerBuilder 的库画板(Library Painter)正是一种灵活的应用库管理工具。利用库画板,

开发者既能够创建应用库、删除应用库、更新应用库的说明,也可以操作应用库中的对象,

包括选择对象、删除对象、复制对象、移动对象、编辑对象等。

虽然开发者之间可以通过某种管理方式而有效地沟通,但依然需要手工地复制对象以达

到同步的目的。显然,这种方式不是一个高效率的方案。要使同一项目中的多个开发人员高

效率地协同工作,将应用库放置在公用的网络驱动器上是一个可行的解决方案。

11.1.1 应用库的组织方式

按应用程序子系统组织对象,把一个子系统中的对象放置在一个应用库中,其优点是在

减小应用库的同时,能够将子系统拼接到不同的应用程序上;其缺点是最终导致产生大量应

用库。

速度是任何应用程序都要考虑的重要问题。将应用库(PBL)放置在开发人员使用的本

地机上将会提高应用程序的运行速度,对多人参加的项目来说,如果每个人都保留一份本地

拷贝,那么谁也不会看到整个系统的最新修改,而且,一个开发者的修改可能还会覆盖掉其

他人的修改。

按类型组织对象,即把所有同类对象放置在一个库中。例如,所有窗口对象放到一个库,

数据窗口对象放到另一个库等。这种方法的优点是方法简单,易于查找所需对象;缺点是,

在大型项目中,应用库会变得非常庞大。

11.1.2 使用库画板

1.库画板中的工具栏

库画板中有一个工具栏,它可以帮助用户管理和维护库文件。该工具栏中的各种工具非

常便捷实用,其功能如图 11.1 所示。

2.库画板工作区

启动库画板的方法很简单:单击画板栏的库画板(Library)图标 或直接按 Shift+F10

键,库画板的工作窗口即可显示在屏幕上,如图 11.2 所示。

从图 11.2 中可以看出,库画板的工作区有若干视图区,其中,一般常显示的视图区有树

Page 204: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·194·

(Tree)视图区和列表(List)视图区,它们的特征分别类似于 Windows 中资源管理器左窗格

的“文件夹”视图和右窗格的对象列表视图。

创建 全选 编辑 复制 移动 删除 导出 导入

重构 查找 属性 检入 检出 显示 关闭

图 11.1 库画板

图 11.2 库画板工作区

熟悉了各图标后,从屏幕上一眼就能看出各对象的类型,而且库画板中同类对象放置在

一起,类中对象按对象名的字母次序排序。

默认情况下,库画板显示应用库中包含的所有对象以及相关信息,包括对象名、修改日

期、最近编译日期、对象大小以及对象注释。如果希望库画板只显示某些对象或信息,可以

这样做:从“Design”菜单中选择“Options⋯” 菜单项,系统打开“Options”对话框,选

中“General”标签页“Display”组框中的某个复选框时,相应的信息出现在库画板工作区

中,未选中时,相应的信息不显示。

11.2 维护应用库

利用库画板能够创建新的应用库、删除现有应用库、优化应用库以及更新应用库的说明,

下面分别予以介绍。

11.2.1 创建新的应用库

绝大多数人熟悉的创建新应用库的方法是使用应用对象画板,这种方法在创建新应用库

Page 205: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·195·

的同时必须创建应用对象。使用库画板,可以创建不包含应用对象的应用库,其步骤如下。

(1)单击库画板工具栏上的创建新库图标,系统显示“Create Library”对话框。

(2)选择新库要存放的驱动器和文件夹。

(3)键入新库名称,库名的扩展名必须为 PBL,否则系统报错。

(4)单击“保存”按钮,系统显示 “Properties”对话框,在其编辑框中键入新库的注

释,单击“OK”按钮,完成新库的创建。

新库被创建后,就可以往库中复制、移动、保存各种对象了。

11.2.2 删除应用库

删除应用库的操作步骤如下。

(1)右击要删除的应用库,从弹出的菜单中选择“Delete”菜单项;或选择要删除的应

用库后,从“Library”菜单中选择“Delete”菜单项。

(2)系统询问是否真的要删除库,单击“是”按钮,应用库即被删除。

11.2.3 修改应用库注释

应用库注释显示在应用库及对象的右边,用于说明其作用。对于多人协作完成的项目,

注释是必不可少的信息之一。修改应用库注释的步骤如下。

(1)右击欲修改注释的应用库,从弹出的菜单中选择“Properties⋯” 菜单项,系统显

示“Properties”对话框。

(2)在“Comment”编辑框中键入或修改应用库注释。

(3)单击“OK”按钮,保存修改并关闭对话框。

11.3 创建可执行文件

应用程序经过设计、开发、调试和试运行,排除了明显的与潜在的错误并达到预期功能

后,就到了向用户交付应用程序的时候了。在应用程序交付之前,还有一件重要工作要做,

就是要把应用程序编译成可执行文件,这样用户就能够像运行其他软件那样运行所开发的应

用程序了。

创建可执行文件的惟一途径是使用 PowerBuilder 的工程画板(ProjectPainter)。利用该画

板,既可以把应用程序中的所有对象都包含到独立的可执行文件中,也能够把应用程序编译

成一个可执行文件和多个 PowerBuilder 动态库。

11.3.1 创建可执行文件的一般步骤

工程画板是把 PowerBuilder 应用程序编译成可执行文件的惟一工具。创建可执行文件

时,一般需要经过下述步骤。

� 创建新工程或打开已有工程;

� 设置各种编译选项;

� 生成可执行文件。

Page 206: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·196·

1. 创建新工程

创建新工程的步骤为:单击主工具栏上的“New”按钮,打开“New”对话框,激活

“Project”选项卡;在该对话框中选择“Application”图标,单击“OK”按钮,即可打开工程

画板;在该画板中设置各个选项后保存当前的工程。

2. 设置工程选项

在工程画板中可根据需要设置利用当前工程编译生成应用程序的各个选项,下面介绍这

些选项的意义。

(1)“Executable File Name”编辑框:用于指定编译后的可执行文件的存放路径及名称。

可以直接键入文件名,也可以单击编辑框后面的标识为 3 个小点的按钮后,从打开的对话框

中选择一个文件名。

(2)“Resource File Name”编辑框:用于指定可执行文件和动态库使用的资源文件名。

可以直接键入文件名,也可以单击编辑框后面的标识为 3 个小点的按钮后,从打开的对话框

中选择一个文件名。

(3)“Project Build Options ”选项组:用于设置建立工程的方式。选中“Prompt for

Overwrite”复选框后,建立工程过程中有文件被覆盖时,系统将预先给予提示,否则不提示。

“Rebuild”下拉列表框用于指定以增量方式还是完整重建方式生成工程:选项“Incremental”

为增量方式,“Full”为完整重建方式;增量方式只重新生成上次编译后修改过的对象,因此

速度更快一些,而完整重建方式则重新生成所有对象。选中“Open Server Executable”复选

框表示将使用“OpenClientServer”驱动程序建立分布式服务器应用程序,否则建立普通的可

执行文件。

(4)“Code Generation Options ”选项组:用于设置代码生成选项。选中复选框“Machine

Code”后,可以把应用程序编译成机器代码,否则应用程序编译成 PowerBuilder 伪代码格式

(P-Code)。该组框中其他选项的意义如下。

①“Trace Information”复选框:指定是否在可执行代码中包含调试信息,选中时包含调

试信息,否则不包含。该选项只对生成机器代码的可执行文件有效,对伪代码格式的可执行

文件来说,总是包含调试信息。一般来说,最终交付用户时,不要选中该选项,那样将缩短

可执行文件的长度。

②“Error Context Information”复选框:指定程序运行出错时是否显示上下文相关的出

错信息,该选项只对生成机器代码的可执行文件有效。

③“Excutable Format”下拉列表框:指定可执行文件的代码格式。对 Windows 系统来说,

选择“Native”时编译成本机形式(32 位),选择“16-Bit”时编译成 16 位格式。对 Macintosh

系统来说,有效选项为 PowerPC、68K 或 Fat(既可以在 PowerPC 上运行,也可以在 68K 上

运行的可执行文件格式)。

④“Optimization”下拉列表框:指定代码优化方式。其中“Speed”优化运行速度,当

速度对应用程序十分重要时选择该选项;“Space”优化空间,当内存不宽裕时选择该选项;

“No Optimization”不作优化,当采用其他优化方式存在问题时选择该选项,这样有利于发现

问题。

在工作区下部的“Library”区域,列出了应用程序中使用的应用库。如果想把某个库编

Page 207: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·197·

译成 PowerBuilder 动态库 PBD(对应编译成伪代码的情况)或 DDL(对应编译成机器代码

的情况),然后与可执行文件一起发行,那么在“PBD”或“DDL”列选中相应的复选框。“PBD”

或“DDL”列实际上是一个列:如果当前的编译方式是伪代码方式,则该列显示为“PBD”;

如果当前的编译方式是机器代码方式,则该列显示为“DDL”。

同样,对每一个动态库,也可以在“Resource File Name”列的相应行上指定资源文件的

名称,其意义和作用与在“Resource File Name”编辑框中指定资源文件名相同。

3. 生成可执行文件

按照前面的介绍设置工程的各种选项后,就可以生成可执行文件了。其方法很简单:单

击工程画板工具栏上的“Build”图标,系统显示 “Build Library”对话框;根据工程设置重

新生成对象,此时最好不要通过单击“Stop”按钮停止重新生成对象过程,否则可能会破坏

应用库的完整性;稍过片刻,系统即生成可执行文件,生成过程中如果发现错误,系统会及

时给予提示。

11.3.2 创建可执行文件时要考虑的问题

PowerBuilder 允许以下列 3 种方式创建可执行文件。

� 创建一个包含应用程序所有部件的、单一的、用户可直接运行的可执行文件。

� 创建包含一个规模较小的可执行文件和一个或多个称之为 PowerBuilder 动态库

(PBD)的文件。

� 创建 16 位或 32 位机器代码可执行文件,并带有一个或多个动态链接库(DLL)。

不同的创建方法具有不同的执行效果和资源需求,下面介绍创建可执行文件时要考虑的

问题。

1.可执行文件

PowerBuilder 创建的可执行文件实际上可看成两类:伪代码格式(P-Code)和机器代码

格式。创建伪代码格式的可执行文件时,PowerBuilder 按应用对象中指定的库搜索路径次序,

把各对象编译后的代码复制到可执行文件中。伪代码是 PowerBuilder 编译对象时生成的一种

中间代码,它保存在应用库中。运行时 PowerBuilder 虚拟机(由一组 DLL 组成)解释并执行

中间代码。伪代码方式与 Java 十分相似:都编译成字节代码并由虚拟机/虚拟引擎执行。

对机器代码格式来说,PowerBuilder 生成真正的二进制文件。PowerBuilder 运行时,库

(DLL)根据需要装入该二进制文件,这种方式与其他机器代码应用程序的执行方式完全相同。

伪代码格式的可执行文件与机器代码格式的可执行文件的主要差别在于:伪代码格式的

可执行文件在执行代码前有个解释过程,而机器代码格式的可执行文件则直接执行。

PowerBuilder 在生成代码时,只复制了程序中显式引用且不准备放置到动态库(PBD 或

DLL)中的对象,也就是说,程序中动态引用的对象,例如图形对象(位图、图标、指针)、

窗口对象、数据管道对象、数据窗口对象等将不会复制到可执行文件中。利用把这些对象的

名称罗列在资源文件中的办法可以把它们编译到可执行文件中。

无论哪种代码格式,在可执行文件中都会存储执行库列表。PowerBuilder 使用该列表来

查找程序运行过程中所需的对象。这个列表与开发环境里应用对象属性中设置的库搜索路径

一致。

Page 208: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·198·

2.资源文件

使用任何文本编辑器都可以创建资源文件(简称为 PBR 文件)。正如前面提到的,应用

程序中没有显示引用的对象(如图形对象,但应用对象的图标除外)不会自动编译到可执行

文件中。当指定了需要的编译选项后,除图形对象之外的其他对象可以编译到动态库中,这

些对象包括动态赋值的数据窗口、窗口等。

资源文件由需要编译到可执行文件或动态库中的每个对象(如位图、图标、指针、数据

窗口等)的名称组成。这些名称可以使用两种表达方式:带全路径的名称或不带路径的名称。

使用后一种方式的名称时,需要把这些对象放置在生成可执行文件的目录下。

3.动态库

PowerBuilder 动态库(包括 PBD 和 DLL)的概念与 Windows 动态库的概念十分相似,

动态库中包含了相应的 PowerBuilder 库文件中所有编译好的代码。PBD 文件只能与伪代码

格式的可执行文件一起使用,并且需要放置在库搜索路径指定的路径上。将代码放置到动态

库中可以把应用程序划分成规模较小的几部分,同时能够缩短应用程序的加载时间,并且对

象只在需要时才装入内存,节约了系统资源。

利用动态库还可以在多个应用程序之间共享代码,避免了相同代码的重复分发。同时,

当修改了应用程序的某些功能后,只需要分发包含该功能代码的动态库即可,无须发行整个

应用或其他文件。

动态库具有下述优点:

� 可重用性——动态库可以被多个应用程序使用;

� 可维护性——开发人员能够更新、修改独立的部件而无须重新发行整个应用程序;

� 完整性——由于动态库包含了一个 PowerBuilder 应用库中的所有对象,因此,利用动

态库能够更加方便地完成对象的动态引用;

� 有效性——使用动态库可以减轻应用程序对系统内存的需求。动态库中的对象只在需

要时加载到内存中,而不是把整个动态库都加载到内存中;

� 模块性——由于每个动态库都对应于一个 PowerBuilder 应用库,因此容易划分应用程

序,方便了应用程序的管理工作。

在库画板(Library Painter)中可以单独创建动态库,其方法如下。

(1)启动库画板。

(2)单击要生成动态库的应用库,系统显示所弹出的菜单。

(3)选择“Build Runtime Library⋯” 菜单项,系统显示“Build Runtime Library”对话

框。

(4)所选应用库的名称显示在“Name”后面,这时既可以指定生成机器代码的动态库,

或生成伪代码的动态库,也可以指定动态库中要包含的其他资源。该对话框中各选项的意义

参看上一节工程画板中相应的解释。

(5)设置了各选项后单击“OK”按钮。

Page 209: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·199·

11.4 应用程序的发行

应用程序经过设计、开发和编译,最后就该向用户发行了。发行 PowerBuilder 应用程序

时,只在用户机器上安装应用程序的可执行文件(包括生成应用程序时生成的动态库)还是

远远不够的,这样的发行并不能让应用程序正常地运转起来。实际上,还必须向用户发行

PowerBuilder 运行时所需的动态链接库、安装数据库接口、配置 ODBC 数据源、安装网络驱

动程序以及必要时修改操作系统配置等。下面介绍发行应用程序时需要与应用程序一起发行

的各种部件。

11.4.1 PowerBuilder 运行时库

PowerBuilder 开发环境中包括了一组脱离开发环境运行 PowerBuilder 应用程序所需的运

行时库,称做 PowerBuilder Deployment Kit,这是一组动态链接库(DLL)。发行应用程序时,

必须同时向用户提供这组运行时库,并安装在合适的路径下(通常应该放置在应用程序所在

的目录下或系统的搜索路径下)。

对于不同的 PowerBuilder 版本,运行时库使用的动态链接库也不同。对于 Windows 环境

下 32 位的应用程序来说,必须一起发行的动态链接库是 PBVM60.DLL。当应用程序使用了

管道、超文本控件等对象时,还需要发行 PBRTC60.DLL。对 Windows 环境下 16 位的应用程

序来说,必须一起发行的动态链接库是 PBVM60W.DLL。

11.4.2 安装数据库接口

当应用程序需要访问数据库时,在为用户安装应用程序的同时还必须为其安装好数据库

接口文件。安装数据库接口文件包括下列两方面的内容:

� 安装 PowerBuilder 提供的专用接口或 ODBC 驱动程序(根据应用程序要访问的数据

库而定)。

� 安装数据库厂商提供的数据库驱动程序(不同厂商驱动程序也不同)。

这些文件应该安装在应用程序所在的目录或系统的搜索路径上。

11.4.3 配置 ODBC 数据源

如果应用程序使用了 ODBC 数据源,在为用户安装应用程序的同时还必须为其安装和

配置 PowerBuilder ODBC 驱动程序 PBODB60.DLL 和 PBODB60.INI,这两个文件应该安装

在应用程序所在的目录或系统的搜索路径上。另外,还需要修改 ODBC 初始化文件

ODBCINST.INI 和 ODBC.INI,这两个文件通常在 Windows 目录下,如果用户机器上没有这

两个文件,那么把开发环境中的这两个文件复制过去。

本 章 小 结

本章首先介绍库管理及如何维护应用库,然后介绍了创建可执行文件的步骤及应用程序

的发行方法。另外,本章还介绍了创建可执行文件中应该考虑的问题及动态运行库的优点。

这些对于根据需要选择合适的方法创建可执行文件很有帮助。

Page 210: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·200·

练 习

1.PowerBuilder 允许以哪几种方式创建可执行文件?

2.PowerBuilder 版运行时库使用的动态链接库有哪些?

3.PowerBuilder 的动态库包括哪些内容?

4.PowerBuilder 的动态库有哪些优点?

5.简述创建可执行程序的步骤。

6.制作一个小程序,试着将它生成可执行文件。

Page 211: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·201·

附录 A PowerBuilder 系统函数一览表

(1)数组函数(Array Functions):用于获取某个特定数组的上界值或下界值,共 2 个函

数,如表 A.1 所示。

表 A.1 数组函数

函数格式 返回类型 功 能 说 明

LowerBound(array[,n]) Long 得到指定数组第 n 维的下界

UpperBound(array[,n]) Long 得到指定数组第 n 维的上界

(2)二进制大对象函数(Blob Functions):用于得到 Blob 类型变量的信息,完成数据

类型的转换以及操作 Blob 类型变量等,共 5 个函数,如表 A.2 所示。

表 A.2 二进制大对象函数

函数格式 返回类型 功 能 说 明

Blob(text) Blob 将字符串转换成 Blob 类型的数据

BlobEdit(blobvariable,n,data) Unsigned Long 将任意类型的数据插入到 Blob 变量的指定位置

BlobMid(data,n[,length]) Blob 提取 Blob 变量中的一段数据

Len(stringorblob) Long 得到 Blob 类型变量的数据长度,以字节为单位

String(blob) String 将 Blob 类型变量的值转换成字符串类型

(3)类定义函数(Class Definition Funtions):用于在一个或多个 PBL 中搜寻关于某个

类、函数或数据类型的定义信息,共 3 个函数,如表 A.3 所示。

表 A.3 类定义函数

函数格式 返回类型 功 能 说 明

FindClassDefinition

(classname,[,librarylist]) ClassDefinition

在一个或多个 PowerBuilder 库中查找指定对象,并

提供相关的类定义信息

FindFunctionDefinition

(functionname[,librarylist]) ScriptDefinition

在一个或多个 PowerBuilder 库中查找指定的全局函

数,并提供相关的脚本信息

FindTypeDefinition

(typename,[,librarylist]) TypeDefinition

在一个或多个 PowerBuilder 库中查找指定的数据类

型,并提供相关的类型定义信息

(4)数据类型检查与转换函数(Data Type Checking and Conversion Functions):完成数据

类型的检查与转换功能,共 15 个函数,如表 A.4 所示。

表 A.4 数据类型检查与转换函数

函数格式 返回类型 功 能 说 明

Asc(string) Integer 获取字符串第一个字符的 ASCⅡ码整数值

Char(n) Char 将字符串的第一个字符 Blob 变量的第一个值或一

个整数转换成字符

Page 212: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·202·

续表

函数格式 返回类型 功 能 说 明

Dec(stringorblob) Decimal 将字符串或 Blob 值转换成 Decimal 类型的值

Double(stringorblob) Double 将字符串或 Blob 值转换成 Double 类型的值

Integer(stringorblob) Integer 将字符串或 Blob 值转换成 Integer 类型的值

Long(lowword,highword) Long 将两个无符号整数组合成一个长整数

Long(stringorblob) Long 将字符串或 Blob 值转换成 Long 类型的值

Real(stringorblob) Real 将字符串或 Blob 值转换成 Real 类型的值

Date(datetime) Date 将 Datetime 类型或第一个值是 Datetime 或 Date 的

Blob 值转换成 Date 类型的值

Date(string) Date 将其值为有效日期的字符串转换成 Date 类型的值

Date(year,month,day) Date 把表示年、月、日的 3 个整数组合成一个日期

DateTime(date[,time]) DateTime 把日期和时间值组合成 Datetime 类型的值

DateTime(blob) DateTime 将 Blob 类型的值转换成 DateTime 类型的值

IsDate(datevalue) Boolean 检测指定的字符串是否包含有效的日期

IsNull(any) Boolean 检测变量或表达式的值是否是 Null

IsNumber(string) Boolean 检测指定的字符串是否是有效的数值

IsTime(timevalue) Boolean 检测字符串的值是否是有效的时间

String(data[,format]) Boolean 按指定格式将数据转换成字符串

Time(datetime) Time 将 DateTime 类型或第一个值是 Datetime 或 Time

的 Blob 值转换成 Time 类型

Time(string) Time 将其值为有效时间的字符串转换成 Time 类型

Time(hour,minute,second[,microsecond]) Time 用时、分、秒以及微秒组合出时间

(5)日期与时间函数(Date,Day and Timer Functions):用于日期、时间数据类型变量的

类型转换以及获取变量中的有关信息,共 14 个函数,如表 A.5 所示。

表 A.5 日期与时间函数

函数格式 返回类型 功 能 说 明

Day(date) Integer 获取日期型数据中的号数(1~31 之间的整数值)

DayName(date) String 获取指定日期是一周中的星期几(如 Sunday,Monday 等)

DayNumber(date) Integer 获取日期型数据是一周中的第几天(用 1~7 表示,如星期

日为 1,星期一为 2 等)

DaysAfter(date1,date2) Long 获取两个日期间的天数

Hour(time) Integer 获取时间中的小时,采用 24 小时制

Minute(time) Integer 获取时间中的分钟,有效值在 00~59 之间

Month(date) Integer 获取日期中的月份,有效值在 1~12 之间

Now() Time 获取客户机的当前系统时间,返回值为 Time 类型

RelativeDate(date,n) Date 获取指定日期前多少天或后多少天的日期

RelativeTime(time,n) Time 获取指定时间前多少秒或后多少秒的时间,采用 24 小时制

Second(time) Integer 获取时间值中的秒,有效值在 00~59 之间

SecondsAfter(time1,time2) Long 获取两个时间之间的秒数

Today() Date 获取系统日期和时间

Year(date) Integer 获取指定日期中的年度(有效取值 1000~3000)

Page 213: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·203·

(6)DDE 客户函数(DDE Client Functions):用于客户端的动态数据交换,同 DDE 服务

器进行交互,共 10 个函数,如表 A.6 所示。

表 A.6 DDE 客户函数

函数格式 返回类型 功 能 说 明

CloseChannel(handle[,windowhandle]) Integer 关闭先前用 OpenChannel()函数打开的 DDE 服务

器的通道

ExecRemote(command,applname,

topicname) Integer

直接向 DDE 服务器应用程序发送一条命令(冷

连接方式)

ExecRemote(command,handle

[,windowhandle]) Integer

应用程序打开某个通道后向 DDE 服务器应用程

序发送一条命令(热连接方式)

GetDataDDE(string) Integer 从热连接服务器应用中获取数据并将其保存到

指定的字符串变量中

GetDataDDEOrigin(applstring,topicstring,

itemstring) Integer

确定来自热连接 DDE 服务器应用的数据源,成

功时将应用的 DDE 标识保存在参数指定的变量中

OpenChannel(applname,topicname

[,windowhandle]) Long 打开连接 DDE 服务器的通道

GetRemote(location,target,handle

[,windowhandle]) Integer

请求 DDE 服务器应用提供数据并将数据保存在

变量中。适用于热连接的情况

Year(date) Integer 获取日期值中的年度(有效取值为 1000~3000)

RespondRemote(boolean) Integer 发送一条 DDE 消息,指示是否接受来自远程

DDE 应用的命令或数据

SetRemote(location,value,applname,

topicname) Integer

请求 DDE 服务器应用接受保存在指定位置的数

据。适用于仅发出少数几个请求的情况

SetRemote(location,target,handle

[,windowhandle]) Integer

请求 DDE 服务器应用接受保存在指定位置的数

据。适用于热连接的情况

StartHotLink(location, applname,topic) Integer 建立与 DDE 服务器应用的热连接

StopHotLink(location, applname,topic) Integer 关闭与 DDE 服务器应用的热连接

GetRemote(location,target,applname,

topicname) Integer

请求 DDE 服务器应用提供数据并将其保存在变

量中。适用于仅发出少数几个请求的情况

(7)DDE 服务器函数(DDE Server Functions):用于服务器端的动态数据交换,同 DDE

客户进行交互,共 8 个函数,如表 A.7 所示。

表 A.7 DDE 服务器函数

函数格式 返回类型 功 能 说 明

GetCommandDDE(string) Integer 获取 DDE 客户应用发送的命令

GetCommandDDEOrigin(applstring) Integer 确定哪一个 DDE 客户应用向服务器发送

了命令

GetDataDDE(string) Integer 获取 DDE 客户应用发送的数据

GetDataDDEOrigin(applstring,topicstring,itemstring) Integer 确定哪一个 DDE 客户端应用发送了数据

RespondRemote(boolean) Integer 向客户端应用指明最近的命令或数据是

否已经接收

SetDataDDE(string[,applname,topic,item]) Integer DDE 服务器向 DDE 客户应用发送数据

StartSeverDDE([windowname,] applname,topic[,item]) Integer 将当前应用设置为 DDE 服务器

StartSeverDDE([windowname,]applname,topic) Integer 停止当前应用的 DDE 服务器返回值

Page 214: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·204·

(8)文件操作函数(File Functions):完成文件的打开、关闭与删除以及文件数据的读取、

写入、修改等操作,共 17 个函数,如表 A.8 所示。

表 A.8 文件操作函数

函数格式 返回类型 功 能 说 明

ChangeDirectory(directoryname) Integer 改变当前目录

CreateDirectory(directoryname) Integer 创建一个目录

DirectoryExists(directoryname) Boolean 检查指定的目录是否存在

FileClose(filename) Integer 关闭文件

FileCopy(sourcefile,targerfile[,replace]) Integer 复制文件

FileDelete (filename) Boolean 删除文件

FileExists (filename) Boolean 检查指定的文件是否存在

FileLength (filename) Long 得到指定文件的长度,以字节为单位

FileMove(sourcefile,targerfile) Integer 移动文件

FileOpen(filename) Integer 打开文件

FileRead(filename,variable) Integer 从指定文件中读取数据

FileSeek(filename,position,origin) Long 将文件指针移动到指定位置

FileWrite(filename,variable) Integer 写文件

GetCurrentDirectory() String 得到当前目录

GetfileOpenName(title,pathname,filename) Integer 显示打开文件对话框,让用户选择要打开的文件

GetfileSaveName(title,pathname,filename) Integer 显示保存文件对话框,让用户选择要保存的文件

RemoveDirectory(directoryname) Integer 删除指定的目录

(9)垃圾回收函数(Garbage Collection Functions):用于废弃资源的回收,共 3 个函数,

如表 A.9 所示。

表 A.9 垃圾回收函数

函数格式 返回类型 功 能 说 明

GarbageCollect() (None) 强制系统立即开始收集垃圾

GarbageCollectGetTimeLimit() Long 获取当前收集垃圾的最小时间间隔

GarbageCollectSetTimeLimit(newtimeinmilliseconds) Long 设置垃圾收集操作之间的最小时间间隔

(10)帮助提供函数(Help Functions):用于在应用中向用户提供在线帮助,共 2 个函数,

如表 A.10 所示。

表 A.10 帮助提供函数

函数格式 返回类型 功 能 说 明

ShowHelp(helpfile,helpcommand[,typeid]) Integer 显示应用程序帮助

ShowPopupHelp(helpfile,control,contextid) Integer 为控件显示弹出式帮助

(11)国际化函数(International Functions):用于不同语种字符串的有关处理,这些函数

主要涉及到 Arabic、Hebrew 文字的字符串,以及 Unicode 字符与 ANSI 字符间的转换,共 13

个函数,如表 A.11 所示。

Page 215: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·205·

表 A.11 国际化函数

函数格式 返回类型 功 能 说 明

FromAnsi(blob) String 将包含 ANSI 字符串的 Blob 数据转换为 PowerBuilder 当前

版本文件格式的字符串

FromUnicode(blob) String 将包含 Unicode 字符串的 Blob 数据转换为 PowerBuilder 当

前版本文件格式的字符串

IsAllArabic(string) Boolean 确定指定的字符串是否全部由阿拉伯文字符组成

IsAllHebrew(string) Boolean 确定指定的字符串是否全部由希伯来文字符组成

IsAnyArabic(string) Boolean 确定指定的字符串中是否包含阿拉伯文字符

IsAnyHebrew(string) Boolean 确定指定的字符串中是否包含希伯来文字符

IsArabic(character) Boolean 确定指定的字符是否是阿拉伯文字符,如果参数为字符

串,则只检查左边第一个字符是否是阿拉伯文字符

IsArabicAndNumbers(string) Boolean 确定指定的字符串是否全部由阿拉伯文字符或数字组成

IsHebrew(character) Boolean 确定指定的字符是否是希伯来文字符,如果参数为字符

串,则只检查左边第一个字符是否是希伯来文字符

IsHebrewAndNumbers(string) Boolean 确定指定的字符串是否全部由希伯来文字符或数字组成

Reverse(string) String 颠倒字符串中的字符次序

ToAnsi(string) Blob 将 Unicode 字符转换成 ANSI 字符

ToUnicode(blob) String 将 ANSI 字符转换成 Unicode 字符

(12)库管理函数(Library Functions):用于在应用程序中创建、删除、导入和导出

PowerBuilder 应用库中的对象,以及生成一个指定应用库所包含对象的对象列表,共 7 个函

数,如表 A.12 所示。

表 A.12 库管理函数

函数格式 返回类型 功 能 说 明

LibraryCreate(libraryname[,comments]) Integer 创建一个空的 PowerBuilder 应用库

LibraryDelete(libraryname[,objectname,objecttype]) Integer 删除库文件或库中数据窗口对象

LibraryDirectory(libraryname,objecttype) String 到应用库中指定对象的信息列表内容

LibraryDirectoryEx(libraryname,objecttype) String 获取应用库中一系列对象的信息列表内容

LibraryExport(libraryname,objectname,objecttype) String 从指定应用库中以对象的语法定义格式卸出

对象

LibraryImport(libraryname,objectname,objecttype,

syntax,errors[,comments]) Integer

将以语法格式表示的数据窗口对象装入指定

的应用库中

SetLibraryList(filelist) Integer 修改应用程序的库搜索路径,该函数是应用对

象的对象函数

(13)数值处理函数(Numeric Functions):完成初等数学运算,这些函数包括基本算术

函数、离散型函数、三角函数等,共 23 个函数,如表 A.13 所示。

表 A.13 数值处理函数

函数格式 返回类型 功 能 说 明

Abs(n) n 的数据类型 计算绝对值

ASin(n) Double 反正弦函数

ACos(n) Double 反余弦函数

Page 216: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·206·

续表

函数格式 返回类型 功 能 说 明

ATan(n) Double 反正切函数

Ceiling(n) n 的数据类型 返回大于 n 的最小整数

Cos(n) Double 余弦函数

Exp(n) Double 计算 e 的 n 次方

Fact(n) Double 计算 n 的阶乘

Int(n) Integer 得到小于或等于 n 的最大整数

Log(n) Double 计算 n 的自然对数

LogTen(n) Double 计算 n 的常用对数

Max(x,y) x、y 中更精确的数据类型 求最大值

Min(x,y) x、y 中更精确的数据类型 求最小值

Mod(x,y) x、y 中更精确的数据类型 求余数

Pi(n) Double 求 n 与 Pi 的乘积

Rand(n) n 的数据类型 获取 1 与 n 之间的一个伪随机数

Randomize(n) Integer 初始化伪随机数发生器

Round(x,n) Decimal 将 x 四舍五入到 n 位

Sign(n) Integer 确定 n 是整数、负数还是零

Sin(n) Double 计算正弦

Sqrt(n) Double 计算平方根

Tan(n) Double 计算正切

Truncate(x,n) Decimal 截取数值到指定的小数位

(14)打印函数(Print Functions):用于通过打印机格式化输出数据,共 21 个函数,如

表 A.14 所示。

表 A.14 打印函数

函数格式 返回类型 功 能 说 明

Print(printjobnumber,[tab1,]string[,tab2]) Integer 以当前字体在打开的打印作业中打印一

行或多行文本

PrintBitmap(printjobnumber,Bitmap,x,y,width,height) Integer 在打印区域的指定位置打印位图

PrintCancel(printjobnumber) Integer 取消用 PrintOpen()函数启动的打印作业

PrintClose(printjobnumber) Integer 关闭打印作业,并把打印页面发送到打

印机上

PrintDataWindow(printjobnumber,dwcontrol) Integer 打印数据窗口控件的内容

PrintDefineFont(printjobnumber,fontnumber,facename,

height,weight,fontpitch,fontfamily,italic,underline) Integer 定义打印作业使用的字体

PrintLine(printjobnumber,x1,y1,x2,y2,thickness) Integer 在当前打印页上绘出指定厚度的一条线

PrintOpen([jobname]) Long 启动打印作业并返回作业号

PrintOval(printobnumber,x,y,height,width, thickness) Integer 在指定位置以指定线宽绘制椭圆或圆

PrintPage(printjobnumber) Integer 将当前页发送到打印机上

PrintRect(printjobnumber,x,y,height,width, thickness) Integer 在指定位置以指定线宽打印矩形

PrintRoundRect(printjobnumber,x,y,height,width,

xradius,yradius,thickness) Integer 在指定位置以指定线宽打印圆角矩形

Page 217: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·207·

续表

函数格式 返回类型 功 能 说 明

PrintScreen(printjobnumber,x,y[,height,weight]) Integer 在打印作业中打印屏幕图像

PrintSend(printjobnumber,string[,zerochar]) Integer 直接向打印机发送任意字符串

PrintSetFont(printjobnumber, fontnumber) Integer 设置当前打印作业使用的字体

PrintSetSpacing(printjobnumber, spacingfactor) Integer 设置行间距因子

PrintSetup() Integer 打开打印机设置对话框

PrintText(printjobnumber,string,x,y[,fontnumber]) Integer 在指定位置打印一行文本

PrintWidth(printjobnumber,string) Integer 确定一个字符串在指定打印作业中按当

前字体所占的宽度

PrintX(printjobnumber) Integer 返回打印光标的 x 坐标位置

PrintY(printjobnumber) Integer 返回打印光标的 y 坐标位置

(15)打印机函数(Printer Functions):用于设置默认打印机、获取可用打印机列表以及

打开打印机安装对话框等,共 4 个函数,如表 A.15 所示。

表 A.15 打印机函数

函数格式 返回类型 功 能 说 明

PrintGetPrinter() String 获取当前打印机的名称

PrintGetPrinters() String 获取系统中所有可用打印机的名称

PrintSetPrinter(Printername) Integer 设置下一次调用打印函数时要使用的打印机

PrintSetupPrinter() Integer 显示打印机设置对话框

(16)注册函数(Registry Functions):用于获取和设置系统注册表中的值,仅适用于

Microsoft windows 平台,共 5 个函数,如表 A.16 所示。

表 A.16 注册函数

函数格式 返回类型 功 能 说 明

RegistryDelete(key,valuename) Integer 删除 Windows 系统注册库中的一个键或键的某个值

RegistryGet(key,valuename,valuevariable) Integer 从系统注册库中得到指定键的值

RegistryKeys(key[,subkeys]) Integer 从系统注册库中得到指定键的有效子键

RegistrySet(key,valuename, value) Integer 从系统注册库中设置或创建指定键

RegistryValues(key[,valuename]) Integer 获取与指定键相关的一组值名

(17)共享对象函数(Shared Object Functions):主要适用于分布式应用系统,共 3 个函

数,如表 A.17 所示。

表 A.17 共享对象函数

函数格式 返回类型 功 能 说 明

SharedObjectDirectory() ErrorReturn 获取用于共享的一组已注册对象的名称

SharedObjectGet() ErrorReturn 获取指定共享对象的引用

SharedObjectRegister() ErrorReturn 将指定的用户对象注册为共享对象

(18)字符串操作函数(String Functions):用于进行与字符串有关的各种处理,共 19 个

函数,如表 A.18 所示。

Page 218: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·208·

表 A.18 字符串操作函数

函数格式 返回类型 功 能 说 明

Asc(string) Integer 获取字符串第一个字符的 ASCII 码整数值

Char(n) Char 抽取字符串第一个字符或把整数转换成字符

Fill(chars,n) String 建立一个由指定字符串填充的指定长度的字符串

LastPos(string1,string2[,searchlength]) Long 查找目标字符串在原字符串中最后一次出现的位置

Left(string,n) String 获取字符串左部指定个数的字符

LeftTrim(string) String 删除字符串左部的空格

Len(stringorblob) Long 返回字符串的长度

LenW(stringorblob) Long 返回字符串中字符的个数,用于 DBCS 环境

Lower(string) String 将字符串中的大写字母转换为小写字母

Match(string,textpattern) Boolean 确定字符串中是否包含指定模式的字符

Mid(string,start[length]) String 取字符串的子串

Pos(string1,string2[,start]) Long 在一个字符串中查找所包含的另一个字符串的起始位置

Replace(string1,start,string2) String 将一个字符串中指定个数的字符串替换为另一个字符串

Reverse(string) String 颠倒字符串中各字符的次序

Right(string,n) String 从字符串尾部取指定个数的字符

RightTrim(string) String 删除字符串尾部的空格

Space(n) String 生成一个由空格组成的指定字符个数的字符串

Trim(string) String 删除字符串首部和尾部的空格

Upper(string) String 将字符串中的小写字母转换为大写字母

WordCap(text) String 将 text 中每一个单词的首字母大写,其他字母小写

(19)系统与环境函数(System and Environment Functions):用于处理当前应用同所运行

系统和环境的交互,共 15 个函数,如表 A.19 所示。

表 A.19 系统与环境函数

函数格式 返回类型 功 能 说 明

Clipboard([string]) String 提取或替换 Windows 系统剪贴板的文本内容

CommandParm() String 得到应用程序运行时指定的命令参数

GetApplication() Application 获取当前应用对象的句柄

GetEnvironment(environmentinfo) Integer 获取操作系统处理器屏幕显示等与系统相关的信息

GetFocus() GraphicObject 确定当前焦点位于哪个对象上

Handle(objectname[,previous]) Long 获取 PowerBuilder 窗口型对象的句柄

SetProfileString(filename,section,key,value) Integer 设置初始化文件中指定项的值

ProfileInt(filename,section,key,default) Integer 从初始化文件.ini 中读取整型设置值

ProfileString(filename,section,key,default) String 从初始化文件.ini 中读取字符串型设置值

Restart() Integer 停止程序段的执行,关闭所有窗口,提交事务,

断开与数据库的连接,然后重新启动应用程序

Run(string[,windowstate]) Integer 运行指定的应用程序

Send(handle,messageno,word,long) Long 向窗口发送指定的消息,并立即执行相应的事件

处理程序

Post(handle,messageno,word,long) Boolean 将指定消息加入到某个窗口的消息队列中

Page 219: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·209·

续表

函数格式 返回类型 功 能 说 明

SignalError() Integer 触发应用对象的 SystemError 事件

Yield() Boolean 将 控 制 权 转 移 给 其 他 图 形 对 象 , 包 括 非

PowerBuilder 对象

(20)定时操作函数(Timing Functions):用于测试 CPU 的消耗时间、设置定时对象或

Idle 事件的定时器、指定定时器事件触发的间隔时间等,共 4 个函数,如表 A.20 所示。

表 A.20 定时操作函数

函数格式 返回类型 功 能 说 明

CPU() Long 得到自当前应用程序启动后 CPU 所消耗的时间,以毫

秒为单位

Idle(n) Integer 该函数在用户每次活动后重置定时器,n 秒后触发应用

对象的 Idle 事件

Start() Integer 激活一个定时对象,在指定时间间隔内反复触发指定

的定时器事件

Timer(number[,windowname]) Integer 在指定时间间隔内,反复触发指定窗口的定时器事件

(21)跟踪函数(Tracing Functions):用于操作跟踪文件,以便在跟踪文件中收集有关数

据,共 8 个函数,如表 A.21 所示。

表 A.21 跟踪函数

函数格式 返回类型 功 能 说 明

TraceBegin(identifier) ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceClose() ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceDisableActivity(activity) ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceEnableActivity(activity) ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceEnd() ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceError(severity,message) ErrorReturn 返回值总为 Success!

TraceOpen(filename,timer) ErrorReturn 函数返回的有效取值为:Success!,函数执行成功

TraceUser(info,message) ErrorReturn 返回值总为 Success!

(22)窗口操作函数(Window Functions):用于完成窗口打开和关闭方式的设置,共 6

个函数,如表 A.22 所示。

表 A.22 窗口操作函数

函数格式 返回类型 功 能 说 明

Close(windowname) Integer 关闭窗口,并释放窗口及窗口上的

控件所占据的内存

CloseWithReturn(windowname,returnvalue) Integer 关 闭 窗 口, 并 将返 回值 保 存 在

Message 对象中

Open(windowvar,windowtype[,parent]) Integer 打开指定窗口数据类型的一个实

OpenWithParm(windowvar,parameter,windowtype[,parent]) Integer 带参数打开窗口,与打开窗口的

Open 函数相似

Open(windowvar[,parent]) Integer 打开窗口

Page 220: PowerBuilder9.0基础教程idl.hbdlib.cn/book/00000000000000/pdfbook/018/017/100086.pdf · 计的完整PowerBuilder 应用系统程序作为实例贯穿于全书。书中不仅介绍了PowerBuilder

·210·

续表

函数格式 返回类型 功 能 说 明

OpenSheetWithParm(sheetrefvar,parameter[,windowtype],

mdiframe[,position[,arrangeopen]]) Integer

在 MDI 框架窗口中打开 MDI 子窗

口,同时把参数保存在 Message 对

象中进行传递

OpenSheet(sheetrefvar[,windowtype],mdiframe[,position,

arrangeopen]]) Integer

在 MDI 框架窗口中打开 MDI 子窗

口,并在指定菜单中创建选择该子

窗口的菜单项

(23)其他系统函数(Miscellaneous Functions):其他通用系统函数,共 19 个函数,如表

A.23 所示。

表 A.23 其他系统函数

函数格式 返回类型 功 能 说 明

Beep(n) Integer 响铃 n 次,n 超过 10 时只响 10 次

ChooseColor(color[,customcolors]) Integer 显示标准的颜色选择对话框

ClassName(variable) String 确定指定变量的类数据类型

DegugBreak() (None) 暂停程序执行,打开调试器,进入调试模式

DraggedObject() DragObject 获取对触发一个拖曳事件控件的引用

GetFolder(title,directory) Integer 显示文件夹选择对话框

IntHigh(long) Integer 得到 Long 型值的高位字

IntLow(long) Integer 得到 Long 型值的低位字

IsValid(objectname) Boolean 检查对象变量是否已经实例化

KeyDown(keycode) Boolean 检查用户是否按了键盘上指定的键

MessageBox(title,text[,icon[,button,default]]) Integer 显示一个消息对话框

PixelsToUnits(pixele,type) Integer 将像素值转换为 PowerBuilder 单位

PopulateError(number,text) Integer 以应用程 序定制的错误号和错误信息填充

Error 对象

RGB(red,green,blue) Long 将代表红、绿、蓝三原色成分的 3 个整数组合

成一个表示颜色的长整数

SetNull(anyvariable) Integer 将指定变量的值设置为 NULL

SetPointer(type) Pointer 设置鼠标指针

SignalError([number],[text]) Integer 触发应用对象的 SystemError 事件

Sleep(seconds) Integer 使应用程序暂停执行指定的时间

UnitsToPixels(units,type) Integer 将 PowerBuilder 单位转换为像素