В этом примере вне объекта значение свойства можно лишь прочитать; попытка присвоить свойству AProperty значение вызовет ошибку компиляции.
Для присвоения свойству значения по умолчанию используется ключевое слово default:
Property Visible: boolean read FVisible write SetVisible default True;
Но это не означает, что при создании объекта свойство будет установлено. Применение значений свойств по умолчанию будет рассмотрено позднее. Свойство может быть и векторным. В этом случае оно выглядит как массив:
property APoints [ Index : Integer ] :TPoint read GetPoint write SetPoint;
property Pixels [X, Y: Integer]: TColor read GetPixel write SetPixel;
property Values [const Name: string]: string read GetValue write SetValue;
На самом деле в классе может и не быть соответствующего поля - массива. Вся обработка обращений к внутренним структурам класса может быть замаскирована.
Для векторного свойства необходимо описать не только тип элемента массива но также имя и тип индекса. Тип индекса может быть любым, в Отличие от массивов которые могут быть проиндексированы только перечислимыми типам.
После ключевых слов read и write в этом случае должны стоять имена методов - использование значений полей массивов недопустимо. Метод, читающий значение векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства, и имеющая параметры, соответствующие индексам свойства:
function GetPoint (Index -Integer) :TPoint;
function GetFixel (X, Y: Integer): TColor;
function GetValue (const Name: string): string;
Аналогично, метод, помещающий значения в такое свойство, должен первыми параметрами иметь индексы, а далее - переменную нужного типа (которая может передаваться как по ссылке, так и по значению):
procedure SetPoint (Index: integer; NewPoint :TPoint) ;
procedure SetPixel(X, Y: Integer; Value: TColor);
procedure SetValue (const Name, Value: string);
Доступ к векторным свойствам осуществляется с помощью индексов. Например:
if Collection. Points[0] = constPoint then Exit;
Canvas. Pixels[10, 20] := clRed;
Params. Values ['PATH'] := 'C:DELPHIBIN';
Или путем вызова методов:
if Collection .GetPoint (0) = constPoint then Exit;
Canvas. SetPixel (10, 20, clRed) ;
Params. SetValuef (‘PATH’, 'C:DELPHIBIN') ;
Рассмотрим пример - векторное свойство, предназначенное для хранения оценки студента за экзамен. Фамилия студента будет индексом, оценка - значением векторного свойства. Для хранения фамилий и оценок предлагается использовать массивы, хотя возможны и другие варианты.
