- •22)Windows- приложение
- •23.Проект приложения в Delphi.
- •24.Приложение в Delphi.
- •25.Структура программы проекта.
- •26.Структура модуля.
- •27. Модули в Delphi.
- •29.Класс как тип данных.
- •31. Базовый класс всех объектов – Tobject.
- •32. Объектные переменные.
- •37.Наследование.
- •38.Статические методы.
- •39.Виртуальные методы.
- •40.Другие виды методов.
- •41.Конструктор и деструктор, указатели на объекты.
- •42. Полиморфные объекты.
- •44.Делегирование обработчиков.
- •46. Исключительные ситуации.
- •49.Граф.Определения.
- •50. Визуализация графа.
- •51.Алгоритмы в графах.
- •52.Построение минимального остовного дерева в графе.
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.