Database 版 (精华区)

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

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

        在 数 据 窗 口 中, 我 们 总 不 可 避 免 要 使 用 到 滚 动 条。 在 缺 省 状 态 下,
 当 用 户 点 击 垂 直 滚 动 条 时, 当 前 的 数 据 窗 口 滚 动 显 示 一 页 或 一 行 新 内
 容, 可 是 有 时 我 们 希 望 在 用 户 点 击 滚 动 条 时, 系 统 有 另 外 的 响 应。 在
 数 据 窗 口 的 事 件 中, 全 局 变 量message 中wordparm 属 性 指 示 了 是 何 种 滚 动
 类 型 导 致 了 这 个 事 件 的 发 生。 
        WordParm 的 值
                                     垂 直 滚 动 类 型 
        0
                                     行 向 上 滚 动 
        1
                                     行 向 下 滚 动 
        2
                                     页 向 上 滚 动 
        3
                                     页 向 下 滚 动 
        4
                                     竖 直 移 动 

        通 过 判 断 这 些 滚 动 类 型, 我 们 就 可 以 改 变 它 的 缺 省 动 作, 手 工 对 滚
 动 方 式 进 行 控 制。 例 如 在 某 些 情 况 下, 我 们 希 望 用 户 点 击 滚 动 条 时,
 记 录 能 够 一 行 一 行 的 滚 动。 下 列 的 代 码 可 以 在tabular、freeform 和grid 表 现
 形 式 的 数 据 窗 口 中, 实 现 这 样 的 功 能。 在数据窗口的OTHER事件中: integer
 li_wordparm li_wordparm = Message.WordParm if Message.Number = 277 then if li_wordparm =
 1 or li_wordparm = 3 then //捕捉行向下滚动和页向下滚动的事件,
 使屏幕向下滚动一条记录,并将数据窗口 //的聚焦向下移动一行 dw_1.ScrollToRow(
 dw_1.GetRow() + 1) elseif li_wordparm = 0 or li_wordparm = 2 then
 //捕捉行向下滚动和页向下滚动的事件, 使屏幕向下滚动一条记录,并将数据窗口
 //的聚焦向上移动一行 dw_1.ScrollToRow(dw_1.GetRow() - 1) else RETURN end if
 //避免缺省的数据窗口的滚屏行为 Message.Processed=TRUE end if 

        在 开 发 过 程 中, 我 们 可 能 会 大 量 的 使 用Master/Detail 形 式 的 数 据 窗 口
 来 表 现 数 据。 所 谓Master/Detail 风 格 就 是 在 一 个 窗 口 中 有 两 个 数 据 窗 口 组
 成 主 表 和 细 目 表, 分 别 显 示 数 据 库 中 的 两 张 相 关 联 的 表, 这 一 格 式 可
 用 于 展 现 给 定 事 物 的 两 套 数 据 的 关 系。 

        使 用Master/Detail 形 式 的 一 种 可 能 性 是 使 两 个 数 据 窗 口 显 示 同 一 套 数
 据, 其 中Master 的 数 据 用 于 浏 览, 不 能 修 改, 而Detail 的 数 据 窗 口 显 示 的
 是 与Master 窗 口 的 相 关 的 更 为 详 细 的 信 息, 是 可 以 修 改 的。 这 时 您 希 望
 用 户 只 能 够 滚 动Master 窗 口, 同 时 使Detail 窗 口 显 示 响 应 的 信 息, 而 不 希
 望 用 户 能 够 使 用 滚 动 条 来 滚 动Detail 数 据 窗 口, 翻 看 无 关 的 信 息。 

        下 面 的 代 码 就 是 用 于 避 免 用 户 滚 动Detail 数 据 窗 口, 翻 看 到 其 它 行 的
 记 录。 

        事 件 名 称:Keypressed 

        描 述:Keypressed 为 一 个 用 户 自 定 义 事 件, 在 数 据 窗 口 控 件 的Script 画
 笔 中 定 义, 它 的 事 件 编 号 为pbm_dwnkey, 当 用 户 有 按 键 操 作 时 触 发。 

 Script:
 IF (KeyDown(keytab!)) OR (KeyDown(keyEnter!)) OR
                       (KeyDown(keyDownArrow!))  &
 OR      (KeyDown(KeyUpArrow!)) OR (KeyDown(KeyPageDown!)) 
                      OR &
         KeyDown(KeyPageUp!)) &
 THEN
         This.SetRedraw(False)

        // 当 用 户 按 下 上 述 键 时, 系 统 将 不 与 响 应, 避 免 数 据 窗 口 自 动 进 行
 相 应 的 操 作 
        END IF 

        在 上 面 的 的 事 件 中, 我 们 使 用 了SetReDraw() 函 数, 这 将 阻 塞 用 户 对 数
 据 窗 口 诸 如 更 新 等 操 作, 我 们 必 须 在 下 列 事 件 中 取 消 用 户 对 数 据 窗 口
 进 行 正 常 操 作 的 阻 塞。 

  事 件 名 称:  RowFocusChanged
 Script:
 This.ScrollToRow(myrow)
 //myrow是一个实例变量,它的值是这个数据窗口当前应当显示的记录数
 This.SetRedraw(True)
 // 允 许 对 数 据 窗 口 进 行 操 作
  事 件 名 称:ItemFocusChanged
 Script:
 This.SetRedraw(True)
 //允许用户在同一条记录内进行水平滚动

        在 有 些 情 况 下, 我 们 会 使Master 和Detail 两 个 数 据 窗 口 显 示 相 同 的 内
 容, 我 们 可 以 使 用ShareData() 函 数 令Detail 数 据 窗 口 共 享Master 窗 口 的 数 据,
 如 何 在 使 用 滚 动 条 滚 动 其 中 的 一 个 窗 口 时, 另 一 个 窗 口 能 够 同 步 进 行
 滚 动 呢 ? 如 果 您 没 有 对Master 数 据 窗 口 使 用"Retrieve as Needed" 选 项, 这 一
 个 功 能 的 实 现 是 十 分 简 单 的。 

        假 设Master 数 据 窗 口 名 称 为dw_1, 对 其SCROLLVERTICAL 事 件 编 程 如
 下: 

 integer vmax_1, vpos_1,vmax_2, vpos_2
 string r_code
 decimal vmax_1_percent
 vmax_1 = integer(dw_1.describe("datawindow.verticalscrollmaximum"))
 vpos_1  =integer(dw_1.describe("datawindow.verticalscrollposition")) 
 vmax_2 = integer(dw_2.describe("datawindow.verticalscrollmaximum")) 
 vmax_1_percent = vpos_1 / vmax_1 
 vpos_2 = vmax_1_percent * vmax_2 
 r_code = dw_2.modify("datawindow.verticalscrollposition="+string(vpos_2)) 
 // 检 验 是 否 修 改 成 功
 if r_code <> "" then
         beep(6)
         mle_1.text = "dw_1scroll = "+r_code+" vpos_2 = "+string(vpos_2)
 // 在scrollvertical 事 件 中 无 法 使 用MessageBox 弹 出 错 误 信 息 框
 end if 
 Detail数据窗口名称[qu1]为dw_2,对其SCROLLVERTICAL事件编程如下:
 integer vmax_1, vpos_1,vmax_2, vpos_2
 string r_code
 decimal vmax_2_percent 
 vmax_2 = integer(dw_2.describe("datawindow.verticalscrollmaximum"))
 vpos_2  = integer(dw_2.describe("datawindow.verticalscrollposition")) 
 vmax_1 =integer(dw_1.describe("datawindow.verticalscrollmaximum")) 
 vmax_2_percent = vpos_2 / vmax_2 
 vpos_1 = vmax_2_percent * vmax_1 
 r_code = dw_1.modify("datawindow.verticalscrollposition="+string(vpos_1)) 
 // 检 验 是 否 修 改 成 功
 if r_code <> ""then
         beep(6)
         mle_1.text = "dw_1 mod "+r_code
 end if 

        谈 到 这 里, 我 们 又 要 引 入 一 个 新 话 题, 这 就 是 在 某 些 事 件 中 避 免 使
 用MessageBox 的 问 题: 

        当 用 户 进 行 的 错 误 操 作 时, 我 们 应 当 在 屏 幕 上 弹 出 一 个 提 示 框, 警
 告 发 生 的 错 误 或 提 示 将 要 发 生 的 事 情, 以 引 起 用 户 的 注 意; 有 些 程 序
 员 也 喜 欢 在 调 试 程 序 时, 使 用MessageBox 函 数 显 示 当 前 的 系 统 状 态。 可
 是 在PowerBuilder 的 某 些 改 变 控 件 聚 焦 的 事 件 中, 系 统 是 无 法 显 示 信 息 框
 的, 我 们 必 须 使 用response 类 型 的 窗 口 来 取 代 信 息 框: 在 这 些 事 件 中 使
 用POST 方 式 调 用 一 个 新 事 件, 在 新 事 件 中 打 开 这 个response 窗 口。 

        某 些 窗 口 控 件( 包 括 按 钮 在 内) 是 由 于 聚 焦 的 改 变 而 捕 获 鼠 标 的,
 在 这 些 控 件 的 某 些 事 件 中 应 避 免 使 用MessageBox 函 数 的。 这 些 事 件 包 括
 这 样 几 类: 

        1. 事 件 名 称: 

  Modified                  
  GetFocus
  LoseFocus
  ItemFocusChanged
  Activate
  Deactivate

        不 能 使 用 的 原 因: 由 于 聚 焦 的 改 变 而 导 致 循 环。 

        2. 事 件 名 称: 

  ScrollVertical             
  ScrollHorizontal                                        
  ScrollBar 对 象

        不 能 使 用 的 原 因:MessageBox 将 导 致 消 息 队 列 的 过 载, 不 要 在 任 何 卷
 滚 的 事 件 中 使 用MessageBox 函 数。 

        3. 事 件 名 称: 
        ReSize 

        不 能 使 用 的 原 因: 当 用 户 点 击MessageBox 的OK 框 后, 父 窗 口 将 重 新 获
 得 聚 焦, 并 再 次 触 发resize 事 件, 弹 出 另 外 的 一 个MessageBox, 这 将 导 致 无
 穷 循 环。 

        4. 事 件 名 称: 
        Open (Response 窗 口) 

        不 能 使 用 的 原 因: 这 将 在 打 开 窗 口 时 同 时 有 多 个 窗 口 模 板, 从 而 导
 致 了 不 可 预 料 的 结 果。 

        此 外,MessageBox 还 将 触 发Activate 或Deactivate 事 件。 因 此 有 些 情 况 下,
 您 可 以 将 信 息 写 在 窗 口 的 标 题、 微 帮 助 上, 或 是 使 用 单 行 编 辑 器, 使
 用Beep() 函 数 有 时 也 可 以 达 到 指 示 作 用, 而 不 必 须 非 使 用MessageBox 不
 可。 

        我 们 言 归 正 传, 当Master 数 据 窗 口 没 有 使 用"Retrieve as Needed" 选 项 时,
 上 面 的 代 码 就 可 以 得 到 满 意 的 结 果, 而 如 果 您 为 了 得 到 更 快 的 响 应 速
 度 而 使 用 了"Retrieve as Needed" 时, 结 果 就 没 有 这 么 简 单 了。 在 用 户 点
 击dw_2 的 滚 动 条 使 之 滚 动 到 最 下 部 时, 因 数 据 窗 口 已 将 数 据 显 示 到 了
 最 后 一 条, 这 就 触 发dw_1 从 后 台 数 据 库 中 攫 取 新 的 数 据, 这 样 当dw_1 数
 据 窗 口 中 有 了 新 数 据, 系 统 会 自 动 发 出 消 息, 使 共 享 数 据 的dw_2 复 位,
 滚 回 到 最 初 的 位 置。 这 样 将 触 发 了dw_2 的scrollvertical 事 件, 使dw_2 和dw_1
 均 滚 回 到 初 始 的 位 置, 因 而 无 法 得 到 正 确 的 结 果。 如 何 解 决 这 个 问 题
 呢 ? 有 兴 趣 的 读 者 可 以 简 单 思 考 一 下, 我 们 将 在 下 期 对 这 一 问 题 进 行
 进 一 步 的 讨 论。 

                       



 中国计算机世界

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