Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_OOP док.doc
Скачиваний:
13
Добавлен:
28.03.2015
Размер:
313.34 Кб
Скачать

Указатели на методы

- это специальный элемент языка Object Pascal, на котором основана реализация событий Дельфи.

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

В отличии от указателя на функцию, указатель на метод хранит в себе два адреса:

a) адрес кода метода

б)адрес экземпляра объекта

Когда указатель на метод используется для обращения к методу, адрес экземпляра объекта появляется в коде метода под именем self.

В Object Pascal есть универсальный тип

TMethod = record

Code. Data:Pointer;

End;

Этот тип может быть использован в приведении типов для доступа к коду и данным указателей на метод

While <>nil, while name<>TObject.циклы прикрутить к лабе.

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

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

След.2 выражения эквиваленты

If sender.InheritsFrom(tButton) then…

If sender is tButton then….

Различие в том в отличии от операции is метод InheristsFrom можно применять как в отношении класса, так и объектов, ссылок на классы. InheristsFrom более гибкий..

Объявление типа указатель на метод такое как и процедурного типа, но в конце добавляются ключевые слова of object.

Type IntProceduralType = procedure (Num:integer);

IntMethodType = procedure (Num:integer) of object;

После объявления указателя на метод можно объявить переменную этого типа и присвоить ей совместимый метод некоторого объекта (т.е. метод, обладающий таким же набором параметров).

Например, при добавлении события обработчика OnClick на кнопке происходит следующее. У кнопки есть свойство с именем OnClick, являющееся указателем на метод и можно явно или неявно присвоить ему метод другого объекта, например формы.При щелчке на кнопке этот метод выполнится.

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

Пример:

*вернемся к классу Tdate. Добавим туда событие, при изменении значения даты будем извещать пользователя компонента об этом. Событие будет называться OnChange. Для определения события определим соответствующее свойство и добавим некоторые данные для хранения указателя на метод, которому соответствует событие. В класс добавляется следующее новое определение.

Type TDate = class

Private

FOnChange:TNotifyEvent; // tro lo lo

Protected

Procedure DoChange; dynamic;

Public

………………………

Property OnChange: TNotifyEvent read FOnChange write FOnChange;

End;

*** TNotifyEvent = procedure (Sender:Tobject) of object;

Пользователь этого класса может присвоить новое значение свойству и следовательно private полю FOnchange. Класс TDate при изменении данных просто вызывает метод, сохраненный в поле FOnChange. Очевидно, что этот вызов может осуществиться только если событийному свойству присвоено какое - то значение.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]