
- •События
- •События. Определения
- •Прерывания
- •События. Нажатие кнопки мыши
- •События
- •Определения
- •Определения
- •Каждый подписчик должен иметь метод для обработки события подписки – обработчик события.
- •Синтаксис объявления события имеет вид:
- •Генерация и обработка события
- •//метод, в котором инициируется событие
- •static void handler2()
- •Широковещательные события (ШВС)
- •using System;
- •class X
- •class Test_Event
- •// инициирование события
- •В примере обработчики определены как методы экземпляра,
- •//класс, в котором инициируется событие
- •class Test_Event

//метод, в котором инициируется событие
public void ActEventMet ()
{
//обработчик вызывается, если делегат, //ассоциированный с событием, не null
if (activate != null)
activate();
}
}
class Test_Event
{
static void handler1()
{
Console.WriteLine ("Произошло событие - обработчик №1");
}
11

static void handler2()
{
Console.WriteLine ("Произошло событие - обработчик №2");
}
public static void Main ()
{
// создание экземпляра события
MyEvent ev_obj = new MyEvent();
//регистрация - добавление метода к цепочке обработчиков
ev_obj.activate += |
new MyEventHandler (handler1); |
//добавление метода к цепочке обработчиков |
|
ev_obj.activate += |
new MyEventHandler (handler2); |
// инициирование события
ev_obj.ActEventMet ();
}
}
12

Широковещательные события (ШВС)
Широковещательные, или многоадресные, события могут активизировать несколько обработчиков, определенных для различных объектов.
использование ШВС позволяет различным
объектам реагировать на событие.
Пример 2.
В программном коде представлены два класса.
В классах определены обработчики событий, совместимые с делегатом, указанным для события.
Будут вызываться цепочки методов - обработчиков.
13

using System;
//объявление делегата для определения события
delegate void MyEventHandler ();
//класс, в котором инициируется событие
class MyEvent
{
//объявление события
public event MyEventHandler activate;
//метод, в котором инициируется событие
public void ActEventMet ()
{
if (activate != null)
activate();
}
}
14

class X
{
public void Xhandler()
{
Console.WriteLine("обработка объектом класса Х");
}
}
class Y
{
public void Yhandler()
{
Console.WriteLine("обработка объектом класса Y");
}
}
15

class Test_Event
{
static void handler()
{
Console.WriteLine ("обработка объектом класса Test_Event");
}
public static void Main ()
{
// создание экземпляра класса с событием
MyEvent ev_obj = new MyEvent();
X x_obj = new X();
Y y_obj = new Y();
//регистрация - добавление методов к цепочке обработчиков
ev_obj.activate += new MyEventHandler (handler);
ev_obj.activate += new MyEventHandler (x_obj.Xhandler);
ev_obj.activate += new MyEventHandler (y_obj.Yhandler);
16

// инициирование события
ev_obj.ActEventMet ();
//удаление из цепочки обработчика
ev_obj.activate -= new MyEventHandler (x_obj.Xhandler);
// инициирование события
ev_obj.ActEventMet ();
}
}
17

В примере обработчики определены как методы экземпляра,
сначала в программе обязательно нужно создать объекты,
потом включить в цепочку относящиеся к объектам обработчики.
Соответственно, сгенерированные события передаются отдельно каждому экземпляру, а не классу в целом.
Эту особенность (событие инициирует обработчики всех экземпляров, для которых оно зарегистрировано) иллюстрирует
Пример 3. Реакция на событие обработчиков нескольких объектов.
using System;
//объявление делегата для определения события
delegate void MyEventHandler ();
18

//класс, в котором инициируется событие
class MyEvent
{
public event MyEventHandler activate; //объявление события
//метод, в котором инициируется событие
public void ActEventMet ()
{
if (activate != null)
activate();
}
}
class X
{
int id;
public X (int x) {id = x;}
public void Xhandler()
{
Console.WriteLine("обработка события объектом №" + id);
}
}
19

class Test_Event
{
public static void Main ()
{
// создание экземпляра класса с событием
MyEvent ev_obj = new MyEvent();
X x_obj1 = new X(1);
X x_obj2 = new X(2);
X x_obj3 = new X(3);
//регистрация - добавление методов к цепочке обработчиков
ev_obj.activate += new MyEventHandler (x_obj1.Xhandler);
ev_obj.activate += new MyEventHandler (x_obj2.Xhandler);
ev_obj.activate += new MyEventHandler (x_obj3.Xhandler);
// инициирование события
ev_obj.ActEventMet ();
}
}
20