Cobra/Keywords/raise
< Cobra
Raise
правитьraise — порождает событие, уведомляя любого настроенного поставщика о произошедшем событии. Исключение поднимается наверх лишь для того же класса и того же экземпляра.
Количество и типы аргументов raise должно соответствовать заявленным в sig, как тип для события raise с двумя исключениями:
- sender который всегда this не должен быть указан.
- Аргументы объект события могут быть опущены, если достаточно поведения экземпляра по умолчанию.
Синтаксис
править
raise <event> [ [,<syntaxhighlight>] ,<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