Как уже говорилось выше, в большой иерархии классов для полей различных типов данных класс TField является базовым (см. рис. 13.1), он инкапсулирует свойства и методы абстрактного поля данных. Именно от него происходят все классы типизированных полей. В реальной работе класс TField не используется, но его значение трудно переоценить. Практически все основные свойства классов типизированных полей унаследованы от класса TField без каких-либо изменений, а дополнительные свойства и методы обеспечивают работу конкретного типа данных.
Что касается методов-обработчиков событий, то четыре метода, определенные в классе TField, наследуются всеми потомками без изменения и дополнения.
property Name: TComponentName;
При создании объекта поля на этапе разработки имя объекта складывается из имени соответствующего компонента набора данных и имени поля.
Свойство
property FieldName: String;
возвращает имя поля таблицы базы данных. Свойство
property FullName: string;
используется, если текущее поле является дочерним для другого поля. В этом случае свойство содержит имена всех родительских полей.
Название поля в таблице базы данных содержится в свойстве
property Origin: String;
Свойство
property FieldNo: Integer;
возвращает исходный порядковый номер поля в наборе данных. Если объекты полей являются статическими, их фактический порядок может быть изменен в Редакторе полей.
Свойство
property Index: Integer;
содержит индекс объекта поля в списке Fields.
Функциональное назначение поля определяется свойством
type TFieldKind = (fkData, fkCalculated, fkLookup, fklnternalCalc,
fkAggregate);
property FieldKind: TFieldKind;
В большинстве случаев его значение определяется автоматически в момент создания объекта поля. Да и впоследствии вряд ли возникнет необходимость сделать реальное поле данных вычисляемым. Обычно попытка изменить значение свойства FieldKind вызывает ошибку. Рассмотрим возможные значения этого свойства:
Если поле является вычисляемым, свойство
property Calculated: Boolean;
принимает значение True.
На связанный набор данных указывает свойство
property DataSet: TDataSet;
которое при создании объекта средствами среды разработки заполняется автоматически.
Свойство
property DataType: TFieldType;
возвращает тип данных поля, а свойство
property DataSize: Integer;
содержит объем памяти, необходимый для хранения значения поля.
Одной из важнейших задач класса TFieid является обеспечение доступа к текущему значению поля. В этом случае класс взаимодействует с буфером текущей записи набора данных, а значение можно получить при помощи нескольких свойств.
Свойство
property Value: Variant
всегда содержит значение, которое сохранено после последнего выполнения метода Post набора данных:
with Tablel do begin Open;
while Not EOF do begin
if Fields[0].Value > 10
then Fields[1].Value := Fields[1].Value*2;
Next;
end;
Close;
end;
В этом примере при помощи метода Next осуществляется перебор всех записей набора данных. Если значение первого поля больше 10, то значение второго поля удваивается. Для этого применяется свойство value объектов полей набора данных.
Однако из-за использования вариантов свойство value является относительно медленным. И для преобразования текущего значения поля к необходимому виду можно применять целую группу быстрых свойств AS ..., которые содержат значение в определенном типе данных. Чаще всего используется свойство Asstring, например, оно может применяться для представления числовых значений полей в элементах управления:
Editl.Text := Tablel.Fields[0].AsString;
Примечание
При работе со статическими объектами полей при передаче значений желательно использовать свойства из группы AS ..., т. к. неявное задание типа свойством Value может привести к ошибке преобразования данных типа Variant.
Если свойство
property CanModify: Boolean;
имеет значение False, значение поля нельзя редактировать. Однако это свойство является только средством для определения возможности редактирования.
Свойство
property Readonly: Boolean;
позволяет запретить редактирование (Readonly := True) или разрешить его (Readonly := False).
Большая группа свойств отвечает за представление и форматирование значения поля.
Свойство
property DisplayText: String;
содержит значение поля в строковом формате до начала редактирования. Свойство
property Text: String;
предназначено для использования компонентами отображения данных при редактировании. Поэтому эти два свойства могут иметь разные значения в случае, если значение поля в строковом формате при редактировании и просмотре различно. У классов-наследников TField для этого достаточно задать шаблон отображения данных для поля (свойство Display/Format) и шаблон редактирования данных (свойство EditFormat). Например, вещественное число при просмотре может иметь разделители тысяч, а при редактировании нет. В этом случае рассматриваемые свойства будут иметь следующий вид:
DisplayText = ' 1 452,32'
Text = 4452,32'
Свойства Text и DisplayText влияют на использование метода-обработчика onGetText. Если параметр DisplayText имеет значение True, то параметр Text содержит значение свойства DisplayText, в противном случае в метод передается значение поля в строковом формате.
Если поле не имеет значения, то при помощи свойства DefaultExpression можно задать некоторое постоянное значение, которое будет появляться в компоненте отображения данных при пустом поле. Если постоянное значение содержит какие-либо символы кроме цифр, то все выражение нужно обязательно брать в кавычки.
В случае возникновения исключительных ситуаций во время использования поля генерируется соответствующее сообщение, в котором в качестве имени поля применяется значение свойства DisplayName. Если задано свойство DispiayLabel, то DisplayName приравнивается к нему, в противном случае для задания свойства DisplayName используется свойство FieldName. Другим способом задать значение свойства DisplayName невозможно.
Свойство
property DisplayWidth: Integer;
определяет число символов для отображения значений поля в визуальных компонентах отображения данных.
Свойство
property Visible: Boolean;
отвечает за видимость поля в визуальных компонентах отображения данных. При этом компоненты, отображающие одно поле, перестают показывать его значения, а компоненты типа TDBGrid не отображают колонки, связанные с полем.
Примечание
Еще несколько групп свойств класса TField, а также его методы-обработчики рассматриваются ниже в этой главе.