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事件/函数的触发机制和触发方式的更多相关文章

  1. EventEmitter:nodeJs事件触发机制

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.r ...

  2. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  3. C#事件触发机制

    C#的事件触发机制,类似于c++的回调函数机制 我先简单说一下,委托和事件的实质,后期再重开一篇博文来详细说 委托:指向方法的指针,类似于C的函数指针 事件:是一个可以存放0个或多个方法指针的数据结构 ...

  4. 如何在JavaScript里防止事件函数的高频触发和调用

    网页中JavaScript最基本的功能是监听或响应用户的动作,这非常的有用.用户的动作有些频率非常高,有的十分罕见.有些监听器函数的执行如闪电般完成,而有些繁重的会把浏览器拖死.拿浏览器窗口的resi ...

  5. SkylineGlobe 如何实现FlyTo定位到目标点之后触发的事件函数

    之前有朋友问,如何在Skyline里面实现FlyTo定位到目标点之后触发的事件函数呢? 下面的这段代码,就可以帮你解决这个问题. <!DOCTYPE html PUBLIC "-//W ...

  6. window.event.srcElement与window.event.target 触发事件的元素 触发事件对象的获取,window.event与时间函数参数的event是同一个 事件对象

    判断事件触发的元素:     var tag = window.event.target || window.event.srcElement;    if (tag.tagName.toLowerC ...

  7. Mqtt paho 回调函数触发机制跟踪

    Python Mqtt paho 回调函数触发机制跟踪,我使用的是 buildroot 里面的 mqtt paho , 代码在 ''' buildroot-2017.02.8/output/build ...

  8. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  9. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

随机推荐

  1. redhat7.4安装gitlab

    1.参考官方安装指南 https://about.gitlab.com/install/#centos-7 2.遇到的问题 2.1.启动postfix出错 错误内容 Job for postfix.s ...

  2. Maven的概述和基础(学习整理)

    1. Maven是啥 Maven是一个项目管理工具,包含了一个项目对象模型(POM),一组标准集合,一个项目生命周期(Lifecycle),一个依赖管理系统,和用来运行定义在生命周期阶段中的插件目标的 ...

  3. 分享图片压缩上传demo,可以选择一张或多张图片也可以拍摄照片

    2016-08-05更新: 下方的代码是比较OLD的了,是通过js进行图片的剪切 旋转 再生成,效率较低. 后来又整合了一个利用native.js本地接口的压缩代码 ,链接在这 .页面中有详细的说明, ...

  4. Ubuntu18.04 桌面系统的个人吐槽(主要是终端)

    装了Ubuntu18.04,桌面换风格了,使用中最大的感觉是终端切换非常反人类,可能是我还没有摸清门路.原先习惯用Alt+Tab快捷键切不同终端以及不同窗口的,现在Alt+Tab时多个终端会归成一个图 ...

  5. 【English】What is a Java StringWriter, and when should I use it?(转帖)

    转帖地址:http://www.it1352.com/989366.html Question: What is a Java StringWriter, and when should I use ...

  6. https://uwsgi-docs.readthedocs.io/en/latest/Async.html

    Beware! Async modes will not speed up your app, they are aimed at improving concurrency. Do not expe ...

  7. php错误机制总结

    转 http://www.cnblogs.com/yjf512/p/5314345.html

  8. [System.Serializable],

    [System.Serializable]添加在类,枚举,结构前面,可以让该这些对象在inspector中显示 [SerializeField]是设置非public 成员对象在inspector中显示

  9. 从Odds:比值比推导出Logtic分类的算法

    在从概率模型推导出逻辑回归算法模型的博文中,我试着从李宏毅老师的课程中讲到的概率模型去推导逻辑分类的算法模型.有幸看到另外一篇博文01 分类算法 - Logistic回归 - Logit函数,我了解到 ...

  10. TCP为什么要三次握手?

    在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是: 一端(client)A发出去的第一个连接请求报文并没有丢 ...