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

33. Понятие события

Компоненты Дельфы программируются с использованием 3х элементов языка – свойств, методов и событий.

События – это не в полнее новый механизм, т.к. технически события это свойство, которое в отличии от других свойств ссылается не на данные а на методы. Т.е. событие – это свойство типа “указатель на метод”.

События в Дельфи генерируются, например, в следующих случаях, например, когда пользователь воздействует на компонент (щелкает мышкой).

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

Большинство событий в Дельфи инициируется при получении соответствующего сообщения Windows, хотя событие и не образует взаимно-однозначного соответствия с этими сообщения.

Сообщение – это извещение о некотором месте событии, посылаемом в систему Windows в адрес пользователя. Любые действия пользователя – щелчок мыши, изменение размеров окна приложения – вынуждают Windows отправить приложению сообщение.

Сообщение – это определенная запись, передаваемая приложению. Она содержит сведения о том, что произошло в системе, а также дополнительную информацию, зависящую от типа сообщения. Система сообщений Windows состоит из трех компонентов,:

1)-очередь сообщений (отдельная для каждого приложения)

Приложение получает сообщения из очереди и передает их соответствующему окну.

2)-цикл сообщений

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

3)-процедура окна

Каждое окно приложения имеет собственную процедуру, которая получает все передаваемые окну сообщения, в ответ она должна выполнить определенные действия.

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

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

Система событий дельфи представляет собой интерфейс для взаимодействия с сообщениями Windows (с некоторой их частью). Многие события компонентов непосредственно связаны с сообщениями Windows, кроме того Дельфи генерирует ряд дополнительных межкомпонентных сообщений.

С теоретической точки зрения , событие – это результат запроса, посланного компоненту или элементу управления, при этом компонент или элемент управления может ответить на это сообщение.

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

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

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

- это специальный элемент языка 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, объявленный динамически, что традиционно для некторых инициируемых событий.

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