PowerBuilder应用开发系列讲座(37)
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), 每 个 继 承 窗 口 缺 省 都 有 数 据 数 据 窗 口 存 储 功 能 等 等。