当前位置:首页>> PowerBuilder>> PB入门

全文搜索

精华导读

·EasyERP2004 制造行业通用性ERP管理系统
·PB中表的修改对数据窗口和报表的影响的解决办法
·在PB中实现Word内容的替换
·office xp风格菜单基本版
·用PB制作outlook界面源程序(非原来的老外版本)(
·将所见dw内容(包括计算字段)输出到execl中
·ERP在中国应用面临的问题
·PB中使用FORMULA ONE(实例篇
·控制打印机的动态库,兼容win98/98/me/nt2000/xp
·易佳自定义报表系统
·用例驱动的需求过程实践

最新发表

·在PB中如何实现数据模糊查询
·项目范围管理是项目成败的关键
·某装配型制造企业ERP系统需求分析(连载一)
·某装配型制造企业ERP系统需求分析(连载二)
·某装配型制造企业ERP系统需求分析(连载三)
·某装配型制造企业ERP系统需求分析(连载四)
·需求工程 研究现状
·项目需求的前期工作如何进行
·软件需求评审之道
·05大学生就业趋势预测 不同地域不同人才需求重点
·如何建立项目的范围
·如何确定项目的工作需求
·二季度部分城市劳动市场:用人需求以第三产业为主
·选专业要结合自身志趣和国家需求
·需求阶段项目如何监理?
·RequisitPro管理需求的一般步骤
·如何把项目评估做得更准确
·对软件项目中产生的需求进行分级管理
·如何做好范围管理?

PowerBuilder应用开发系列讲座(7)

文章来源:本网 文章编辑:admin 添加时间:2007-1-1 16:43:41

DataWindow 控件的一些事件有一个动作码操纵这个事件之后的缺省动作。 在Pow-erBuilder4.0中我们可以使用SetActionCode函数,来设置这个动作码的值以控制在这些事件发生后的处理过程。 
(在PowerBuilder 5.0中,由于事件 可以有返回数值,所以采用返回一个整型数值来取代SetActionCode 函数,比如使用return 1取代SetActionCode(1),但基本的使用规则两者是相 同 的。)DataWindow 控件中下列事件使用动作码:
  CLICKED
  DBERROR
  ITEMCHANGED
  ITEMERROR
  PRINTPAGE
  RETRIEVEROW
  RETRIEVESTART
  UPDATESTART
   有效的动作码值和应当的处理过程随事件的不同而不同。    

Clicked Event   
   无论何时,当用户在DataWindow控件上点击时,CLICKED事件被触发。如果点击在一个有效的行上,那么DataWindow 将自动把此行作为当前行。如果你不想换行,就可以使用SetActionCode来停止。   
  0 进行换行和CLICKED事件。(缺省)
  1 停止处理CLICKED事件。
   例如:下面一段代码只允许用户点击在自己的用户号上。

  //Clicked Event   
  //Well assume there is an instance variable with the current users   
  //User ID:string is_user_id   
  long ll_row   
  string ls_user_id   
  ll_row =GetClickedRow()   
  //No need to continue if the user didnt 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 事 件) 
  拒 绝 新 的 数 据 值 但 是 焦 点 改 变。 
   在ITEMCHANGED 事 件 中 使 用SetAction-Code 函 数 可 以 进 行 多 字 段 的 交 叉 确 认。 例 如, 银 行 系 统 中 为 确 认AccountStatus 是 否 可 以 转 为 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后面立 即执行Return结束这个程序段。 
   在ITEMCHANGED事件中使用SetActionCode函数用途是可以给该字段一个新值,而不是用户输入的那样。例如:用户将日期输入为星期日,但是 我们希望将其改为在此之后的第一个非休息日。实现这一功能并不像想象的那样简单: 
  //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 列 上, 这 样 就 导 致 堆 栈 溢 出。 因 此 在ITEMCHANGED 事 件 中 不 能 使 用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 拒 绝 新 的 数 据 值 但 是 允 许 改 变 焦 点。 
   如 果 我 们 想 要 在 一 特 定 区 域 显 示 一 个 用 户 自 定 义 的 错 误 信 息 来 代 替PowerBuilder 本 身 错 误 信 息 框, 我 们 可 以 使 用SetActionCode 来 取 消 标 准 的 信 息 框。 例 如, 在 前 面 例 子 中, 当 收 支 差 额 不 是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 事 件 中 使 用SetActionCode, 我 们 就 可 以 有 选 择 地 忽 略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 事 件。 许 多PoweBuilder 的 开 发 商 都 在 为 这 种 情 况 设 计 了 标 准 的 数 据 库 错 误 信 息 显 示。 为 了 使PowerBuilder 不 显 示 缺 省 的 数 据 库 错 误 信 息, 我 们 可 以 使 用SetActioncode。DBError 事 件 的 动 作 码 值 如 下: 
  0 显 示 错 误 信 息。( 缺 省) 
  1 不 显 示 错 误 信 息。 
   例 如: 
  //DBError event 
  MessageBox("数据库错误"," 错误值";+string(this.DBErrorCode)+" 错误信息为"+this.DBErrorMessage(),Sto pSign!)
  //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 是 非 常 有 用 的。 

[ ]

首页 评论 打印 刷新 返回顶部 关闭
【相关文章】  【相关评论】
目前暂时没有相关文章