|
PowerBuilder 中 的TreeView 控 件 为 树 状 列 表, 其 特 点 是 信 息 项 呈 树 状 层 次 结 构, 且 形 式 灵 活, 可 展 开 也 可 回 缩, 使 用 鼠 标 进 行 控 制, 操 作 简 便。 因 此 在 应 用 中, 可 将 其 与DataWindow 配 合, 一 个 提 供 信 息 的 分 类 体 系, 一 个 提 供 具 体 信 息, 实 现 信 息 的 多 级 分 类 检 索, 这 样 可 大 大 地 方 便 查 询, 提 高 系 统 的 实 用 性。 ---- 在PowerBuilder 下,TreeView 控 件 的 开 发 技 术 一 般 较 为 复 杂, 但 如 果 将 它 的 构 成 机 制 及 主 要 事 件、 函 数 领 会 清 楚, 掌 握 它 并 不 困 难。 下 面 就 是 使 用TreeView 控 件 实 现 多 级 分 类 检 索 涉 及 的 主 要 开 发 技 术。 一、TreeView 控 件 的 信 息 构 成 及 创 建 ---- TreeView 控 件 的 基 本 信 息 单 位 是TreeViewItem 项, 它 们 按 树 状 层 次 结 构 进 行 组 织( 如 图1 所 示), 每 个TreeViewItem 项 一 般 具 有 下 列 主 要 属 性: ---- Data:Any 类 型 数 据, 该 项 对 应 的 内 部 值。 ---- Label:String 型 数 据, 该 项 对 应 的 显 示 文 字。 ---- Children:Boolean 型 数 据, 为Ture 时 表 示 该 项 还 有 下 一 层( 如 图1 中 项item1), 为False 时 表 示 该 项 没 有 下 层, 不 能 被 展 开( 如 项item111)。 ---- PictureIndex:Integer 型 数 值, 该 项 对 应 的 正 常 图 标 在 图 标 队 列 中 的 编 号。 ---- SelectedPictureIndex:Integer 型 数 值, 该 项 对 应 的 选 中 图 标 在 图 标 队 列 中 的 编 号。 ---- 通 过TreeView 控 件 查 阅 信 息, 首 先 要 将 信 息 转 化 成 相 应 的TreeViewItem 项, 插 入 到TreeView 控 件 中。 这 个 工 作 可 借 助PB 提 供 的 函 数 来 完 成。 二、TreeView 控 件 实 现 多 级 分 类 检 索 涉 及 的 主 要 事 件 ---- 让TreeView 控 件 和DataWindow 配 合, 完 成 信 息 的 多 级 分 类 检 索, 开 发 过 程 主 要 涉 及 下 列 三 个TreeView 事 件: ---- Constructor 事 件: 该 事 件 在 控 件 创 建 时 触 发 ---- 选 中 该 事 件 主 要 用 来 插 入 第 一 层TreeViewItem 项, 这 样 用 户 一 进 入 检 索 界 面, 第 一 层 信 息 项 就 会 出 现 在 控 件 中。 ---- ItemPopulate 事 件: 该 事 件 在 某TreeViewItem 项 第 一 次 展 开 时 触 发, 触 发 的 同 时 系 统 会 将 该TreeViewItem 项 的 句 柄 通 过 参 数handle 传 递 过 来。 ---- 选 中 该 事 件 主 要 用 来 插 入 当 前TreeViewItem 项 对 应 的 下 层 信 息 项。 选 择 这 个 事 件 插 入 下 层 信 息 项, 开 发 时 只 需 考 虑 插 入 本 项 的 直 属 下 层, 不 必 去 管 下 层 的 下 层, 可 大 大 简 化 开 发 工 作; 另 外, 由 于 用 户 在 执 行 查 询 时 一 般 只 涉 及 一 些 个 别 类, 那 些 没 有 涉 及 的 信 息 类 没 有 展 开, 因 而 没 有 必 要 建 立 下 层 信 息 项, 在 这 里 做 到 了, 因 此 改 善 了 应 用 的 执 行 效 率。 ---- SelectionChanged 事 件: 该 事 件 在 每 次 变 更 选 择 项 后 触 发, 触 发 的 同 时 系 统 会 将 变 更 前 后 选 择 项 的 句 柄 通 过 参 数oldhandle、newhandle 传 递 过 来。 ---- 选 中 该 事 件 主 要 用 来 控 制DataWindow 显 示 当 前 信 息 类 的 内 容。 这 样 每 次 在TreeView 控 件 中 选 中 一 个 信 息 项,DataWindow 即 刻 将 其 详 细 信 息 显 示 出 来。 三、 具 体 应 用 实 例 ---- 笔 者 曾 参 与 开 发 了 一 套 医 院 信 息 管 理 系 统, 其 中 当 前 有 效 医 嘱 分 类 检 索 就 是 采 用TreeView 控 件 和DataWindow 配 合 完 成 的, 图2 就 是 它 的 操 作 界 面。 ---- 界 面 上 的TreeView 控 件 按 多 级 分 类 体 系 给 出 了 当 前 所 有 有 效 医 嘱 项 目, 每 在 其 中 选 中 一 个 医 嘱 项 目, 旁 边 的DataWindow 即 会 列 出 实 施 该 项 医 嘱 的 病 人 清 单, 并 给 出 人 数 统 计 结 果。 其 中 医 嘱 项 目 的 分 类 是 这 样 进 行 的: 首 先 根 据 医 嘱 的 性 质 进 行 了 一 级 分 类, 分 为 长 期、 临 时 两 大 类; 在 一 级 分 类 的 基 础 上 又 根 据 医 嘱 的 种 类 进 行 了 二 级 分 类, 长 期 医 嘱 分 为 药 物 类、 护 理 类, 临 时 医 嘱 分 为 药 物 类、 护 理 类、 检 查 类; 在 二 级 分 类 的 基 础 上 又 根 据 医 嘱 的 具 体 类 型 进 行 了 三 级 分 类, 药 物 类 分 为 口 服、 肌 肉 注 射、 静 脉 点 滴 等 类, 护 理 类 分 为 特 护、 一 级 护 理、 二 级 护 理 等, 检 查 类 分 为 各 类 具 体 检 查, 由 此 形 成 了 三 级 分 类 体 系。 ---- 为 了 简 化 编 程, 窗 口 上 又 增 设 两 个DataStore 对 象--ds_yzzl 和ds_yzjtzl, 其 中ds_yzlx 的 作 用 是 根 据 医 嘱 性 质 到 库 中 提 取 当 前 医 嘱 种 类, 而ds_yzjtlx 则 是 根 据 医 嘱 性 质、 种 类 到 库 中 提 取 当 前 有 效 医 嘱 的 具 体 类 型。 ---- 下 面 即 是3 个 事 件 的 对 应 脚 本: TreeView 控件Constructor 事件 TreeViewItem tv_new ---- // 建 立 一 个 图 标 队 列, 供 其 中 的TreeViewItem 项 引 用, 在 这 里 建 立 主 要 是 为 了 能 够 控 制 图 标 大 小 // 首 先 设 定 图 标 显 示 尺 寸 This.PictureHeight=15 This.PictureWidth=16 ---- // 图 标 队 列 由4 个 图 标 构 成, 前3 个 用 于 标 识 医 嘱 类 项 目 的 级 别, 第4 个 用 于 标 识 项 目 的 选 中 状 态 This.AddPicture("DosEdit5! ") This.AddPicture("custom023!") This.AddPicture("custom036!") This.AddPicture("Custom050!") ---- // 建 立 第 一 级 医 嘱 类 项 目, 本 级 项 目 共 两 个, 一 个 是 长 期 医 嘱 项 目, 一 个 是 临 时 医 嘱 项 目 tv_New.Label='长期医嘱' tv_New.Data='0' tv_New.PictureIndex=1 tv_New.SelectedPictureIndex=4 tv_New.Children=True This.InsertItemLast(0, tv_New) tv_New.Label='临时医嘱' tv_New.Data='1' This.InsertItemLast(0, tv_New) TreeView控件的ItemPopulate事件 Integer Level, n, I string Parm1, Parm2 Long 11_Parent TreeViewItem tv_Current, tv_Parent, tv_New //由句柄获得TreeViewItem项,存入变量tv_Current GetLtem(handle, tv_Current) Level=tv_Current, Level+1 tv_New. PictureIndex=Level tv_New.SelectedPictureIndex= 4 //根据展开级别,建立当前展开项目 CHOOSE CASE Level CASE 2 //展开第2级医嘱类项目 tv_New.Children=True Parm1= tv_Current, Data //通过ds_yzzl检索当前项目类所具有的医嘱种类 n= ds_yzzl.Retrieve(Parm1) //依次到ds_yzzl中提取医嘱种类,建立该项目 FOR i=1 TO n //取ds_yzzl中zl字段的显示内容和内部值, 作为这里对应项的显示文字和内部值 tv_New.Label=ds_yzzl.Describe("evaluate ('lookupdisplay(zl)',"+ string(i)+")") tv_New.Data=ds_yzzl.GetItemString(i, 'zl') This.InsertItemLast(handle, tv_New) NEXT CASE 3 //展开第3级医嘱类项目 tv_New.Children=false //由句柄获取其父项的句柄 11_Parent=FindItem(ParentTreeItem!,handle) GetItem(11_Parent, tv_Parent) Parm1=tv_Parent.Data Parm2=tv_Current.Data //通过ds_yzjtlx检索当前医嘱类所具有的具体医嘱类型 n=ds_yzjtlx.retrieve(Parm1, Parm2) //依次到ds_yzjtlx中提取具体医嘱类型,建立该项目 FOR i=1 TO n tv_New.Label=ds_yzjtlx.Describe("evaluate ('lookupdisplay(jtlx)',"&+ string(i)+")") tv_New.Data= ds_yzjtlx.GetItemString(i,'jtlx') This.InsertItemLast(handle, tv_New) NEXT END CHOOSE TreeView控件的SelectionChanged事件 integer Level, string Parm1, Parm2, Parm3 long 11_Parent TreeViewItem tv_Current, tv_ Parent GetItem(newhandle, tv_Current) Level=tv_Current.Level //判断当前项目是否为第3级医嘱类, 如是让旁边的DataWindow列出实施该项医嘱的病人清单 //否则,将其置空。 IF Level=3 THEN 11_Parent=FindItem(ParentTreeItem!,newhandle) getitem(11_Parent, tv_Parent) Parm2=tv_Parent.data 11_Parent=FindItem(ParentTreeItem!, 11_Parent) GetItem(11_Parent, tv_Parent) Parm1=tv_Parent.data Parm3=tv_Current.data dw_1.SetFilter("xz='"+Parm1"'and zl'" +parm2+"'and jtlx='+Parm3+"'") dw_1. Filter() ELSE dw_1.SetFilter('1=2') dw_1. Filter() END IF ---- 至此,TreeView控件涉及的开发工作宣告完成。
|