Cobra/Keywords/raise

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Raise[править]

raise — порождает событие, уведомляя любого настроенного поставщика о произошедшем событии. Исключение поднимается наверх лишь для того же класса и того же экземпляра.
Количество и типы аргументов raise должно соответствовать заявленным в sig, как тип для события raise с двумя исключениями:

  • sender который всегда this не должен быть указан.
  • Аргументы объект события могут быть опущены, если достаточно поведения экземпляра по умолчанию.

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

raise <event> [ [,<source>] ,<arg> [,<arg> ...]]

Наиболее распространенный случай, если число аргументов на единицу меньше, чем в sig и первый аргумент не является this
то this будет неявно передан в качестве source (первый аргумент).
Если событие было объявлено с сигнатурой без аргументов, то ни source или event-args не могут и не должны передаваться в качестве аргументов при вызове raise.

sig NoArgEventHandler                    # no parameters
event notifyEvent as NoArgEventHandler   # is public
...
raise .notifyEvent

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

use System.Windows.Forms

...
        button = Button(parent=p, autoSize=true, text='One', tag=1)
        # connect event and handling code
        listen button.click, ref .clickHandler
        ...
        # trigger the button programatically
        raise button.click, EventArgs()
        ...
        # disconnect event and its handling code
        ignore button.click, ref .clickHandler
...
def clickHandler(source as Object, args as EventArgs)
    pass

# EventArgs subclass to pass additional info in args
class BEventArgs inherits EventArgs
    var _value as int

    get value from var
    
    def init(val as int)
        base.init
        _value = val

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

class Generator
    var _count = 0 
        """local state"""
    
    # event dcl for 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

    def bump
        _count += 1 
        if _count % 20 == 0
            ev = BEventArgs(_count)
            _onActionEvent(ev)

class Listener
    # the event handler method do<eventName>
    def doAction(source as Object, args as BEventArgs)
        print 'Event from [source] - argCount is [args.count]'
            
...
class RaiseDriver
    def main is shared
        g = Generator()
        l = Listener()
        
        #tie the generator event to the Listener method
        listen g.actionEvent, ref l.doAction

        for i in 100
            g.bump    

        #untie the event and listener
        listen g.actionEvent, ref l.doAction

Нет аргументов события, то нет аргументов и при вызове события.

# delegate with no args for notifyActionEvent  <eventName>EventHandler
sig NoArgEventHandler

class Generator
    var _count = 0 
        """local state"""
    
    # event dcl for event called Action
    # event <eventName>Event as <sigName> (<eventName>EventHandler)    
    event notifyActionEvent as NoArgEventHandler

    # (protected) method to raise/fire the event for this class 
    # {on,fire}<eventName>Event
    def _onNotifyActionEvent
        raise .notifyActionEvent

    def bump
        _count += 1 
        if _count % 20 == 0, _onNotifyActionEvent

class Listener
    # the event handler method do<eventName>
    def doNotifyAction
        print 'NotifyAction Event received'
            
...
class RaiseDriver
    def main is shared
        g = Generator()
        l = Listener()
        
        #tie the generator event to the Listener method
        listen g.notifyActionEvent, ref l.doNotifyAction

        for i in 100
            g.bump    

        #untie the event and listener
        listen g.notifyActionEvent, ref l.doNotifyAction