Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

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



Мы поможем в написании ваших работ!




События. Для чего же существуют события

Лабораторная работа № 11

Для чего же существуют события. Все мы, еще до того, как начать программировать, работали с компьютером в качестве пользователя. Многие из нас уже и не застали те времена, когда еще не было операционной системы Windows. Поэтому с событиями мы сталкиваемся на каждом шагу. К примеру щелкая на иконке некоторого приложения, мы запускаем это приложение. Именно щелчок мыши и есть событие. ОС зафиксировала данное событие и в ответ выполнило определенные действия, в данном случае запуск требуемого приложения. Также, примером события может служить зажим некоторого файла на рабочем столе и последующим перетаскиванием его в другую область. Здесь вообще налицо целый набор событий. Что касается программирования, то чаще пользовательские события нацелены на «вылов» момента изменения некоторых данных, перемещение мыши, заполнение данными некоторых полей и т.д. Одним словом, событие – все что угодно, что может произойти с чем-либо.

Теперь рассмотрим реальный пример. В нашей программе мы можем вносить изменения в единственное поле некоторого пользовательского класса. Причем, мы хотим быть оповещенными о каждом изменении значения этого поля в тот самый момент внесения изменений.

Первое, с чего следует начать, это подумать над методом-обработчиком. А именно, какую функциональность мы ожидаем от него получить. Предположим, что нас интересует лишь сам факт изменения данных. Для консольного приложения достаточно будет вывести сообщение на консоль:

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

Теперь займемся созданием пользовательского класса

Как видим, он имеет поле name и событие MyEvent. Как вы уже увидели, событие объявляется с помощью ключевого слова event и указанием типа делегата.

Дальше в данном классе определим некоторый метод, который будет позволять вносить изменения в поле name:

Здесь обратите внимание на вызов события. В условии мы проверяем на факт подписавшихся обработчиков на данное событие. Если ни один метод не подписан в качестве обработчика на данное событие, то мы получим исключение при попытке вызова события. Поэтому, вызывая пользовательские события всегда выполняйте проверку на null. Но как подписаться на событие. Очень просто. Для этого используется оператор "+=", соответственно снятие метода с регистрации – "- =".

Все, что на данный момент могло остаться не понятным, так это

Все просто. Создали объект класса MyClass, подписались на его событие и просто, как ни в чем не бывало, вызвали его метод, никто ж не запрещает вызывать открытые методы. И вот в этот момент и наступит событие, которое мы удачно обработаем в методе Handler().

Конечно, в таком исполнении мы не можем определить информацию о самом событии из-за того, что наш обработчик не принимает параметры. Я намеренно не хотел усложнять пример, но вы уже знаете в какой способ возможно делегатом передавать в вызывающий метод входные параметры. В итоге мы получили возможность оповещения нас сразу после изменения значения поля name. Если мы хотим получать уведомление до начала внесения изменений, то данный метод следует переписать так:

 

События на первых порах даются не очень просто. Причина в том, что очень сложно подобрать простой пример, где кроме событий не будет ничего. Их понимание – это всего лишь вопрос времени. Для более полного понимания механизма их реализации я советую посмотреть проекты windowsForms с их автоматической генерацией обработчиков событий при двойном нажатии кнопки мыши на любом контроле (к примеру Button). Заметьте, что вовсе не обязательно обработчики событий создавать в классе в котором производится подписка на событие. Место размещения обработчика может быть любым классом. Сам обработчик может быть даже статическим. Но в таком случае позаботьтесь об указании правильного квалифицированного имени обработчика.

Задание 1: Ввести и отладить приведенный пример. Рассмотреть результаты работы программы.


<== предыдущая страница | следующая страница ==>
Примеры решения задач. Задача 1. Напишите уравнения реакций взаимодействия между следующими веществами | Задание 2. В рассмотренном ранее примере событие не имело аргументов

Дата добавления: 2015-07-26; просмотров: 199; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.