Database 版 (精华区)

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

【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】


 ----DataWindow 控 件 的 一 些 事 件 有 一 个 动 作 码 操 纵 这 个 事 件 之 后 的 缺 省
 动 作。 在Pow-erBui lder 4.0 中 我 们 可 以 使 用SetAction-Code 函 数, 来 设 置 这 个 动
 作 码 的 值 以 控 制 在 这 些 事 件 发 生 后 的 处 理 过 程。( 在PowerBuilder 5.0 中, 由
 于 事 件 可 以 有 返 回 数 值, 所 以 采 用 返 回 一 个 整 型 数 值 来 取 代SetActionCode
 函 数, 比 如 使 用return 1 取 代SetActionCode(1), 但 基 本 的 使 用 规 则 两 者 是 相 同
 的。)DataWindow 控 件 中 下 列 事 件 使 用 动 作 码: 

 ----CLICKED 

 ----DBERROR 

 ----ITEMCHANGED 

 ----ITEMERROR 

 ----PRINTPAGE 

 ----RETRIEVEROW 

 ----RETRIEVESTART 

 ----UPDATESTART 

 ---- 有 效 的 动 作 码 值 和 应 当 的 处 理 过 程 随 事 件 的 不 同 而 不 同。 

                                Clicked Event 

 ---- 无 论 何 时, 当 用 户 在DataWindow 控 件 上 点 击 时,CLICKED 事 件 被 触 发。 如
 果 点 击 在 一 个 有 效 的 行 上, 那 么DataWindow 将 自 动 把 此 行 作 为 当 前 行。 如
 果 你 不 想 换 行, 就 可 以 使 用SetActi onCode 来 停 止。 

 ----0 进 行 换 行 和CLICKED 事 件。( 缺 省) 

 ----1 停 止 处 理CLICKED 事 件。 

 ---- 例 如: 下 面 一 段 代 码 只 允 许 用 户 点 击 在 自 己 的 用 户 号 上。 

 ----//Clicked Event 

 ----//We'll assume there is an instance variable with the current user's 

 ----//User ID:string is_user_id 

 ----long ll_row 

 ----string ls_user_id 

 ----ll_row =GetClickedRow() 

 ----//No need to continue if the user didn't click on a valid row 

 ----if ll_row <1 then 

 ----return 

 ----end if 

 ----ls_user_id=GetItemString(11_row,"user_id") 

 ----//If the user_id is not the current user then disallow row change 

 ----if ls-user-id < >is-user-id then 

 ----beep(1) 

 ----SetActionCode(1) 

 ----return 

 ----end if 

                              ItemChanged Event 

 ----DataWindow ITEMCHANGED 事 件 可 以 有 几 种 不 同 的 操 作: 接 受 前 一 字 段
 的 新 值, 因 有 错 误 而 拒 绝 接 受 新 值, 拒 绝 新 值 但 是 继 续 其 它 的 处 理 过 程。
 这 些 值 如 下: 

 ----0 接 受 新 的 数 据 值。( 缺 省) 

 ----1 拒 绝 新 的 数 据 值。( 启 动ItemEr-ror 事 件) 

 ----2 拒 绝 新 的 数 据 值 但 是 焦 点 改 变。 

 ---- 在ITEMCHANGED 事 件 中 使 用SetAction-Code 函 数 可 以 进 行 多 字 段 的 交 叉
 确 认。 例 如, 银 行 系 统 中 为 确 认Account Status 是 否 可 以 转 为Inactive, 就 需 检
 验Balance 字 段 是 否 为 零: 

 ----//ItemChanged Event 

 ----Decimal (2) ld_balance //Customer Account Balance 

 ----Long ll_currow // Current Row Number 

 ----String ls_column_name //The name of the column that changed 

 ----String ls_status //Customer Account Status 

 ----ll_currow=this.GetRow() 

 ----ls_column_name=this.GetColumnName() 

 ----CHOOSE CASE ls_column_name 

 ----... 

 ----... 

 ----CASE "STATUS" 

 ----ls_status=this.GetText() 

 ----//If STATUS is Inactive 

 ----IF ls_status= "I" THEN 

 ---- ld_balance=this.GetItemDecimal (ll_currow,"BALANCE") 

 ----IF ld_balance < >0 THEN 

 ----//SET AN ERROR 

 ----this.SetActionCode(1) 

 ----RETURN 

 ----ELSE 

 ----//ACCERT THE VALUE 

 ----this.SetActionCode(0) /* not required since 0 is default */ 

 ----RETURN 

 ----END IF 

 ----END IF 

 ----END CHOOSE 

 ---- 在 程 序 中,SetActionCode 函 数 不 一 定 要 在 最 后 一 行, 但 是 由 于 其
 他DataWindow 函 数 可 能 会 重 置 动 作 码。 为 了 避 免 这 个 问 题, 一 般
 在SetActionCode 后 面 立 即 执 行Re-turn 结 束 这 个 程 序 段。 

 ---- 在ITEMCHANGED 事 件 中 使 用SetAc-tionCode 函 数 用 途 是 可 以 给 该 字 段 一
 个 新 值, 而 不 是 用 户 输 入 的 那 样。 例 如: 用 户 将 日 期 输 入 为 星 期 日, 但 是
 我 们 希 望 将 其 改 为 在 此 之 后 的 第 一 个 非 休 息 日。 实 现 这 一 功 能 并 不 像
 想 象 的 那 样 简 单: 

 ----//ItemChanged Event 

 ----date ldt_process //process date 

 ----long ll_currow // Current Row Number 

 ----string ls_column_name // The name of the column that changed 

 ----ll_currow=this.GetRow() 

 ----ls_column_name=this.GetColumnName() 

 ----CHOOSE CASE ls_column_name 

 ----... 

 ----... 

 ----CASE "process_date" 

 ----ldt_process=f_get_next_bus_date(date(this.GetText())) 

 ---- 错 误 this.SetText(ldt_process) 

 ----this.AcceptText() 

 ----... 

 ---- 执 行 上 述 代 码, 系 统 将 进 入 死 循 环。 因 为 用AcceptText 函 数 改 变 日 期 的
 同 时, 也 触 发ITE MCHANGED 事 件, 只 是 当 前 列 仍 在process-data 列 上, 这 样 就
 导 致 堆 栈 溢 出。 因 此 在ITEMCHANG ED 事 件 中 不 能 使 用Ac-ceptText 函 数, 应
 使 用 我 们 这 里 介 绍 的Se-tActionCode 这 一 函 数 来 完 成 这 一 功 能: 

 ----CASE "process_date" 

 ---- ldt_process=f_get_next_bus_date(date(this.GetText())) 

 ---- 正 确 this.SetItemText(ll_currow,"process_date",ldt_process)//set value i n buffer 

 ---- this.SetActionCode(2) // reject edit control value 

 ----RETURN 

 ---- 在Primary!Buffer 中 将process_date 的 值 置 为ldt_process,SetActionCode(2) 摒 弃 用 户
 在edit 控 件 中 输 入 的 值( 星 期 日), 并 允 许 改 变 焦 点( 没 有 错 误 发 生)。 

                               ItemError Event 

 ---- 在 任 何 时 候, 当 一 个DateWindow 列 没 有 通 过 有 效 性 检 验 或 者 这 个 值
 在ITEM-CHANGED 事 件 中 被 拒 绝 时,ITEMER-ROR 事 件 启 动。 如
 同ITEMCHANGED 事 件 一 样, 它 的 动 作 码 也 可 以 设 置 为 接 受 或 拒 绝 这 个 字
 段 的 新 输 入 值。 它 还 可 以 在 拒 绝 新 值 时, 决 定 是 否 取 消 错 误 信 息 框 的 显
 示。 ITEMERROR 事 件 的 动 作 码 可 以 是: 

 ----0 拒 绝 新 的 数 据 值 并 且 显 示 错 误 信 息;( 缺 省) 

 ----1 拒 绝 新 的 数 据 值 而 不 显 示 错 误 信 息; 

 ----2 接 受 新 的 数 据 值; 

 ----3 拒 绝 新 的 数 据 值 但 是 允 许 改 变 焦 点。 

 ---- 如 果 我 们 想 要 在 一 特 定 区 域 显 示 一 个 用 户 自 定 义 的 错 误 信 息 来 代
 替Power-Builder 本 身 错 误 信 息 框, 我 们 可 以 使 用SetActionCode 来 取 消 标 准 的
 信 息 框。 例 如, 在 前 面 例 子 中, 当 收 支 差 额 不 是0 是0 时, 我 们 就 可 以 用 这 一
 方 法 显 示 一 个 错 误 信 息: 

 ----//ItemError Event 

 ----Long 11_Currow /* Current Row Number */ 

 ----String ls_column_name /* The name of the column that changed */ 

 ----ll_currow=this.GetRow() 

 ----ls_column_name=this.GetColumnName 

 ----CHOOSE CASE s_column_name 

 ----CASE "status" 

 ----MessageBox("Error","Account cannot be changed to Inactive"+ "Balance is no t zero.") 

 ----this.SetActionCode(1) 

 ----RETURN 

 ----... 

 ----END CHOOSE 

 ---- 在ITEMERROR 事 件 中 使 用SetAc-tionCode, 我 们 就 可 以 有 选 择 地 忽
 略DataWindow 对 象 的 一 个 列 中 输 入 的 有 效 性 规 则。 例 如, 在 收 支 差 额 中,
 我 们 有 下 面 这 个 有 效 性 规 则: 

 ----Real(GetText()) <=10000 

 ---- 客 户 收 支 差 额 不 应 超 过10,000 元, 如 果 我 们 允 许 使 用 公 司 帐 户 的 客 户
 可 以 超 过10,000, 我 们 可 以 使 用 如 下 方 式: 

 ----//ItemError Event 

 ----CHOOSE CASE ls_column_name 

 ----CASE "balance" 

 ----// Allow balance over $10,000 on Corportate accounts 

 ----IF ld_balance not <=10000 AND ls_type="C" 

 ----this.SetActionCode(2) 

 ----RETURN 

 ----END IF 

 ----... 

 ---- 我 们 也 可 以 像 前 面ITEMCHANGED 事 件 那 样 在Prinary!Buffer 中 拒 绝 新 输
 入 的 值 并 填 入 新 值, 只 是 在 这 里 将 动 作 码 置 为3。 

                                DBError Event 

 ---- 在 执 行 了dw.Retrieve,dw.Update() 函 数 或 嵌 入 式SQL 语 句 并 发 生 了 一 个 数
 据 库 错 误(SQ LCode 等 于-1) 时, 触 发DBError 事 件。 许 多Power-Builder 的 开 发 商
 都 在 为 这 种 情 况 设 计 了 标 准 的 数 据 库 错 误 信 息 显 示。 为 了 使PowerBuilder
 不 显 示 缺 省 的 数 据 库 错 误 信 息, 我 们 可 以 使 用SetActioncode。DBError 事 件 的
 动 作 码 值 如 下: 

 ----0 显 示 错 误 信 息。( 缺 省) 

 ----1 不 显 示 错 误 信 息。 

 ---- 例 如: 

 ----//DBError event 

 ----MessageBox(" 数 据 库 错 误"," 错 误 值"+string(this.DBErrorCode)+& 

 ----" 错 误 信 息 为:"+this.DBErrorMessage(),StopSign!) 

 ----//Supress PB generated DB Error Message. 

 ----this.Set ActionCode(1) 

 ----return 

                                  PrintPage 

 ----PRINTPAGE 事 件 是 在 执 行dw.Print() 函 数 之 后, 数 据 传 送 给 打 印 机 之 前 触
 发。 当 打 印 一 个 DataWindow 时, 你 可 在 打 印 之 前 设 置 动 作 码 来 跳 过 一
 页。PRINT-PAGE 事 件 的 动 作 码 如 下: 

 ----0 不 跳 过 一 页;( 缺 省) 

 ----1 跳 过 一 页。 

 ---- 如 您 打 算 打 印 时 跳 过 一 页, 你 可 以 在 中PRINTPAGE 编 码 如 下: 

 ----//Printpage event 

 ----this.SetActionCode(1) 

                                RetrieveRow 

 ---- 从 数 据 库 服 务 器 中 每 次 接 受 了 一 行 记 录 均 启 动REIRIEVEROW 事 件。
 在 这 个 事 件 中, 你 可 以 设 置 一 动 作 码 来 停 止 检 索。 下 面 是RE-TRIEVEROW
 事 件 的 有 效 动 作 码: 

 ----0 继 续。( 缺 省) 

 ----1 停 止 检 索。 

 ---- 如 果 一 个DataWindow 将 命 中 很 多 行, 并 且 你 希 望 在 检 索 到 一 定 量 后 停
 止。 你 可 以 在RETR IEVEROW 事 件 中 使 用SetActionCode: 

 ----//RetrieveRow event 

 ----//Instance variable Long il_count 

 ----... 

 ----IF il_count++ > 100 THEN 

 ----// Maximum rows retrieved,stip retrieval 

 ----this.SetActionCode(1) 

 ----RETURN 

 ----END IF 

 ---- 当 用 来 给 被 检 索 行 计 数 的 临 时 变 量il_count 的 值 超 过100 时, 检 索 将 停
 止。 

 ---- 注 意: 在RETRIEVEROW 事 件 中 存 在 代 码, 那 么 检 索 每 一 行 都 会 触 发 事
 件, 这 将 降 低 检 索 的 速 度。 

 ----RetrieveStart 

 ----RETRIEVESTART 事 件 在dw.Retrieve() 函 数 之 后, 产 生SQL 传 送 给 服 务 器 之
 前 触 发。 

 ---- 在 一 些 特 定 场 合 可 能 需 要 在 开 始 一 个 检 索 之 前 停 止 它。 在RetrieveStart
 事 件 中 的 动 作 码: 

 ----0 继 续。( 缺 省) 

 ----1 不 检 索。 

 ---- 例 如: 我 们 让 一 个 用 户 输 入 检 索 标 准 的 窗 口, 在RETRIEVESTART 中 判 断
 返 回 行 数 是 否 太 多 , 以 决 定 停 止 检 索 并 且 让 用 户 缩 小 检 索 范 围。 

 ----//Retrieve Start event 

 ----Int li_count /*Expected Retrieve Count */ 

 ----... 

 ----//Get count of Rows to be retrieved 

 ----... 

 ----IF li_count >1000 THEN 

 ----MessageBox("Stop","Please narrow your search",stop!) 

 ----This.SetActionCode(1) 

 ----RETURN 

 ----END IF 

 ----... 

                                 UpdateStart 

 ---- 这 一 在 执 行Update() 函 数 之 后, 产 生 的 修 改SQL 语 句 传 送 给 服 务 器 之 前
 触 发。 

 ---- 通 过 设 置 这 一 动 作 码, 你 可 以 阻 止 修 改 传 送 给 服 务 器。UPDATESTART
 事 件 的 动 作 码 如 下: 

 ----0 继 续。( 缺 省) 

 ----1 不 修 改。 

 ---- 如 果 你 要 阻 止 执 行 修 改 语 句, 在UP-DATESTART 事 件 中 使 用 下 列 代 码: 

 ----//UpdateStart event 

 ----... 

 ----this.SetActionCode(1) 

 ----RETURN 

 ----... 

                                  综   述 

 ---- 在 很 多 情 况 下, 设 置 动 作 码 是 非 常 有 用 的。 这 里 的 例 子, 让 你 对 其 中
 几 种 情 况 有 一 个 了 解 。 当 你 对 使 用PowerScript 编 码 有 了 更 多 的 经 验 后, 你
 会 发 现SetActionCode 是 非 常 有 用 的。 

                     

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