Database 版 (精华区)
发信人: wodeji (西西), 信区: Database
标 题: [转载] PowerBuilder 开 发 系 列 谈 (16)
发信站: 紫 丁 香 (Tue Sep 29 17:52:01 1998), 站内信件
【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】
Email:sjhzyz@public.bta.net.cn
许 多 人 在 学 习 了 窗 口 的 继 承 以 后, 就 认 为 算 是 掌 握 了PowerBuilder 的
继 承 技 术 了。 实 际 上,PowerBuilder 中 继 承 的 作 用 远 不 止 这 些。 这 里 我 们
介 绍 利 用 继 承 的 方 法, 设 计 一 个 可 重 用 的 数 据 窗 口 祖 先。 通 过 本 节 的
介 绍 您 将 看 到 继 承 技 术 在 数 据 窗 口 上 的 运 用, 体 会 到 它 在 这 一 方 面 发
挥 出 灵 活 性 和 强 大 功 能。
数 据 窗 口 的 继 承 是 通 过 自 定 义 用 户 对 象 的 方 式 扩 展 数 据 窗 口 控 件,
使 该 控 件 功 能 更 为 强 大。 在 本 节 后 面 的 部 分 中, 我 们 把 数 据 窗 口 控 件
的 用 户 对 象 祖 先 叫 作dwa_main。 您 也 可 以 把 您 的 控 件 命 名 为 任 何 您 想 要
的 名 字。
我 们 曾 在 以 前 的 文 章 中 介 绍 过, 数 据 窗 口 对 象 是 不 具 有 继 承 性 的,
但 是 我 们 可 以 利 用 具 有 可 继 承 特 性 的 数 据 窗 口 用 户 对 象 来 拓
展PowerBuilder 所 提 供 的 数 据 窗 口 的 基 本 属 性。 这 里 我 们 要 注 意 的 是 我 们
所 继 承 的 是 数 据 窗 口 控 件, 而 不 是 数 据 窗 口 对 象。
为 什 么 应 该 使 用 用 户 对 象 数 据 窗 口, 而 不 用PowerBuilder 提 供 的 呢 ?
当 您 将 一 个 数 据 窗 口 控 件 放 到 窗 口 上 时, 您 所 做 的 是 继 承 一 个 基 于 系
统 事 先 定 义 好 的 数 据 窗 口 类 来 创 建 一 个 新 的 数 据 窗 口。 这 意 味 着, 给
您 的 数 据 窗 口 增 加 功 能 方 法 只 有 一 个, 就 是 在 这 个 数 据 窗 口 控 件 的 事
件 语 句 中 增 加 代 码。 您 不 能 为 这 个 数 据 窗 口 定 义 您 自 己 的 函 数, 您 也
不 能 给 这 个 数 据 窗 口 增 加 另 外 的 属 性。 如 果 您 认 为 有 一 些 常 用 的 对 数
据 窗 口 的 操 作 需 要 封 装, 您 只 能 将 这 些 加 入 数 据 窗 口 所 在 的 窗 口。 如
果 您 希 望 两 个 不 同 的 数 据 窗 口 上 有 相 同 的 行 为, 唯 一 的 方 法 就 是 重 写
代 码。 这 是 显 然 不 是 好 的 面 向 对 象 编 程 风 格。 解 决 上 述 问 题 的 好 方 法
就 是 定 义 一 个 数 据 窗 口 用 户 对 象, 这 非 常 容 易 做 到。 您 只 要 打 开 用 户
对 象 绘 制 器, 选 择“ 新 建” 和“ 标 准 可 视 化 用 户 对 象”。 然 后 选 择 数 据
窗 口 作 为 类 型。 您 就 可 以 看 见 一 个 小 白 框。 这 就 是 您 的 数 据 窗 口 控
制, 将 它 以dwa_main 的 名 字 存 盘。dwa_main 将 是 您 的 最 底 层 的 数 据 窗 口 祖
先。
现 在, 当 您 在 窗 口 上 需 使 用 数 据 窗 口 时, 您 不 要 将PowerBuilder 内 部 的
数 据 窗 口 放 到 窗 口 上 了, 而 是 放 上 您 新 创 建 的 数 据 窗 口 用 户 对 象。 这
个 数 据 窗 口 的 名 字 应 该dw_1。 使 用 用 户 对 象 来 替 代 系 统 本 身 的 数 据 窗
口 以 后, 您 仍 可 以 象 以 前 那 样 使 用 数 据 窗 口 的 所 有 的 函 数, 属 性 和 事
件。 不 同 的 是, 您 现 在 可 以 为 您 的 数 据 窗 口 祖 先dwa_main 中 加 入 实 例 或
共 享 的 变 量, 事 件 和 函 数。 因 为 您 在 窗 口 中 用 到 的 数 据 窗 口 都 是 继 承
了 祖 先 数 据 窗 口dwa_main, 所 以 您 所 增 加 的 这 一 切 都 可 以 在 每 一 个 数 据
窗 口 控 件 中 存 在。
如 果 您 认 为 这 种 方 法 可 行, 决 定 以 后 的 设 计 都 采 用 用 户 对 象 来 替
代PowerBuilder 本 身 的 数 据 窗 口, 那 么 您 可 能 还 会 遇 到 这 样 一 个 问 题, 如
何 在 已 编 完 的 代 码 中 用 上 这 个 对 象。 这 里 我 们 介 绍 采 用 这 样 一 种 办
法, 将 您 的 数 据 窗 体 控 件 的 祖 先 对 象 由Datawindow 改 变 成 为dwa_main。
在library 画 笔 中 输 出 含 有 数 据 窗 口 的 窗 口 或 用 户 对 象, 修 改 几 个 引 用,
然 后 将 它 再 输 入 到 您 的 库 中。
注 意 在 做 这 些 操 作 之 前, 先 做 一 下 备 份。
当 您 输 出 的 窗 口 或 自 定 义 可 视 化 用 户 对 象 中, 您 可 以 看 到 类 似 下 面
的 代 码: type dw_1 from datawindow within w_anc
我 们 曾 在 以 前 的 文 章 中 介 绍 过, 这 行 代 码 的 作 用 是 告 诉PowerBuilder
编 译 器 您 定 义 了 一 个 从 数 据 窗 口 继 承 下 来 的 叫 做dw_1 的 数 据 窗 口, 因
此 我 们 只 要 在 这 里 将datawindow 改 为dwa_main, 就 可 以 使dw_1 继 承 的 对 象
改 为 有 系 统 内 部 的 数 据 窗 口 控 件 改 为dwa_main。
如 果 您 打 算 将 所 有 在 您 的 机 器 上 开 发 的 其 他 人 也 使 用dwa_main 对
象, 您 还 可 以 自 定 义 窗 口 工 具 条, 在 工 具 条 中 加 入 一 个 新 图 标 来 代 表
数 据 窗 口 用 户 对 象 的 控 件。 在 定 义 工 具 条 的 对 话 框 中, 要 求 填
入dwa_main 这 一 用 户 对 象, 并 设 置 您 希 望 得 到 的 工 具 条 文 本 和 帮 助 信
息。
数 据 窗 口 的 构 造 事 件
一 般 的, 如 果 某 些 代 码 的 初 始 化 操 作 在 应 用 中 首 次 运 行 时 被 执 行,
您 应 该 将 它 们 放 在 应 用 的open 事 件 中。 如 果 某 些 代 码 在 窗 口 被 打 开 时
执 行 其 初 始 化 操 作, 您 应 该 将 它 们 放 在 窗 口 的open 事 件 中。 同 样 如 果 想
让 代 码 在 数 据 窗 口 被“ 打 开” 时 执 行 初 始 化 操 作, 您 应 该 使 用 数 据 窗
口 的 构 造 事 件, 因 为 当 数 据 窗 口 创 建 时 构 造 事 件 被 激 发。 事 实 上, 窗
口 上 的 每 一 个 控 件 在 窗 口 打 开 之 前 都 会 激 发 自 身 的 构 造 事 件。 假 设 在
您 的 窗 口 上 有 三 个 控 件, 它 们 的 顺 序 为cb_ok,sle_1 和dw_1。 如 果 您 使
用OpenSheet() 函 数 将 该 窗 口 作 为 表 单 打 开, 您 将 得 到 以 下 的 事 件 序 列:
cb_ok::constructor
sle_1::constructor
dw_1::constructor
window::open
window::show
window::resize
window::activate
cb_ok::getfocus
如 果 您 打 开 一 个SDI 窗 口, 您 将 得 到 以 下 的 事 件 序 列:
cb_ok::constructor
sle_1::constructor
dw_1::constructor
window::open
window::activate
cb_ok::getfocus
window::show
window::resize
有 一 点 需 要 说 明 的 是, 窗 体 本 身open 事 件 中 的 所 作 的 初 始 化 工 作 是
在 所 有 控 件 的 构 造 事 件 被 激 发 后 才 执 行 的。 如 果 您 用OpenSheetWithParm()
或OpenWithParm() 函 数 向 您 的 窗 口 传 递 数 据, 那 么 您 在 构 造 事 件 中 使 用 消
息 对 象 时 就 要 特 别 小 心。 如 果 其 中 的 任 何 一 个 构 造 事 件 修 改 了 消 息 对
象 的StringParm,DoubleParm 或PowerObjectParm 属 性,open 事 件 中 使 用 的 消 息 对
象 就 不 能 得 到 正 确 的 信 息。
我 们 对 每 一 个 数 据 窗 口 的 构 造 事 件 编 程 时, 总 是 要 反 复 地 键 入
dw_1.SetTransObject(SQLCA)
事 实 上, 我 们 的 应 用 中 有90 % 以 上 是 使 用SQLCA 这 个 事 务 对 象, 如
果 我 们 采 用 用 户 对 象 的 设 计 方 法, 我 们 就 可 以 把 这 一 行 代 码 写 在 用 户
对 象 之 中, 而 可 以 省 去 在 每 次 用 数 据 窗 口 时 都 要 键 入。
Event:Constructor
Object:dwa_main
SetTransObject(SQLCA)
每 一 次 调 用 这 个 用 户 对 象, 我 们 缺 省 的 就 是 使 用SQLCA 这 个 事 务。
我 们 完 全 不 必 担 心 这 样 作 会 出 现 什 么 问 题。 因 为 如 果 您 使 用 外 部 数 据
窗 口,PowerBuilder 是 根 本 不 会 理 会 您 曾 经 执 行 过 的 任 何 事 务 对 象, 如 果
您 使 用 的 事 务 不 是SQLCA, 那 么 您 只 需 在 继 承 后 的 数 据 窗 口 中, 再 次 调
用SetTransObject() 这 个 函 数, 将 您 用 到 的 事 务 对 象 引 入, 系 统 就 会
将SQLCA 这 个 对 象 覆 盖。
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.97.236.132]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: whs.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.916毫秒