Методы получения и установки значений свойств
Методы получения (чтения) и установки (записи) значений свойств подчиняются определенным правилам.
Метод чтения свойства — это всегда функция, возвращающая значение того же типа, что и тип свойства. Метод записи свойства — это обязательно процедура, принимающая параметр того же типа, что и тип свойства. В остальных отношениях это обычные методы объекта.
Пример:
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) // эллипсPrivateFFocus:TCoordinates; function GetFocus2: TCoordinates; procedure SetFocus(const Value: TCoordinates); PublicProperty 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. Операции над свойством-массивом в целом запрещены; разрешены операции только с его элементами.
Дата добавления: 2016-02-09; просмотров: 600;