Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


В общем, рекомендуется пользоваться именно таким способом, а не определять собственный делегат.




Для обработки многих событий параметр типа EventArgs оказывается ненужным. Поэтому с целью упростить создание кода в подобных ситуациях в среду.NET Framework внедрен необобщенный делегат типа EventHandler. Он может быть использован для объявления обработчиков событий, которым не требуется дополнительная информация о событиях. Ниже приведен пример использования делегата EventHandler.

// Использовать встроенный делегат EventHandler. using System;

// Объявить класс, содержащий событие, class MyEvent {

public event EventHandler SomeEvent; // использовать делегат EventHandler

// Этот метод вызывается для запуска события.

public void OnSomeEvent() {

if(SomeEvent!= null)

SomeEvent(this, EventArgs.Empty);

}

}

class EventDemo7 {

static void handler(object source, EventArgs arg) {

Console.WriteLine("Произошло событие");

Console.WriteLine("Источник: " + source);

}

static void Main() {

MyEvent evt = new MyEvent();

// Добавить обработчик Handler() в цепочку событий, evt.SomeEvent += Handler;

// Запустить событие, evt.OnSomeEvent();

}

}

В данном примере параметр типа EventArgs не используется, поэтому в качестве этого параметра передается объект-заполнитель EventArgs. Empty. Результат выполнения кода из данного примера следующий.

Произошло событие Источник: MyEvent

Практический пример обработки событий

События нередко применяются в таких ориентированных на обмен сообщениями средах, как Windows. В подобной среде программа просто ожидает до тех пор, пока не будет получено конкретное сообщение, а затем она предпринимает соответствующее действие. Такая архитектура вполне пригодна для обработки событий средствами С#, поскольку дает возможность создавать обработчики событий для реагирования на различные сообщения и затем просто вызывать обработчик при получении конкретного сообщения. Так, щелчок левой кнопкой мыши может быть связан с событием LButtonClick. При получении сообщения о щелчке левой кнопкой мыши вызывается метод OnLButtonClick (), и об этом событии уведомляются все зарегистрированные обработчики.

Разработка программ для Windows, демонстрирующих такой подход, выходит за рамки этой главы, тем не менее, рассмотрим пример, дающий представление о принципе, по которому действует данный подход. В приведенной ниже программе создается обработчик событий, связанных с нажатием клавиш. Всякий раз, когда на клавиатуре нажимается клавиша, запускается событие KeyPress при вызове метода OnKeyPress (). Следует заметить, что в этой программе формируются.NET-совместимые события и что их обработчики предоставляются в лямбда-выражениях.

// Пример обработки событий, связанных с нажатием клавиш на клавиатуре, using System;

// Создать класс, производный от класса EventArgs и // хранящий символ нажатой клавиши.

class KeyEventArgs: EventArgs { public char ch;

}

// Объявить класс события, связанного с нажатием клавиш на клавиатуре, class KeyEvent {

public event EventHandler <KeyEventArgs> KeyPress;

// Этот метод вызывается при нажатии клавиши, public void OnKeyPress(char key) {

KeyEventArgs k = new KeyEventArgs();

if(KeyPress!= null) { k.ch = key;

KeyPress(this, k);

}

}

}

// Продемонстрировать обработку события типа KeyEvent. class KeyEventDemo { static void Main() {

KeyEvent kevt = new KeyEvent();

ConsoleKeylnfo key; int count = 0;

// Использовать лямбда-выражение для отображения факта нажатия клавиши, kevt.KeyPress += (sender, е) =>

Console.WriteLine(" Получено сообщение о нажатии клавиши: " + e.ch);

// Использовать лямбда-выражение для подсчета нажатых клавиш.

kevt.KeyPress += (sender, е) =>

count++; // count — это внешняя переменная

Console.WriteLine("Введите несколько символов. " +

"По завершении введите точку.");

do {

key = Console.ReadKey(); kevt.OnKeyPress(key.KeyChar);

} while(key.KeyChar!= '.');

Console.WriteLine("Было нажато " + count + " клавиш.");

}

}





Поделиться с друзьями:


Дата добавления: 2016-12-03; Мы поможем в написании ваших работ!; просмотров: 496 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Победа - это еще не все, все - это постоянное желание побеждать. © Винс Ломбарди
==> читать все изречения...

2268 - | 2092 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.