Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
коллоквиум-ответы.docx
Скачиваний:
3
Добавлен:
10.09.2019
Размер:
62.08 Кб
Скачать

Методы получения и установки значений свойств

Методы получения (чтения) и установки (записи) значений свойств подчиняются определенным правилам.

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

Пример:

Type

TFigure = class

FVisible: Boolean;

...

procedure SetVisible (const AVisible: Boolean);

...

property Visible: Boolean read FVisible write SetVisible;

end;

Использование методов для получения и установки свойств позволяет проверить корректность значения свойства, сделать дополнительные вычисления, установить значения зависимых полей и т.д. Например, в методе SetVisible вполне целесообразно осуществить проверку состояния объекта (видим или невидим), чтобы избежать его повторного рисования или удаления с экрана:

procedure TFigure.SetVisible (const AVisible: Boolean);

begin

if Visible <> AVisible then // Если состояние изменяется

begin

if AVisible then

Draw; // Нарисовать

else

Hide; // Убрать с экрана

FVisible := AVisible; // Сохранение состояния в поле

end;

end;

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

Пример:

TEllipse = class(TFigure) // эллипс

Private

FFocus:TCoordinates;

function GetFocus2: TCoordinates;

procedure SetFocus(const Value: TCoordinates);

Public

Property Focus1:TCoordinates

read FFocus

write SetFocus;

Property Focus2:TCoordinates

read GetFocus2;

end;

Свойства-массивы

1. Кроме обычных свойств в объектах существуют свойства-массивы (array properties). Свойство-массив — это индексированное множество значений. Например, в классе TPolygon множество вершин удобно представить в виде свойства-массива:

Type

TPolygon = class(TFigure)

...

FPoints: array of TCoordinates;

FPointsCount:word;

...

function GetPoints(Index: Integer): TCoordinates;

procedure SetPoints(Index: Integer; APoint:TCoordinates);

...

property Points[Index: Integer]: TCoordinates read GetPoints write SetPoints;

property PointsCount:word read FPointsCount write FPointsCount;

end;

...

function TPolygon.GetPoints(Index: Integer): TCoordinates;

begin

Result := FPoints[Index];

end;

procedure TPolygon.SetPoints(Index: Integer; APoints: TCoordinates);

begin

FPoints[Index]:=APoints;

end;

2. В описании свойства-массива разрешено использовать только методы, но не поля. В этом состоит отличие свойства-массива от обычного свойства.

3. Основная выгода от применения свойства-массива — возможность выполнения итераций с помощью цикла for, например:

Var

Polygon: TPolygon;

I: Integer;

...

for I := 0 to Polygon.PointsCount - 1 do

Polygon.Points[I].x:=100*I;

...

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

5. Свойства-массивы имеют два важных отличия от обычных массивов:

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

Polygon.Points['First'].x := 100;

6. Операции над свойством-массивом в целом запрещены; разрешены операции только с его элементами.