当前位置:首页 > PowerBuilder应用开发系列讲座3
以下内容含脚本,或可能导致页面不正常的代码 第三十讲:在数据窗口中使用滚动条 -------------------------------------------------------在数据窗口中使用滚动条 在 数 据 窗 口 中, 我 们 总 不 可 避 免 要 使 用 到 滚 动 条。在 缺 省 状 态 下, 当 用 户 点WordParm 的 值 垂 直 滚 动 类 型 0 行 向 上 滚 动 1 行 向 下 滚 动 2 页 向 上 滚 动 3 页 向 下 滚 动 4 竖 直 移 动 通 过 判 断 这 些 滚 动 类 型, 我 们 就 可 以 改 变 它 的 缺省 动 作, 手 工 对 滚 动 方 式 进 使 用Master/Detail 形 式 的 一 种 可 能 性 是 使 两 个 数 据窗 口 显 示 同 一 套 数 据, 其 中 下 面 的 代 码 就 是 用 于 避 免 用 户 滚 动Detail 数 据 窗 口,翻 看 到 其 它 行 的 记 录。 事 件 名 称:Keypressed 描 述:Keypressed 为 一 个 用 户 自 定 义 事 件, 在 数 据 窗口 控 件 的Script 画 笔 中 定 义Script: 说明:上面显示的是代码内容。您可以先检查过代码没问题,或修改之后再运行. 2003-02-21 19:12:07 以下内容含脚本,或可能导致页面不正常的代码 第三十一讲:在数据窗口中使用滚动条(续) -------------------------------------------------在数据窗口中使用滚动条(续) 在 上 期 中 我 们 讨 论 了 在Master/Detail 数 据 窗 口 中, 当Master 数 据 窗 口 没 有 使 用\ 即 对dw_1 的SCROLLVERTICAL 事 件 编 程 如 下: integer vmax_1, vpos_1,vmax_2, vpos_2string r_codedecimal vmax_1_percentvmax_1 = integer(dw_1.describe(\vpos_1 =integer(dw_1.describe(\vmax_2 = integer(dw_2.describe(\vmax_1_percent = vpos_1 / vmax_1 vpos_2 = vmax_1_percent * vmax_2 r_code = dw_2.modify(\// 检 验 是 否 修 改 成 功if r_code <> \ beep(6) mle_1.text = \//在scrollvertical事件中无法使用MessageBox弹出错误信息框end if 对dw_2 的SCROLLVERTICAL 事 件 编 程 如 下:integer vmax_1, vpos_1,vmax_2, vpos_2 说明:上面显示的是代码内容。您可以先检查过代码没问题,或修改之后再运行.
第三十二讲:为下拉式数据窗口建立缓冲区 -------------------------------------------------
为下拉式数据窗口建立缓冲区
在 上 两 期 文 章 中, 我 们 提 到 了 在Master/Detail 风 格 的数 据 窗 口 中 使 用ShareData() 函 数, 可 以 保 持 两 个 数 据 窗 口 中数 据 的 一 致 性。 其 实 这 个 函 数 还 有 着 其 他 很 多 不 同 的 用途。 这 里 我 们 就 另 举 一 例。
许 多 最 终 用 户 在 使 用PowerBuilder 应 用 程 序 时 抱 怨 运行 速 度 太 慢。 一 般 来 讲, 一 个 企 业 级 的 客 户/ 服 务 器 应 用程 序 执 行 速 度 的 瓶 颈 并 不 在 于 代 码 执 行 的 效 率, 而 在 于应 用 向 后 台 数 据 库 查 询 数 据 时 等 待 后 台 响 应 的 时 间。 改进 应 用 软 件 速 度 的 关 键 在 于 减 少 应 用 向 后 台 数 据 库 查 询的 数 据 量, 减 少 网 络 的 数 据 流 量, 其 中 减 少 下 拉 式 数 据 窗口 的 查 询 量 就 是 一 个 有 效 的 方 法。
一 般 的, 为 了 用 户 输 入 方 便 和 避 免 废 键, 在 数 据窗 口 某 些 数 据 列 使 用 下 拉 式 数 据 窗 口 是 程 序 员 经 常 采 用的 方 法。 运 行 一 个 应 用, 某 一 段 时 间 所 处 理 一 般 都 是 相 同或 相 近 的 事 务, 这 样 同 时 打 开 的 不 同 窗 口 和 数 据 窗 口 却很 可 能 同 时 采 用 相 同 的 下 拉 式 数 据 窗 口。 在 显 示 这 些 窗口 前, 当 系 统 执 行 主 数 据 窗 口 的Retrieve() 命 令 时, 总 是 要首 先 到 数 据 库 中 查 询 这 些 下 拉 式 数 据 窗 口 的 数 据。 如 果我 们 能 够 减 少 这 些 查 询, 进 而 减 少 网 络 流 量, 和 后 台 数 据库 服 务 器 进 行 语 法 分 析, 设 计 查 询 算 法 和 执 行 查 询 的 时间, 这 将 能 使 应 用 的 性 能 有 较 大 的 提 高。 这 里 我 们 采 用 的方 法 是 在 客 户 端 建 立 一 个 保 存 结 果 集 的 缓 冲 区, 并 使 用ShareData 函 数 使 缓 冲 区 的 数 据 同 下 拉 式 数 据 窗 口 的 主 缓 冲 区 建 立共 享。
我 们 将 这 个 数 据 缓 冲 区 建 立 在 一 个 不 可 视 的 窗 口上, 在 这 个 窗 口 为 每 一 个 不 同 的 结 果 集 创 建 一 个 不 同 的用 户 对 象。 首 先 我 们 创 建 一 个 标 准 的 不 可 视 的 用 户 对 象,在 可 选 的 对 象 类 型 中 选 择DataStore, 我 们 并 不 需 要 为 这 个用 户 对 象 编 写 任 何 代 码, 只 要 将 其 保 存 为u_dsa 即 可。
我 们 创 建 一 个 窗 口w_resultset_server 作 为 结 果 集 服 务器, 在 这 个 不 可 视 的 窗 口 中 声 明 这 样 一 些 实 例 变 量: // 缓 冲 区 大 小
PROTECTED integer ii_cache_size // 缓 冲 区
PROTECTED u_dsa ids_cache[]
// 我 们 用 以 检 索 结 果 集 的 事 务 对 象 PROTECTED transaction i_trans
// 更 新 结 果 集 的 时 间( 设 为30 秒) PROTECTED long il_refresh_interval = 1800 // 更 新 的 起 始 时 刻
PROTECTED time itm__last_refresh
使 用dddw 的 窗 口 将 通 过fw_share_dddw() 函 数 来 访 问w_resultset_server 窗 口, 这 个 函 数 将 接 受 一 个 数 据 窗 口 和 一 个 列 名 作 为 参数。
//public function integer fw_share_dddw // 参 数: DataWindow adw_parent
// string as_column_name 表 现 形 式 为dddw 列 名 integer li_cache_idx DataWindowchild dwc string ls_dataobject_name
//dddw 所 使 用dataobject 的 名 称
ls_dataobject_name = adw_parent.Describe( as_column_name + “.dddw.name” ) IF ls_dataobject_name = “”THEN RETURN 0 // 该dataobject 是 否 存 在 缓 冲 区 中
li_cache_idx = fw_find_dataobject (ls_dataobject_name) IF li_cache_idx < 1 THEN RETURN 0 // 同 子 数 据 窗 口 共 享 数 据
adw_parent.GetChild ( as_column_name, dwc ) RETURN ids_cache[li_cache_idx].ShareData (dwc)
在 这 个 函 数 中, 为 确 定 下 拉 式 数 据 窗 口 所 使 用 的数 据 窗 口 的 名 称, 首 先 使 用 了Describe() 函 数 来 获 得 该 列 的dddw.name 属 性。 如 果 该 列 名 没 有 找 到, 或 该 列 的 表 现 形 式 不 是 下 拉式 数 据 窗 口, 这 个 函 数 的 返 回 值 为“”; 接 下 来 调 用fw_find_dataobject() 函 数, 以 确 定 这 个 数 据 结 果 集 是 否 在 缓 冲 区 中, 如 不 存 在,就 新 创 建 一 个; 最 后 使 用ShareDate() 函 数 将 缓 冲 区 中 结 果 集同 下 拉 式 数 据 窗 口 共 享 数 据。
这 个 函 数 中 调 用 的fw_find_dataobject() 函 数 如 下, 它接 受 一 个as_dataobject 参 数, 并 使 用DO...WHILE 循 环 在 缓 冲 区 中查 找 该 对 象 的 结 果 集, 如 找 到 将lb_found 设 为True, 否 则 设 为False。
//protected function integer fw_find_dataobject // 参 数: string as_dataobject integer li_cache_idx = 1 boolean lb_found = FALSE u_dsa lds_new_entry
// 定 位dataobject 所 在 的 缓 冲 区
DO WHILE (NOT lb_found) and (li_cache_idx <= ii_cache_size) IF ids_cache[li_cache_idx].dataobject = as_dataobject THEN lb_found = TRUE ELSE
li_cache_idx ++ END IF
LOOP
// 如 果 该dataobject 不 存 在 与 缓 冲 区 中, 则 创 建 一 个 新 入 口 IF NOT lb_found THEN
IF OpenUserObject (lds_new_entry) < 1 THEN RETURN 0 END IF
lds_new_entry.dataobject = as_dataobject
IF lds_new_entry.SetTransObject (i_trans) < 1 THEN RETURN 0 END IF
IF lds_new_entry.Retrieve () < 0 THEN RETURN 0 END IF
ii_cache_size ++
ids_cache[ii_cache_size] = lds_new_entry li_cache_idx = ii_cache_size END IF
RETURN li_cache_idx
如 果 该 数 据 对 象 不 存 在 于 缓 冲 区 中, 我 们 将 使 用OpenUserObject() 函 数 新 创 建 一 个 用 户 对 象, 并 将 这 个DataStore 的DataObject 属性 赋 值 为as_dataobject, 然 后 调 用SetTransObject() 函 数 和Retrieve() 函 数 查 询 结 果。
在 这 个 隐 含 窗 口 的Open 事 件 中 键 入 下 列 代 码:
i_trans = sqlca
itm_last_refresh = Now () // 设 置 起 始 时 间 Timer ( 60 )
在 窗 口 函 数fw_find_dataobject() 中 调 用SetTransObject() 时使 用 的 事 务 变 量 是i_trans, 这 样 做 的 目 的 是 为 了 软 件 更 为通 用。 我 们 在Open 事 件 中 将 这 个 实 例 变 量 赋 值 为SQLCA, 您 也可 以 根 据 需 要 给 予 不 同 的 赋 值。 我 们 使 用 了 一 个 实 例 变量itm_last_refresh 作 为 计 时 器, 并 且 设 定 每 一 分 钟 中 断 一 次,以 使 窗 口 根 据 不 同 的 需 要 更 新 缓 冲 区 中 的 数 据。
下 面 的 一 个 窗 口 函 数fw_refresh_all 用 以 更 新 缓 冲 区数 据:
//public subroutine fw_refresh_all () integer li_cache_idx // 更 新 所 以 缓 冲 区
FOR li_cache_idx = 1 TO ii_cache_size ids_cache[li_cache_idx].Retrieve () NEXT
// 重 新 设 置 更 新 缓 冲 区 的 时 间 i_tm_last_refresh = Now ()
共分享92篇相关文档