Команды 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;