Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АИСд шпора2.docx
Скачиваний:
8
Добавлен:
27.09.2019
Размер:
86.39 Кб
Скачать

44.Делегирование обработчиков.

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

Этот тип данных представляет собой

ссылку (указатель) на метод. Указатель на

метод содержит два адреса: одна ссылка на

адрес кода метода, другая на адрес

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

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

конкретному объекту.

Делегирование.

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

принципов компонентной технологии –

делегирование. Если кто-то написал класс, у

которого есть поля в виде указателей на

методы, то можно менять поведение

построенных (даже скомпилированных)

объектов этого типа, просто присваивая

этим указателям новые методы.

45.Свойства. Свойства представляют интерфейс с внутренними полями данных того или иного объекта. Внутренние поля обычно объявляются в разделе

Private. Их имена, как правило, начинаются с буквы F,

например поле FСolor. Соответственно свойство, с помощью которого осуществляется доступ к заданному полю FColor, имеет имя Color.

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

инспектора объектов, их объявляют в разделе Published.

Свойства могут создаваться с помощью различных

типов данных, а именно:

• Simple – простые свойства;

• Enumerated – перечисляемые;

• Set – множества;

• Object – объектного типа;

• Array – индексированные свойства.

Разные типы свойств по-разному отображаются в

инспекторе объектов и имеют свои собственные

редакторы для изменения значений свойств. Далее

рассмотрим синтаксис записи различных видов свойств.

Свойства Simple.

Простые свойства включают числовые, символьные и строковые типы данных. Наиболее часто используются свойства типа integer и string.Например, свойства Width, Height имеют тип integer, свойство Caption имеет

тип string.

Type

Tsimple = class(TCustomControl)

Private

Fstr: string;

Published

Property Str: string read Fstr write Fstr;

end;

Как следует из примера, свойства имеют поля, в котором храниться

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

Если отсутствует или способ чтения, или способ записи данных, то

соответствующее свойство имеет доступ или только по чтению, или только по

записи.

Свойства Enumerated.

Свойства enumerated определяются типом перечень и логическим типом Boolean. Обычно все возможные значения

данного типа свойств некоторым способом помечаются,

например, как в объявлениях ниже:

Type

TEnumProp=(epZero,epOne,epTwo,epThree);

Tenum=class(TCustomControl)

Private

FEnumProp : TEnumProp;

Published

Property EnumProp: TEnumProp read FEnumProp write FEnumProp;

end;

Элементы свойства Set(множество) в инспекторе объектов заключаются в квадратные скобки. Для

развертывания в инспекторе объектов элементов базового множества, включающего в себя все возможные варианты, имеется знак “+”, расположенный слева от

наименования свойства. Включить или не включить тот

или иной элемент из базового множества в рабочее множество выбирают путем указания true или false.

Рабочее множество определяет значение данного свойства.

Рассмотрим пример объявления свойства Set. При этом используется тип TEnumProp:

Type

TEnumProp = (epZero,epOne,epTwo,epThree);

TSetProp = set of TEnumProp;

TSetClass = class(TCustomControl)

Private

FSetProp: TSetProp;

Published

Property SetProp: TsetProp read FSetProp write FSetProp;

end;

Свойства Object.

Объявим класс, который будет определять далее в примере тип свойства.

Type

TObjectDop = class(Tpersistent)

Private

FMyInt : integer;

Public

Property MyProp : integer read FMyInt write FMyInt;

end;

Объявленный выше класс (TObjectDop) должен войти как составная часть в

класс, который должен будет содержать свойство заданного объектного типа

TObjectDop. Соответственно потребуется задавать этому свойству значение, а это означает, что потребуется объект типа TObjectDop, для которого необходимо

обеспечить выделение памяти и освобождение памяти. Стандартных методов

выделения и освобождения памяти в данном случае недостаточно. Для

выделения памяти создадим конструктор Create, а для высвобождения памяти –

деструктор Destroy.

Type

TObjectDop = class(Tpersistent)

Private

FMyInt : integer;

Public

Property MyInt : integer read FMyInt write FMyInt;

end;

Type

TObjectProp = class(TCustomControl)

Private

FObjectProp: TObjectDop;

Public

Constructor Create(Aowner: Tcomponent); override;

Destructor Destroy; override;

Published

Property ObjectProp : TObjectDop read FObjectProp write FObjectProp;

end;

Конструктор и деструктор объявлены с командой Override. Это означает, что в данном классе переопределяются имеющиеся по линии наследования

стандартные виртуальные конструктор Create и деструктор Destroy.

Constructor TObjectProp.Create(Aowner:Tcomponent);

begin

Inherited Create(Aowner);

FObjectProp:=TObjectProp.Create;

end;

Destructor TObjectProp.Destroy;

begin

FObjectProp.Free;

Inherited Destroy;

end;

Свойства Array.

Свойства Array позволяют создать очень похожие на массивы

индексированные свойства, которые отличаются от обычных массивов по двум основным аспектам:

• свойства типа Array могут индексироваться строковым значением;

• свойства типа Array могут получать доступ только к одному элементу за одно чтение.

В окне Object Inspector эти свойства помечаются кнопкой с

многоточием (…). Для изменения значений свойств данного вида

вызываются специальный редактор.

Type

Str7 = string[7];

Tmas=array[1..3] of str7;

TMasClass=class(TCustomControl)

Private

FMasProp:Tmas;

Function GetMasInt(pIndex:integer):string;

Function GetMasStr(pIndex:string):integer;

Public

Constructor Create(Aowner:Tcomponent); override;

Property MasPropInt[Index:index] : string read GetMasInt;

Property MasPropStr[Index:string]: integer read GetMasStr;

end;.

В данном случае переопределяется

конструктор Create, который необходим не для выделения памяти, а для задания значений

элементам индексированного свойства.

Поэтому необходимо будет исключить вызов

стандартного конструктора с помощью

команды Inherited. Далее определим конструктор и две функции для чтения значений элементов индексированного

свойства, которое в данном случае имеет

доступ к соответствующему полю только по

чтению.

Задание нулевых значений свойствам.

Когда создаются свойства, они первоначально

получают нулевые или неопределенные (в

зависимости от типа свойства) значения. Если

необходимо задать свойствам какие-либо значения по умолчанию, то используются следующие шесть

команд: Default, NoDefault, Default для свойств типа

массив, Stoped, Index, Dispid.