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. 解决oracle服务占用内存过高的问题

    其实这是因为安装Oracle时,为了均衡电脑性能和数据库性能,默认内存大小为物理内存的1/8,自身内存比较大时,oracle所占的内存也会变大.而通常,我们自己的环境并不需要分配那么大的内存来支持Or ...

  2. 【java】Java.math.BigDecimal.subtract()方法实例

    java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max ...

  3. vgg16 感受野计算

    code: vgg_16 = [ [3, 1], [3, 1], [2, 2], [3, 1], [3, 1], [2, 2], [3, 1], [3, 1], [3, 1], [2, 2], [3, ...

  4. 如何把Java的double类型变量保留两位小数

    已知 双精度标量 f,  如果想以字符串形式输出,小数点后保留2位,可直接通过C语言的输出格式,System.out.printf("%.2f", f), 达到目的. 如果想要先转 ...

  5. Kombu is a messaging library for Python.

    https://kombu.readthedocs.io/en/stable/introduction.html

  6. Coarse-to-Fine超分辨率相关

    1.A Coarse-to-Fine Subpixel Registration Method to Recover Local Perspective Deformation in the Appl ...

  7. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  8. leetcode刷题-559. Maximum Depth of N-ary Tree

    题目: https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ n-ary-tree的数据结果表示 // Defi ...

  9. JAVA 基础编程练习题50 【程序 50 文件 IO】

    50 [程序 50 文件 IO] 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩), 计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件&qu ...

  10. CSS 自适应技巧

    DIV的内容垂直居中 不再MARGINT-TOP多少 来居中显示 display:table-cell; #block-1{ width:100%; height:80px; display:tabl ...