PB事件/函数的触发机制和触发方式
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)
动态触发的事件/函数可以是实体事件/函数,也可以没有这个事件/函数。如果找不到这个事件/函数,系统会默认跳过,不会报错。这类方式适当运用可以起到很好的效果
PB事件/函数的触发机制和触发方式的更多相关文章
- EventEmitter:nodeJs事件触发机制
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.r ...
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- C#事件触发机制
C#的事件触发机制,类似于c++的回调函数机制 我先简单说一下,委托和事件的实质,后期再重开一篇博文来详细说 委托:指向方法的指针,类似于C的函数指针 事件:是一个可以存放0个或多个方法指针的数据结构 ...
- 如何在JavaScript里防止事件函数的高频触发和调用
网页中JavaScript最基本的功能是监听或响应用户的动作,这非常的有用.用户的动作有些频率非常高,有的十分罕见.有些监听器函数的执行如闪电般完成,而有些繁重的会把浏览器拖死.拿浏览器窗口的resi ...
- SkylineGlobe 如何实现FlyTo定位到目标点之后触发的事件函数
之前有朋友问,如何在Skyline里面实现FlyTo定位到目标点之后触发的事件函数呢? 下面的这段代码,就可以帮你解决这个问题. <!DOCTYPE html PUBLIC "-//W ...
- window.event.srcElement与window.event.target 触发事件的元素 触发事件对象的获取,window.event与时间函数参数的event是同一个 事件对象
判断事件触发的元素: var tag = window.event.target || window.event.srcElement; if (tag.tagName.toLowerC ...
- Mqtt paho 回调函数触发机制跟踪
Python Mqtt paho 回调函数触发机制跟踪,我使用的是 buildroot 里面的 mqtt paho , 代码在 ''' buildroot-2017.02.8/output/build ...
- 通俗理解Android事件分发与消费机制
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
- Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...
随机推荐
- codeforces gym #101987K -TV ShowGame(2-SAT)
题目链接: https://codeforces.com/gym/101987 题意: 有长度为$n$的只包含$B,R$的字符串 有m种关系,每个关系说出三个位置的确切字符 这三个位置的字符最多有一个 ...
- 5.4.2 mapFile读写和索引
5.4.2 mapFile (1)定义 MapFile即为排序后的SequeneceFile,将sequenceFile文件按照键值进行排序,并且提供索引实现快速检索. (2)索引 索 ...
- 异步机制 - BindIoCompletionCallback
直接上代码 VOID CALLBACK test_io_completion_routine( DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, ...
- jenkins权限问题
今天用jenkins的时候,构建失败,看了下控制台输出,提示是缺少权限,以前也遇到过这个问题,当时是通过把相关文件夹权限设置为777解决的,这种办法有两个不好的地方,一是这样一来任何用户都能操作这个文 ...
- bootstrap 上下页滚动
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- APP_DEBUG改成false上线之后发现:“页面错误!请稍后再试~
TP框架 页面错误!请稍后再试 把APP_DEBUG改成false上线之后发现:"页面错误!请稍后再试-". 问题一般是出在,display() 指定某个具体的模板文件后win ...
- [js]vue小结
vue基础 - vue是一个渐进式框架 vue (视图渲染) components(路由机制) vue-router(路由管理) vuex (状态管理) vuecli (构建工具) - 库和框架 库如 ...
- centos7 更改ip
http://blog.csdn.net/heimerdinger_feng/article/details/71171231 CentOS7在桥接模式下配置静态ip 原创 2017年05月04日 1 ...
- Git Command之Code Review
原文链接 准备 Step 1. Create a team and add a teammate Step 2. Create a repository with some content 应用 Cl ...
- CockroachDB学习笔记——[译]Cgo的成本与复杂性
原文链接:https://www.cockroachlabs.com/blog/the-cost-and-complexity-of-cgo/ 原作者:Tobias Schottdorf 原文日期:D ...