Вход/Регистрация
Технологии программирования
вернуться

Камаев В А

Шрифт:

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

Object.OnMouseMove:= Object2.OnMouseMove;

Но какой механизм позволяет подменять обработчики, ведь это не просто процедуры, а методы? Здесь как нельзя кстати приходится введенное в Object Pascal понятие указателя на метод. Помимо явно описанных параметров методу передается еще и указатель на вызвавший его экземпляр (Self). Вы можете описать тип процедуры, которая будет совместима по присваиванию с методом (т. е. предусматривать получение Self). Для этого в ее описание нужно добавить зарезервированные слова of Object. Указатель на метод — это указатель на такую процедуру:

type

TmyEvent = procedure(Sender: TObject;

var Avalue: Integer) of object;

T1stObject = class;

FOnMyEvent: TMyEvent;

property OnMyEvent: TMyEvent read FonMyEvent

write FonMyEvent;

end;

T2ndObject = class;

procedure SetValue1(Sender: TObject;

var Avalue: Integer);

procedure SetValue2(Sender: TObject;

var Avalue: Integer);

end;

…

var

Obj1: T1stObject;

Obj2: T2ndObject;

begin

Obj1:= T1stObject.Create;

Obj2:= T2ndtObject.Create;

Obj1.OnMyEvent:= Obj2.SetValue1;

Obj2.OnMyEvent:= Obj2.SetValue2;

…

end;

Как в этом примере, так и повсюду в Delphi за свойствами-событиями стоят поля, являющиеся указателями на метод. Таким образом, при делегировании можно присваивать методы других классов. Здесь обработчиком события OnMyEvent объекта Obj1 по очереди выступают методы SetValue1 и SetValue2 объекта Obj2.

10. ФУНКЦИИ КЛАССА

В Object Pascal имеется возможность определения полей процедурного типа. Очевидно, что в теле функций, привязываемых к этим полям, разработчику необходим доступ к другим полям объекта, методам и т. п. Возможность такого доступа базируется на передаче в эти функции неявного, но доступного в их коде параметра, автоматически принимающего значение поля объекта Self. Такие функции называются функциями классов. Для объявления функций классов необходимо использовать специальную конструкцию function … of object.

11. ПРИВЕДЕНИЕ ТИПОВ

На операции с переменной определенного типа компилятор обычно налагает ограничения, разрешая выполнение только тех операций, которые характерны для указанного типа данных. Иногда компилятор осуществляет автоматическое приведение типа, например, при присвоении целого значения действительной переменной.

В языке Pascal имеется механизм явного приведения типов.

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

Выражение, представленное в следующем примере, возвращает True, если переменная AnObject ссылается на образец объектного типа TMyClass или одного из его потомков.

AnObject is TmyClass

Сама по себе операция is не является операцией задания типа. В ней лишь проверяется совместимость объектных типов. Для корректного приведения типа объекта применяется операция as:

With AnObject as TmyClass do…

Возможен и такой способ приведения типа без явного указания as.

With TMyClass(AnObject)do…

В программах перед операцией as проверяют совместимость типов с помощью операции is. Если типы несовместимы, запускается обработчик исключительной ситуации EinvalidCast.

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

If AnObject is TobjectType then

  • Читать дальше
  • 1
  • ...
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: