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毫秒