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)

   動態觸發的事件/函數可以是實體事件/函數,也可以沒有這個事件/函數。如果找不到這個事件/函數,系統會默認跳過,不會報錯。這類方式適當運用可以起到很好的效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM