祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 6662|回复: 4

PB事件/函数的触发机制和触发方式

[复制链接]

PB事件/函数的触发机制和触发方式

[复制链接]
ehxz

主题

0

回帖

59万

积分

管理员

积分
590891
贡献
在线时间
小时
2009-5-15 10:48:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
PB作为windows下的一个非常便捷的DB开发工具,有着和windows一样的消息触发机制
PB提供了相应event/function触发机制和触发方式,用户可以根据自己的实际需要选用不同方法。

1. 触发机制 trigger/post

使用trigger会即时触发event/function;
使用post的时候则有所不同,系统会将event/function放在消息队列中,等待排在前面的event/function完成后才会执行,因为这个消息队列实现先进先出。

默认情况下系统以trigger方式触发event/function

什么情况下该用trigger,什么情况下该用post?这里举个例子简单说说。

举例:
当实现某一功能a的时候会触发某个事件/函数(A), 在这个A事件要去触发某个功能b的事件/函数(B)以及功能c的事件/函数C。

当B无需在A之后就能拿到满足的条件,这个时候采用trigger;
但C必须在A完成后才拿到足够的条件,这个时候采用post.

-- 假设
当某sle在获得焦点的时候,如果有权限修改的话就高亮显示,如果没有权的修改的时候就返回。

getFocus事件是获得焦点功能触发的,uf_check()函数能够检查权限,selectText函数能将text高亮显示

-- 分析
uf_check()函数已经获得足够的条件,selectText必须在A完成后才能触发或者不触发。

所以在这里uf_check()可以直接trigger(默认触发方式);selectText()就需要使用post,让其排在getFocus()之后执行

-- 结果
if uf_check() = true then
  post selectText(1, len(this.text))
end if


-- 总结
采用哪一种触发机制可以充两方面考虑:
a) 从触发对象考虑。
触发对象需要马上执行的应当采用trigger;
触发对象必须在某个事件/函数之后才能触发的,但必须在这个时候去完成触发动作的,采用post.

b) 从触发源考虑。
充当触发源的事件/函数在某特定功能中属于是功能完成前事件/函数的时候,应当采用post;
如果属于功能完成后的事件/函数,采用trigger.


2. 触发方式

PB也为event/function提供了几种触发的方式

a) obj.triggerEvent(event_id) / obj.postEvent(event_id) -- 只用于事件
  这一类触发方式多用于PB提供的系统event, 也可以用于触发不带参数的用户事件(user event). 或许会有疑问,为什么会常用于触发系统事件?
  个人理解是这样的,系统事件多为带参数的事件,用obj.triggerEvent(event_id) / obj.postEvent(event_id)可以省去为这些事件准备参数的工作。如果用户事件没有带参数的,也可以使用这类方式去触发。

b) obj.[trigger/post] [event/function] event_id/function_id(args) --  用于事件/函数
  这一类触发方式多用于触发带参数的用户事件/所有函数, 也可以用于不带参数的用户事件/系统事件。
  
  其实这类触发方式还可以这样写
  obj.[event/function] [trigger/post] event_id/function_id(args)  

  我们可以用说明方式来描述这种触发方式:obj.[触发机制] [触发机制] [触发对象](参数). [触发机制]默认的是trigger, [触发机制]默认的是函数, [参数]可选。
  也就是说,我们如果不写trigger/post,就会默认采用trigger机制。我们如果没有声明[触发机制],系统会理解[触发对象]为某一实体函数。如果[触发对象]是事件,那么就必须声明[触发机制]为event.

  举例说明:现有函数 uf_test(args) 和事件 ue_test(args)。我们可以采用以下方式来触发它们:
  obj.trigger event ue_test(args) / obj.post event ue_test(args)
  obj.event trigger ue_test(args) / obj.event post ue_test(args)
  obj.event ue_test(args)        / 没有对应的post方式

  obj.trigger function uf_test(args) / obj.post function uf_test(args)
  obj.function trigger uf_test(args) / obj.function post uf_test(args)
  obj.uf_test(args                  / obj.post uf_test(args)

c) 动态事件和函数
  为什么将动态事件/函数纳入某一种触发方式?其实所谓的动态触发的事件/函数也是某一object的实体事件和函数,但在触发的时候是未知的。
  第一种触发方式其实也可以触发未知的事件,但仅限于事件,而且是不带参数的事件。在这个时候就需要有一种更加灵活的触发方式来达到触发未知事件或者函数的目的。
  这类的触发方式可以混合第二中使用,但在这里就不详细解析了。以下是动态事件/函数触发方式的举例写法。

  obj.dynamic event event_id(args)
  obj.dynamic function_id(args)

  动态触发的事件/函数可以是实体事件/函数,也可以没有这个事件/函数。如果找不到这个事件/函数,系统会默认跳过,不会报错。这类方式适当运用可以起到很好的效果
共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
guanfs

主题

0

回帖

546

积分

高级会员

积分
546
贡献
在线时间
小时
2009-12-31 23:00:35 | 显示全部楼层
呵呵,学习了,这东西有用
共享共进共赢Sharing And Win-win Results
hexubh

主题

0

回帖

793

积分

高级会员

积分
793
贡献
在线时间
小时
2010-1-7 17:53:06 | 显示全部楼层
浏览,学习,学习
共享共进共赢Sharing And Win-win Results
fuxiaoyang13

主题

0

回帖

3136

积分

论坛元老

积分
3136
贡献
在线时间
小时
2010-3-29 16:46:19 | 显示全部楼层
学习!!!!!!!!!!!!!!
共享共进共赢Sharing And Win-win Results
nbhandey

主题

0

回帖

952

积分

高级会员

积分
952
贡献
在线时间
小时
2010-4-16 10:37:33 | 显示全部楼层
学习一下,谢谢
共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-12-23 00:52 , Processed in 0.190815 second(s), 7 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表