Database 版 (精华区)

发信人: wodeji (西西), 信区: Database
标  题: [转载] PowerBuilder 开 发 系 列 谈 (22) 
发信站: 紫 丁 香 (Tue Sep 29 17:52:35 1998), 站内信件

【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】
Email: sjhzyz@public.bta.net.cn 

        PowerBuilder5.0 自 去 年5 月 发 布 以 来, 至 今 已 有 一 年 多 了。 但 是 笔 者 却 时 常 看 到
 不 少 用 户 对5.0 的 新 特 性 缺 乏 了 解, 在 开 发 中 不 能 充 分 的 利 于5.0 的 新 特 性, 或 是 向
 笔 者 提 出 一 些 属 于 是 不 同 版 本 间 差 异 的 问 题, 其 主 要 原 因 一 方 面 由 于 许 多 有 经
 验 的, 较 早 从 事 开 发 的 程 序 员 是 从4.0 以 下 开 始 的, 他 们 向 初 学 者 传 授 的 编 程 经
 验 较 多 的 以4.0 为 主, 而 且 市 场 上 大 多 数 的PowerBuilder 的 技 术 书 籍 也 是 以4.0 为 基
 础, 而 另 一 方 面5.0 版 本 的 升 级 同 老 版 本 相 比 有 了 许 多 根 本 性 的 改 变, 它 所 新 增
 及 扩 充 的 功 能 要 较 以 往 的 版 本 升 级 为 多。 从 本 期 起, 我 们 将 陆 续 介 绍 一
 些PowerBuilder5.0 的 新 特 性。 5.0 在 窗 口 的 控 件 中 增 加 了 几 个 在Windows95 中 新 增 的 控
 件, 如 标 签 形 式(Tab Folder)、 树 型 视 图 (TreeView)、 列 表 视 图(ListView), 而 且
 这 些 控 件 在Windows3.x 的 版 本 中 也 能 正 常 使 用, 这 样 就 大 大 丰 富 了 窗 口 的 表 现 形
 式, 特 别 是 针 对Windows3.x 平 台。 

        我 们 首 先 来 介 绍 树 型 视 图 控 件。 

        树 视 图 控 件 最 适 合 显 示 具 有 层 次 关 系 的 数 据, 在Windows95 中 文 件 和 文 件 夹(
 子 目 录) 之 间 的 关 系 就 是 用 树 型 视 图 来 表 现 的。 在 数 据 库 中 树 型 视 图 是 一 个 管
 理 大 量 数 据 的 一 个 好 方 法, 因 为 用 户 只 需 简 单 地 点 击 鼠 标 就 可 以 选 择 自 己 需 要
 的 数 据。 

        当 我 们 对 数 据 的 表 现 有 以 下 要 求 时, 我 们 可 首 先 考 虑 使 用 树 型 视 图 控 件: 

        * 显 示 层 次 结 构 中 元 素 之 间 的 关 系 
        * 元 素 在 层 次 结 构 之 间 漫 游( 元 素 间 的 拷 贝、 移 动 等) 
        * 描 述 每 个 元 素 相 关 信 息 
        * 将 大 量 数 据 检 索 的 过 程 划 分 为 若 干 步 骤, 只 表 现 其 中 需 要 的 部 分 

        例 如 在PowerBuilder5.0 所 包 含 的 例 子Example50 中, 就 有 适 用 于 树 型 列 表 的 形 式 来
 表 现 的 实 例: 在 公 司 的 业 务 部 门 中 有 若 干 名 业 务 员, 他 们 每 个 人 分 别 掌 握 着 一
 定 数 量 的 客 户, 这 些 客 户 都 曾 经 同 本 公 司 签 订 了 一 些 合 同, 每 份 合 同 中 又 包 括
 有 向 公 司 订 购 的 不 同 的 产 品。 因 此 我 们 需 要 表 现 这 些 信 息 中 这 样 的 层 次 关 系:
 业 务 员---> 客 户---> 合 同---> 产 品。 又 如 一 个 新 闻 单 位 下 属 了 几 个 不 同 的 部 门, 每
 个 部 门 有 若 干 记 者, 每 个 记 者 在 不 同 时 期 又 完 成 了 一 定 数 量 的 稿 件。 当 这 个 新
 闻 单 位 的 主 编 审 稿 或 统 计 记 者 工 作 业 绩 时, 也 可 以 采 用 树 型 视 图 的 形 式 表 现 部
 门---> 记 者---> 稿 件 的 层 次 信 息。 

        对 树 型 视 图 的 编 程 是 窗 口 中 较 为 复 杂 的 部 分, 它 无 法 象 数 据 窗 口 那 样 使 用 一
 条Retrieve() 函 数 就 可 以 将 数 据 表 现 出 来。 在PowerBuilder 中 树 型 视 图 控 件 包 括 了 树 型
 视 图(TreeView) 和 树 型 视 图 项(TreeViewItem) 两 个 对 象。 其 中 树 型 视 图 对 象 可 以 在 窗 口
 画 笔 中 通 过 点 击 鼠 标 的 方 式 创 建, 而 树 型 视 图 项 则 必 须 通 过 编 程 来 声 明 及 定 义
 它 们 的 属 性。 

        当 您 在 窗 口 画 笔 中 用 鼠 标 在 窗 口 上 放 置 了 一 个 树 型 视 图 的 控 件, 这 表 明 您 将

        认 可 将 在 窗 口 的 这 个 位 置 采 用 树 型 视 图 来 表 现 一 些 信 息; 

        您 可 以 通 过 设 置 这 个 控 件 的 属 性 确 定 这 个 控 件 是 否 可 见, 是 否 显 示 连 线 等 基
 本 属 性。 

        而 这 时 运 行 这 个 窗 口, 您 看 到 的 只 是 这 个 树 型 控 件 的 空 架 子, 其 中 没 有 任 何
 数 据。 

        树 型 控 件 的 每 一 个 数 据 项 都 是 一 个TreeViewItem, 而 这 些 树 型 视 图 项 您 只 能 在
 程 序 中 逐 项 加 入。 一 般 来 讲, 当 数 据 量 很 小 而 且 数 据 间 没 有 复 杂 的 关 系 时, 可
 以 在 树 型 视 图 创 建 时 就 使 用 预 先 直 接 把 各 项 加 入 到 树 视 图 中 。 而 数 据 较 多 时,
 则 根 据 需 要 来 制 定 树 视 图, 不 要 制 定 整 个 树 视 图 控 件 的 每 一 层 的 每 一 项, 而 是
 将 用 户 检 索 数 据 的 过 程 划 分 为 若 干 步 骤。 只 是 在 用 户 打 开 一 个 具 体 的 树 视 图 项
 时, 才 根 据 用 户 的 需 要 检 索 数 据。 

        在 根 据 需 要 制 定 时, 你 可 以 在 某 一 项 被 选 中 时 制 定 该 项 的 下 一 层, 也 可 以 在
 某 一 项 被 选 中 时 制 定 该 项 的 下 两 层。 第 二 种 方 法 可 以 保 证 打 开 按 钮 与 数 据 同
 步。 

        将 树 型 视 图 项 加 入 到 树 视 图 中 的 方 法 是 使 用InsertItem() 系 列 函 数 中 的 一 种, 其
 中: 
        InsertItemFirst() 将 加 入 项 作 为 第 一 个 子 项; 
        InsertItemLast() 将 加 入 项 作 为 最 后 一 个 子 项; 
        InsertItem() 将 加 入 项 放 在 指 定 的 子 项 后 面; 
        InsertItemSort() 按 排 序 的 顺 序 放 置 加 入 项。 
        * 记 住 表 示 层 次 结 构 中 的 根 节 点 的 句 柄 为0。 
        在 制 定 树 型 视 图 控 件 时, 主 要 使 用 的 事 件 有: 
        *ItemPopulate( 只 有 在 选 中 的 项 第 一 次 被 打 开 时 才 被 激 活; 然 后 再 打 开 该 项 时
 这 个 事 件 不 再 被 激 活 ) 
        * ItemExpanding 
        * ItemExpanded 

        在 关 闭 树 型 视 图 的 下 一 层 数 据 时, 下 列 事 件 发 生: 

        * ItemCollapsing 
        * ItemCollapsed 

        请 注 意ItemPopulate 这 一 事 件 发 生 的 特 点。 如 果 数 据 是 静 态 的, 我 们 只 须 使
 用ItemPopulate 事 件, 对 树 型 视 图 控 件 中 的 每 一 项 制 定 一 次 就 可 以 了。 如 果 数 据 是
 动 态 的, 那 么 在 每 一 个 数 据 项 被 打 开 时 我 们 都 要 刷 新 它。 仅 使 用ItemPopulate 事 件
 就 不 能 满 足 需 要 了, 还 必 须 使 用 其 它 四 个 事 件 的 组 合: 用 一 个 打 开 事 件 制 定 被
 选 择 项 的 下 层 数 据。 用 一 个 关 闭 事 件 删 除 被 选 择 项 的 下 层 数 据。 下 次 再 打 开 这
 项 时, 还 要 重 新 制 定 它。 

        例1: 下 面 的 例 子 制 定 一 个 简 单 树 视 图 控 件 的 前 两 层, 该 树 视 图 控 件 用 于 显
 示 一 个CD 集 的 类 别, 歌 手 以 及 唱 片。 在Constructor 事 件 中 编 写 脚 本。 用 一 个DataStore
 搜 集 数 据。 代 码 在DataStore 中 循 环, 每 个 循 环 一 行, 用 类 别 号 和 类 别 名 字 制 定 树
 视 图 的 第 一 层。 在 显 示 歌 手 号 时 , 制 定 第 二 层。

 Integer  li_rowcount, li_row, li_current_categoryid, 
 li_last_categoryid, li_current_artistid, li_last_artistid

 TreeViewItem    ltvi_level_one, ltvi_level_two
 DataStore       lds_data
 Long  ll_handle_level_one, ll_handle_level_two
 lds_data = CREATE datastore
 lds_data.DataObject = "d_category_artist_albums"
 lds_data.SetTransObject(SQLCA)
 li_rowcount = lds_data.Retrieve()

 //在DataStore循环以定制TreeView的数据项
 FOR li_row=1 TO li_rowcount
     li_current_categoryid = Integer(lds_data.Object.category_id[li_row])
     li_current_artistid = Integer(lds_data.Object.artist_id[li_row])
     IF IsNull(li_current_artistid) THEN li_current_artist = 0
     IF li_current_categoryid <> li_last_categoryid THEN
 //定制树型视图的第一级,当歌手的编号有效时设置其下一层的属性
 ltvi_level_one.label = String(lds_data.Object.category_name[li_row])
           ltvi_level_one.data = li_current_categoryid
           ltvi_level_one.pictureindex = 1
           ltvi_level_one.selectedpictureindex = 2
           ltvi_level_one.children = (li_current_artistid>0)
           ll_handle_level_one = This.InsertItemLast(0,ltvi_level_one)
      END IF
      IF li_current_artistid <> li_last_artistid THEN
            IF li_current_artistid>0 THEN
         ltvi_level_two.label = String(li_current_artistid)
         ltvi_level_two.pictureindex = 3
         ltvi_level_two.selectedpictureindex = 3
         ltvi_level_two.data = li_current_artistid
         ltvi_level_two.children = true
         ll_handle_level_two = This.InsertItemLast(ll_handle_level_one,ltvi_level_two)
            END IF
       END IF
 li_last_categoryid = li_current_categoryid
 li_last_artistid = li_current_artistid
 NEXT

                       



 中国计算机世界出版服务公司版

--
※ 来源:.紫 丁 香 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)
页面执行时间:205.231毫秒