Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
55
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

События

Событие — это специальное свойство, являющееся указателем функции. Тип обобщенного указателя на функцию, которой пе­редается один параметр типа TObject (обычно Self — данный объект), — TNotifyEvent. Подобный тип используется в Delphi для событий типа OnClick и многих других, которые передают в обработчик только один параметр — Sender: TObject. Если тре­буется ввести в класс подобное событие, достаточно определить в объявлении класса соответствующее поле и метод работы с ним. Например:

private

FMyEvent:TNotifyEvent;

published

property MyEvent:TNotifyEvent read FmyEvent write FMyEvent;

Остается только вызвать в нужный момент обработчик событий пользователя, если пользователь его предусмотрел. Проверка, имеется ли обработчик пользователя, осуществляется функцией assigned, которая возвращает true, если пользователь предусмот­рел свой обработчик. Значит, при возникновении события надо проверять, имеется ли обработчик пользователя, и, если имеется, то вызвать его. Для этого можно использовать оператор вида:

if assigned(FMyEvent) then OnMyEvent(Self);

Функция OnMyEvent, которая вызывается этим оператором, это и есть обработчик пользователя. Его имя совпадает с именем . свойства, перед которым добавляется префикс «On».

Место, куда надо включать подобный оператор, зависит от вида события. Если событие вызывается каким-то из ваших ме­тодов, то вызов обработчика пользователя надо осуществлять из этого метода. Если событие связано с какими-то сообщениями, поступающими от других приложений или от Windows, то надо предусмотреть обработчик соответствующего сообщения (это по­дробно рассмотрено в разделе 1.11.3 главы 1) и из него вызывать обработчик пользователя.

Если в обработчик события надо передать какие-то параметры помимо Self, то тип функции TNotifyEvent уже не подходит и надо объявить свой собственный тип. Это объявление должно предшествовать объявлению класса. Например:

type

TMyEvent = procedure(Sender:TObject; var CanEvent:boolean) of object;

Т = class(TObject)

private

FMyEvent: TMyEvent;

published

property MyEvent: TMyEvent read FmyEvent write FMyEvent;

end;

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

Объявление класса

Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (декларирован­ные), private (личные), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале оп­ределяются поля, а затем - методы и свойства.

Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости пере­числяемых в ней полей, методов и свойств - их можно вызывать в любом другом модуле программы. Секция published также не ограничивает об­ласть видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструиро­вания программы (т.е. в окне Инспектора Объектов). Секция published используется только при разработке нестандартных компонентов. Среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заго­ловком класса и продолжается до первой объявленной секции. Эта секция - published. Программисту не следует помещать в нее собственные эле­менты описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: личные элемен­ты описания доступны только внутри методов данного класса и в подпро­граммах, находящихся в том же модуле, где описан класс. Элемент, объ­явленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его по­томкам независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов автоматизации; область видимости членов этой секции не огра­ничена.

В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.

Следующий фрагмент кода поясняет области видимости.

Unit Unit1;

Interface

Uses Controls, Forms;

type

TForm1 = class(TForm)

Button1: TButton; // Эта секция обслуживается Delphi

// Ее элементы доступны всем

private // Эта секция доступна в модуле Unit1

FIntField: Integer;

Procedure SetValue(Value: Integer);

Function GetValue: Integer;

published // Эта секция доступна в любом модуле

Property IntField: read GetValue write SetValue;

protected // Эта секция доступна классам-потомкам

Procedure Proс1;

public // Эта секция доступна в любом модуле

Procedure Proc2;

end;

var

Forml: TForml;

Implementation

Procedure TForml.Procl;

begin

Buttonl.Color := clBtnFace; // Так можно

FIntField := 0; // Так можно

IntField := 0; // Так можно

Procl; // Так можно

Proc2; // Так можно

end;

begin

Forml.Buttonl.Color := clBtnFace; // Так можно

Forml.FIntField := 0; // Так можно

Forml.IntField := 0; // Так можно

Forml.Procl; // Так нельзя

Forml.Proc2; // Так можно

end.

Unit Unit2;

Interface

Uses Controls, Unitl;

type

TForm2 = class(TForml)

Button2: TButton;

Procedure Button2Click(Sender: TObject);

end;

var

Form2: TForm2;

Implementation

Procedure TForm2.Button2Click(Sender: TObject);

begin

Button1.Color:= clBtnFace; // Так можно

FIntField := 0; // Так нельзя

IntField := 0; // Так можно

Procl; // Так можно

Proc2; // Так можно

end;

begin

Forml.Buttonl.Color := clBtnFace; // Так можно

Forml.FIntField := 0; // Так нельзя

Forml.IntField := 0; // Так можно

Forml.Procl; // Так нельзя

Forml.Proc2; // Так можно

end.

При объявлении класса-потомка разрешается перемещать элементы класса из одной области видимости в другую. Для предыдущего приме­ра допустимо такое объявление:

type

TForm2 = class(TForml)

…..

Public

Procedure Proc1;

……

end;

После этого в модуле Unit2 возможно такое обращение:

Form2 . Proс1;

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

Класс может объявляться только в интерфейсной области модуля или в самом начале области реализации. Нельзя определять классы в разделе описаний подпрограмм.

Соседние файлы в папке ООП