В известном смысле, Sender является маской, и элемент управления, который запускает событие, входит в процедуру обработчика событий, надевая маску Sender. (Это больше, чем маска; это как если накрыть голову коробкой. Когда объект приходит в процедуру в Sender-маске, вы вообще почти ничего не можете рассказать о нем!) Это действительно - способ позволить любому классу объектов вообще заходить в процедуру обработчика событий.

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

Sender.Hint : = *I''m hosed!';

Нет! Sender является TObject, а класс TObject не обладает свойствами Hint. То, что мы пытаемся здесь сделать, это бесцельный разговор о маске. То, что нам надо сделать, так это продолжить разговор, но о другом объекте под маской (или найти лучгцую маску).

Что и привело нас к выражению AS в Sender AS TControI. Класс TControI самый близкий класс для всех четырех элементов управления общей для них формы. TControI образовывает свойство Hint (в самом деле, все элементы управления наследуют свои свойства Hint от TControI.) И если мы используем маску TControI, а не Sender, мы можем иметь доступ к свойству Hint любого элемента управлетгая, которое может войти в процедуру в личине Sender.

Так как мы знаем, что любой объект, входящий как Sender, станет, в конце концов, TControI, мы можем в этом примере обрабатывать Sender как TControI. Поэтому, независимо от того, какой объект на самом деле вошел через Sender: TEdit, TButton, TLabel или TPanel - все они являются TControl-ами, и мы будем обрабатывать их всех одинаково и присвоим новую строку к их свойству Hint. Если вы вызовете программу POLY-TEST.DPR и щелкните на любом из четырех элементов управления, Hint для этого элемента управления изменится и появится новая строка - "I'm hossed!", посредством приведения типов и полиморфного присваивания. Много форм - один оператор присваивания и - так или иначе - когзректньгй объект (тот, который породил событие OnClick) получает новые данные.

Полиморфное выполнение

Итак, полиморфное присваивание. Но, описанное мною ранее, ведет нас к тому, что в действительности является полиморфным выполнением. Механизм, в большинстве, тот же самый, и по этой причине я создавал POLITEST.DPR так, чтобы было гораздо легче демонстрировать полиморфное присваивание, чем полиморфное выполнение. Нет, отбросим это. Полиморфное выполнение довольно легко продемонстрировать.., но довольно трудно увидеть.

А теперь - как это происходит. Войдите в процедуру TForm.FormClick (я показал ее в Листинге 10.1) и уберите одну линию кода, заменив ее более простой линией:

(Sender AS TControI).Repaint;

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

Все, что мы делаем выше линии, называется методом Repaint (Перерисовать) для элемента управления, которое порождает событие OnClick. Каждый элемент управления имеет другой метод Repaint, так как каждый элемент управления ведет себя на экране другим способом (в противном случае они выглядели бы все одинаково). Итак, мы обрабатываем все четыре элемента управления как объекты TControI, которыми они все являются, и говорим им, чтобы они перерисовали себя наилучшим известным им способом. Все они делают это. Проблема состоит в том, что им не нужно перерисовывание, и мы даем им команду снова перерисовать себя, когда они уже вполне совершенно нарисованы на экране и выглядят так, как будто ничего не случилось.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в среде Delphi



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс