2008年6月14日

Event Handler

Event Handler是一種物件,具有三個word,分別是name、priority、handler,如下面的範例所示:
make object! [
name: 'view-default
priority: 50
handler: func [event] [
print ["view-event:" event/type event/offset]
switch event/type [
close [quit]
key [if event/key = escape [quit]]
]
show event/window
none ; we handled it
]
]

一般我們會在View函數中,利用下面的方式指定Event Handler:
view/options window [
handler: [
name: 'my-handler
priority: 100
handler: func [event] [
if event/type = 'down [quit]
]
]
]

注意,在上面的例子中,我們並未建立物件(make object!),而是以區塊(block!)的方式指定此Event Handler的內容。

在REBOL/View系統中,可以同時具有多個Event Handler,將它們串接起來。你可以透過handle-events與unhandle-events來分別增加與刪除Event Handler。注意,handle-events需要的參數是block!,而unhandle-events需要的參數則是物件。

每個Event Handler都具有一個name(名稱),是用來識別Event Handler之用的。想知道目前有沒有具備某名稱的Event Handler,可以透過handled-events?函數。此函數需要傳入一個名稱,它會傳出此名稱的Event Handler(如果有的話)。

利用handle-events函數加入一個Event Handler時,會根據其priority(優先權),決定其位置,優先權越高者放在越前面。例如,現在已經有兩個Event Handler,分別為優先權500的A與優先權200的B,再新增一個優先權為300的C時,最後的結果會是A、C、B,因為C的優先權介於A、B之間。

每個Event Handler都具有一個handler,這是真正處理事件的函數,所以需要事件當參數。特別注意的是,handler的傳出值如果為event,則處理完目前的Event-Handler之後,會繼續處理下一個Event Handler;handler的傳出值如果為none,則表示此事件已經處理完畢(被消耗掉了),不用再往後面的Event Handler遞送。例如,目前依序有A、C、B這三個Event Handler,其中A的handler函數傳出值為none,則C與B都不會發生作用。

沒有留言: