Cobra/Keywords/listen

Материал из Викиучебника — открытых книг для открытого мира

Listen[править]

listen подключает событие или иной код обработки, создавая обработчик событий (​​метод) для конкретного экземпляра события.
При возникновении события, метод(обработчик события) вызывается с аргументами переданными событием.
Событие определяется именем типа sig(подпись/делегата).
Любой метод приводится в качестве обработчика должен соответствовать той же сигнатуре sig.
Для отключения события от кода обработки используется ignore.
Для вызова событий используется raise.

Синтаксис[править]

listen <event>, <method-reference>

Пример[править]

use System.Windows.Forms

...
        button = Button(parent=p, autoSize=true, text='One', tag=1)
        listen button.click, ref .clickHandler
...
def clickHandler(source as Object, args as EventArgs)
    pass

Пример, показывает использование sig и объявление события и метода вызова события.

# delegate for ActionEvent  <eventName>EventHandler
sig ActionEventHandler(sender as Object, args as EventArgs)

class Generator
    # event declaration for an event called Action
    # event <eventName>Event as <sigName> (<eventName>EventHandler)    
    event actionEvent as ActionEventHandler

    # (protected) method to raise/fire the event for this class 
    # {on,fire}<eventName>Event
    def _onActionEvent(args as EventArgs)      # fireActionEvent
        raise .actionEvent, args

class Listener
    # the event handler method do<eventName>
    def doAction(source as Object, args as EventArgs)
        print 'Event received from [source]'

...
    def driver
        g = Generator()
        l = Listener()
        
        #tie the generator event to the Listener method
        listen g.actionEvent, ref l.doAction

# The event handler method can also be declared using a closure if that's desirable
        listen g.actionEvent, do(source as Object, args as EventArgs)
                    print 'Event received from [source]'

# Heres an example wrt GTK# declaring an eventhandler for an Application exit button
# the indented code on the lines following the do( is the closure code
listen button.clicked, do(sender, args as EventArgs)
    print 'Quitting'
    Application.quit

Метод обработчика события должен быть ссылкой на метод не вызовом метода.
На практике это означает, что большинство обработчиков имеют второй аргумент как имя метода в качестве ссылки.
Используйте ключевое слово ref, чтобы указать ссылку на метод.