| PFC 是PowerBuilder 高 级 开 发
工 具 集 中 的 一 个 基 本 类 库, 提 供 了 进 行 一 般应 用 开 发 时 会 经 常 用 到 的 对 象 和 函 数 代
码。PowerBuilder 5.0 的 基 本 类 库 中 的 内 容 十 分 丰 富, 比 以 前 版 本 中 所 提 供的 功 能 要 增 加 了 许
多, 而 且 对 象 之 间 的 继 承 和 引 用 关系 也 比 以 前 更 为 清 晰 合 理。 因 此 编 写 一 个 完 全 建 构 在PFC 类 库
之 上 的 应 用 可 大 大 提 高 软 件 质 量, 而 且 利 用 基 类的 已 有 代 码 也 会 使 得 许 多 复 杂 的 功 能 实 现 起 来
要 轻松 得 多。 可 是 如 何 编 写 这 样 的 应 用, 以 合 理 地 继 承、利 用 和 改 造PFC 的 基 本 框 架, 以 及 使 用PFC
时 应 注 意 的 事项, 却 是 十 分 复 杂 的 问 题, 在 这 里 无 法 用 几 千 字 就 能够 讲 清 楚。 不 过 我 们 仍 然 能 够 像
使 用 以 往 版 本 的 类 库一 样, 只 是 借 用PFC 中 一 些 对 象 的 基 本 功 能 以 省 去 自 己编 写 代 码 的 麻 烦。
本 文将 主 要 介 绍 如 何 利 用PFC 中 几 个 数 据 窗 口 功
能, 为 我 们的 编 程 带 来 便 利。
我 们在 应 用 中 会 遇 到 层 次 型 关 系 的 数 据, 例 如 部
门 和 雇 员实 体 之 间 的 关 系。 在 对 一 个 部 门 下 雇 员 的 数 据 进 行 维护 时, 可 以 使 用Master/Detail 的 表
现 形 式, 在 数 据 窗 口dw_1 表现 已 有 部 门 的 数 据, 并 根 据 用 户 选 择 的 某 一 条 记 录,在dw_2 中 变 换 所 选
定 部 门 雇 员 的 信 息, 并 对 雇 员 信 息 进行 维 护。
首 先声 明 一 个 全 局 变 量:
n_cst_appmanager gnv_app
在 应 用 的Open 事 件 中 加入:
gnv_app = CREATE n_cst_appmanager
gnv_app.Event pfc_Open(commandline)
在 应 用 的Close 事 件 中 键入:
gnv_app.Event pfc_Close( )
DESTROY n_cst_appmanager
在 窗口 中 我 们 定 义dw_1 和dw_2 为PFC 中u_dw 的 实
例 对 象, 在 窗 口 的Open 事 件 中 我 们 编 程 如 下:
// 设 置dw_1 和dw_2 的 级 联 方 式
dw_1.of_setlinkage(true)
dw_2.of_setlinkage(true)
dw_1.of_settransobject(sqlca)
dw_2.of_settransobject(sqlca)
// 定 义dw_1 和dw_2 的 级 联 关 系
dw_2.inv_linkage.of_linkto(dw_1)
dw_2.inv_linkage.of_setarguments("dept","dept")
dw_2.inv_linkage.of_setusecollinks(1) // 设 置 连 接 方 式 为filter
// 触 发dw_2 的pfc_retrieve() 事 件
dw_2.event pfc_retrieve()
if dw_1.event pfc_retrieve() = -1 then
messagebox(" 错 误"," 提 取 数 据 错 误-- 类 别")
else
dw_1.setfocus()
end if
在dw_1 和dw_2 的pfc_retrieve
事 件 中 将 祖 先 的 代 码 覆 盖, 并 分 别 写 下 如 下 语 句:
return this.retrieve()
在dw_1 的rowfocuschanged 事 件 代 码 中 将 对 该
数 据 窗 口 的 数 据 进 行 过滤, 而 执 行retrieve() 函 数 将 触 发 这 一 事 件。
使 用PFC 中 这 个 对 象 的 优 点 还 可 以 体 现 在 以 下
两 点: 当 需 要 更新 级 联 的 所 有 数 据 窗 口 时, 只 需 执 行dw_1.inv_linkage.of_update() 一 条 命 令 即
可 完 成; 如 果 想 要 在dw_2 中 增 加 一 行 新 数据, 可 使 用dw_2.pfc_addrow(0)
或dw_2.pfc_insertrow() 函 数, 这 个 函 数会 将dw_2 中dept 字 段 的 值 自 动 设 置 为dw_1 中dept 的 当
前 值, 从而 避 免 了 手 工 使 用GetItem 和SetItem 函 数 来 设 置。
在 上述 简 单 的 关 系 中, 并 未 充 分 体 现 出PFC 优 越
性。 但 在 一个 工 厂 中 对 零 件 的 管 理 或 是 大 型 商 场 中 对 商 品 的 管理, 往 往 是 要 通 过 多 次 的 级 联 才 能
定 位 到 某 一 类 产 品的 子 目, 在 这 样 的 系 统 中, 拥 有 一 个 像u_dw 这 样 的 基类, 编 程 的 效 率 就 可 以 提 高
许 多。
在 一个 数 据 窗 口 中 如 果 有 的 列 含 有 下 拉 式 数 据
窗 口 时, 在这 些 列 中 使 用 下 拉 搜 索 功 能 会 给 用 户 带 来 很 多 方 便,也 就 是 说 在 这 些 列 中 当 用 户 使 用
键 盘 敲 入 数 据 时, 应用 程 序 自 动 地 搜 索 下 拉 式 数 据 窗 口 中 对 应 的 值, 使 其跳 转 到 相 应 的 记 录 上。 使
用PFC, 我 们 只 需 指 定 这 个 数据 窗 口 继 承n_cst_dwsrv_dropdownsearch 对 象, 并 在 这 个 数 据 窗 口中
键 入 下 列 代 码:
constructor 事 件:
dw_1.of_setdropdownsearch(true)
dw_1.inv_dropdownsearch.of_addcolumn()
editchanged 事 件:
inv_dropdownsearch.event pfc_editchanged (row,dwo,data)
这 个数 据 窗 口 中 所 有 的 下 拉 式 数 据 窗 口 就 都 具
备 了 下 拉搜 索 功 能。 不 过 我 们 要 对 这 个PFC 对 象 进 行 改 进, 以 适应 中 国 国 情。 原 有 的 搜 索 功 能 是 要
求 用 户 在 该 列 中 输入 下 拉 式 数 据 窗 口 的 显 示 值(display column) 才 能 查 询, 这 对于 使 用 拼 音 文 字
的 用 户 是 十 分 方 便 的, 应 用 将 随 着 用户 输 入 字 符 的 增 多, 逐 步 递 进 地 显 示 相 应 的 记 录。 可是 在 中 文
应 用 软 件 中, 该 列 的 显 示 值 一 般 都 为 中 文,输 入 并 不 方 便, 所 以 有 经 验 的 操 作 员 往 往 习 惯 于 使 用他
们 熟 悉 的 编 号, 即 下 拉 式 数 据 窗 口 的 实 际 存 储 值(data column), 因 此 将 应 用 程 序 做 成 对 实 际 值
进 行 查 询 也 许 更符 合 中 国 用 户 的 习 惯。 我 们 就 需 要 在n_cst_dwsrv_dropdownsearch 中
的pfc_editchanged 事 件 中 作 如 下 修 改:
覆 盖祖 先 类 的 代 码, 键 入 新 代 码。 新 代 码 是 对 它
的 祖 先 对象pfc_ n_cst_dwsrv_dropdownsearch 中pfc_editchanged 事 件 的 代 码 作 部 分 修改, 将 其
中 第72 行
ls_dddw_displaycol = adwo_obj.dddw.displaycolumn
改 为:
ls_dddw_displaycol = adwo_obj.dddw.datacolumn
即可。( 因 代 码 过 长, 我 们 无 法 在 这 里 全 部 引 述。)
3. 使用PFC 中 有 关 数 据 窗 口 打 印 的 功 能。 在u_dw
对 象 中 还 提 供了 一 些 有 关 打 印 的 事 件 和 函 数, 我 们 首 先 在 数 据 窗 口的 构 造 事 件 或 窗 口 的Open 事 件
中, 将 数 据 窗 口 设 置 允 许打 印 预 览: dw_1.of_setprintpreview(true)。
我 们可 以 在 程 序 中 调 用dw_1.event
pfc_print()、dw_1.event pfc_printpreview()、dw_1.event pfc_pagesetup()、dw_1.event
pfc_zoom() 分 别 用 来 实 现 打 印、 打 印 预览、 页 面 设 置、 预 览 窗 口 的 放 大 缩 小 等 功 能。 在 这 些功 能
中,PowerBuilder 会 自 动 弹 出 相 应 的 窗 口, 由 用 户 设 置打 印 的 份 数, 页 面 纸 张 的 大 小, 预 览 窗 口 的
显 示 比 例等 参 数。
此 外在 窗 口 对 象 中PFC 提 供 了response 风 格 窗 口
的 祖 先 类w_response,其 中 加 入 一 些 用 户 可 能 经 常 用 到 的 功 能。 例 如 只 需 在继 承 窗 口 的open 事 件
中 加 入 如 下 语 句:this.inv_base.of_center(),可 实 现 该 窗 口 在 打 开 时 窗 口 在 屏 幕 的 正 中 位 置
显 示;又 如 在open 事 件 中 加 入: this.of_setbase(true), 每 个 继 承 窗 口缺 省 都 有 数 据 数 据 窗 口 存
储 功 能 等 等。
|