Команды Default, NoDefault и Stored

Эти команды называют спецификаторами хранения. Они не оказывают никакого действия на выполнение программы, но управляют способом со­хранения значений свойств из раздела Published в Dfin-файле.

а) КомандаDefault позволяет указать значение, каким конструктор клас­са будет инициализировать соответствующее поле. В противном случае, как уже указывалось ранее в §2.2, оно будут инициализировано нулевым значе­нием.

Примечания:

• Этот раздел можно указывать только для порядковых типов данных и множества. Допустим он и для данных типа указатель с единственным значением Nil, поэтому фактически нецелесообразен.

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

• Команда Default лишь информирует транслятор о том, каким значе­нием будет инициализировано свойство. Это позволяет при считывании и записи в файлы формы и компонентов узнавать, нужно ли записывать в файл *.Dfm значение свойства. Если текущее значение свойства такое же, как в команде Default, то его можно не записывать, уменьшая таким обра­зом размер файла.

• Свойство, определенное в разделе Published, no умолчанию всегда со­храняется в ресурсном файле.

• Для свойств-массивов команда Default объявляет соответствующее свойство-массив свойством по умолчанию, что позволяет упростить дос­туп к элементам такого массива. При обращении к такому свойству его имя можно не упоминать, а индекс[ы] в квадратных скобках указывать у имени объекта. Очевидно, что только одно свойство-массив класса и его потомков может иметь такую команду. В классах-потомках нельзя отме­тить эту команду.

Type

TAnyClass=Class // Объявление нового класса ...

// Все необходимые объявления

Property Strings[Index: Integer]: String Read GetStr Write SetStr; Default;

End;

Var AnyObject: TAnyClass; // Объявление переменной

Begin

AnyObject.Strings[l]:=='Первый и стандартный способ обращения';

AnyObject[2]:='BTOpou способ - при указании свойства Default';

End.

б) КомандаNoDefault используется для сообщения о том, что не суще­ствует никакого значения, действующего по умолчанию. Обычно она приме­няется для наследованных свойств, которые имели заданное по умолчанию значение, и для тех же типов данных, что и команда Default.

в) КомандаStored используется для того, чтобы указать на необходи­мость сохранения значения свойства. За командой Stored могут стоять либо ключевые слова: True False, либо указана <переменная\метод-функция с ло­гическим результатов. Часто используется для свойств, объявляемых в разделе Published и всегда сохраняемых в ресурсном файле.

Команда Index

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

Примечания:

• Эта команда указывается первой в списке команд объявления свойств.

• Методы доступа к свойству, имеющему раздел Index должны иметь дополнительный параметр, объявленный как Integer. Для метода чтения этот параметр должен быть последним в списке параметров функции, а для метода записи этот параметр должен быть предпоследним в списке параметров процедуры - предшествовать параметру, определяющему зна­чение свойства.

Примером может служить приведенный в справочной системе Delphi класс TSampleCalendar.

Type

TSampleCalendar=CIass(TCustomGrid) Private

Function GetDateElement(Index: Integer): Integer;

Procedure SetDateElement(Index: Integer; Value: Integer);

Public

Property Day: Integer Index 3 Read GetDateElement Write SetDateElement;

Property Month: Integer Index 2 Read GetDateElement Write SetDateElement;

Property Year: Integer Index 1 Read GetDateElement Write SetDateElement;

End;

Function TSampleCalendar.GetDateElement(Index: Integer): Integer;

Var AYear, AMonth, ADay: Word;

Begin

DecodeDate(FDate, AYear, AMonth, ADay); // Декодер даты

Case Index Of // Выбор индекса

1: Result:=AYear;

2: Result:=AMonth;

3: Result:=ADay;

Else Result:=-l;

End;

End;

Procedure TSampleCaIendar.SetDateElement(Index: Integer; Value: Integer);

Var AYear, AMonth, ADay: Word;

Begin

If Value > 0 Then Begin

DecodeDate(FDate, AYear, AMonth, ADay); // Декодер даты

Case Index Of // Выбор индекса

1: AYear;=Value;

2: AMonth:=Value;

3: ADay:=Value;

Else Exit;

End;

FDate:=EncodeDate(AYear, AMonth, ADay);// Кодер даты

Refresh;

End;

End;

Наши рекомендации