КАТЕГОРИИ: Архитектура-(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; Просмотров: 406; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |