Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Делегирование событий




Type

Особенности реализации событий

......

Begin

Программирование реакции на событие

Щелкнув в Инспекторе объектов на странице Events в поле события, получим в программе заготовку метода нужного типа. Пусть, например, на форме Form1 есть текст метки Label1. Тогда для обработки щелчка мышью (событие OnClick) на элементе управления Label1 будет создана заготовка метода TForm1. Label1Click:

Procedure TForm1.Label1Click(Sender: TObject);

End;

Метод Label1Click был передан как значение свойству OnClick объекта Label1 стандартного класса TLabel. Теперь остается вписать нужный программный код.

Сообщения о наступлении события поступают от Windows. Их сотни. Работать с ними сложно. Одно из больших достижений Delphi состоит в том, что программист не работает с со­общениями Windows, хотя такая возможность у него есть. Он работает со стандартными событиями Delphi, а их около 20 и работать с ними проще.

Рассмотрим, как реализованы события.

Во время выполнения приложения Delphi вызовы обработчиков событий находятся в мето­дах, обрабатывающих сообщения Windows. В этих методах проверяется, известен ли адрес обработчика события, и, если он есть, то обработчик события вызывается.

События различны, но общим для них является параметр Sender типа TObject и ключевая фраза of object после описания типа. Параметр Sender: TObject – отправитель, он указывает на источник события. Помимо явно описанных параметров методу передается еще и Self – указатель на вызвавший его экземпляр (объект).

Самый простой тип события – TNotifyEvent, сообщение об этом событии не имеет других параметров, кроме Sender.

Тип события является указателем на метод, он определяется в самом простом стандартном случае так:

TNotifyEvent= procedure(Sender:TObject) of object;

Здесь Sender - параметр, указывающий на источник события.

Обратите внимание! Тип TNotifyEvent - это процедурный тип. Тогда событие OnClick - это свойство процедурного типа TNotifyEvent:

Property OnClick:TNotifyEvent;

События имеют разное количество и тип параметров в зависимости от происхождения и предназначения. Delphi определяет состав событий, на которые может реагировать каждый управляющий элемент формы. Список этих событий представляется на странице Events Инспектора объектов для каждого компонента. Традиционно может быть предусмотрена реакция на 3 вида событий от пользователя:

1. на нажатие и отпускание любой из кнопок мыши,

2. перемеще­ние курсора мыши

3. нажатие клавиш клавиатуры.

При извещении о нажатии клавиши методу передает­ся код нажатой клавиши, а при передвижении мыши - координаты ее положения.

По умолчанию, форма и компоненты не отвечают ни на какое заранее установленное со­бытие. Чтобы приложение реагировало на определенные события, должен быть написан код (метод), определяющий его реакцию на данное событие. Для этого Delphi в разделе interface класса формы добавит строку с заголовком метода обработки события и в разделе реализации implementation разместит заголовок метода и пустой блок для реализации этого метода.

Под делегированием понимается то, что некий объект может предоставить другому объекту отвечать на некоторые события.

Поскольку события - это свойства объекта, их значения можно изменять в любой момент во время выполнения программы. Эта возможность называется делегированием. Можно в лю­бой момент взять способы реакции на события у одного объекта и присвоить (делегировать) их другому:

Object1.OnMouseMove:=Object2.0nMouseMove;

Принцип делегирования позволяет избежать трудоемкого процесса порождения новых дочерних классов для каждого специфического случая, заменяя его простой подстановкой процедур.

Значения событий можно изменять, значит обработчики событий могут меняться.

Какой механизм позволяет подменять обработчики событий, ведь это не просто процедуры, а методы?

Здесь как нельзя кстати используется существующее в Object Pascal понятие указателя на метод. Отличие метода от процедуры состоит в том, что помимо явно описанных параметров в заголовке метода, методу всегда неявно передается еще и указатель на вызвавший его экземпляр; он хранится в переменной Self. Таким образом, можно описать процедурный тип, который будет совместим по присваиванию с методом, т.е. предусмотреть получение Self. Для этого при описании процедурного типа необходимо добавить зарезервированные слова of оbject. Указатель на метод – это указатель на такую процедуру.

Ниже приведен пример задания и использования события OnMyEvent типа TMyEvent, определенного пользователем. Для описания события некоторого процедурного типа TMyEvent в объекте надо описать поле fOnMyEvent того же типа, что и свойство: OnMyEvent:TMyEvent;

Реально это поле служит указателем на процедуру обработчика события. Кроме того, надо описать собственно само свойство:

property OnMyEvent:TMyEvent read fOnMyEvent

write fOnMyEvent;

Тут поле fOnMyEvent является ссылкой на процедуру, с помощью которой осуществляется обработка события. Это поле доступно по чтению и записи! Присваивание свойству значения — это присваивание полю fOnMyEvent указателя на метод, который будет вызываться при на­ступлении события.

Пример делегирования событий:




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


Дата добавления: 2015-07-02; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.