Объект поля, как и любой другой объект, имеет имя (название), определяемое его свойством Name типа Ansistring. Имя объекта Field зависит от того, является ли поле динамическим или статическим. По умолчанию для динамического поля имя объекта Field совпадает с именем соответствующего физического поля таблицы БД, для которого создан объект, и не может быть изменено. Имя статического поля является составным и по умолчанию образуется путем слияния имен набора данных и имени физического поля таблицы БД. Например, если для физического поля Name набора данных Table1 с помощью Редактора полей создано статическое поле, то оно получит имя Table1Name. Можно изменить это имя с помощью Инспектора объектов, когда соответствующее статическое поле выбрано в Редакторе полей.
В отличие от имени объекта Field, свойство FieldName типа Ansistring содержит имя физического поля, заданное при создании таблицы. Не следует путать свойства Name и FieldName, они обозначают разные объекты и в общем случае могут не совпадать.
Пример обращения к полю:
Table1->FieldByName("R_Salary")->DisplayLabel = "Оклад";
Table1R_Salary->DisplayLabel = "Оклад";
Здесь для статического поля R_salary приведены два возможных способа обращения: по имени поля в наборе данных и по имени объекта Field поля. Заметим, что свойство DisplayLabel определяет текст, отображаемый в качестве заголовка поля набора данных.
Для определения порядкового номера поля в наборе данных (нумерация начинается с единицы) можно использовать свойство FieldNo типа int, например, так:
int x = Table1->FieldByName("R_Date")->FieldNo;
Edit1->Text=IntToStr(x);
Для доступа к значению поля служат свойства value и AsXXX. Для объекта поля класса TField свойство value имеет тип variant и представляет собой фактические данные в этом объекте. При выполнении приложения это свойство используется для чтения и записи значений в поле. Если программист обращается к свойству value, то он должен самостоятельно обеспечивать преобразование и согласование типов значений полей и читаемых или записываемых значений. В таблице ниже приводятся возможные типы свойства value для ряда различных классов объектов, наследуемых от класса TField.
Тип объекта поля | Тип свойства value |
TField | Variant |
TStringField, TBLOBField | Ansistring |
TIntegerField, TSmalllntField, TWordField, TAutoincField | int |
TBCDField | Currency |
TFloatField, TCurrencyField | double |
TBooleanField | bool |
TDateTimeField, TDateField, TTimeField | TDateTime |
Рассмотрим пример, в котором доступ к значению поля осуществляется с помощью свойства value:
void fastcall TForm1::Button1Click(TObject *Sender)
{
Ansistring s;
float y;
// Доступ по имени в наборе данных
s = Table1->FieldByName("G_Salary")->Value;
у = Table1->FieldByName("G_Salary")->Value;
Label1->Caption = s;
Label2->Caption = FloatToStr(y);
// Доступ, как к отдельному компоненту
у = Table1G_Salary->Value;
Label3->Caption = FloatToStr(у);
s = Table1G_Salary->Value;
Edit1->Text=s;
}
Здесь чтение значения поля G_salary текущей записи набора данных Table1 выполняется несколькими способами. При доступе с помощью свойства value к полю по имени в наборе данных значение поля G_salary типа $ (Money) (и вещественного типа тоже) можно читать и использовать и как строковое, и как вещественное значение.
Пояснение к приведенному примеру подразумевает автоматическое допустимое преобразование типов. К примеру, вещественный тип можно преобразовать к строковому типу, обратное преобразование в общем случае невыполнимо. То же справедливо для доступа с помощью свойства value к полю как отдельному компоненту.
Доступ к полю по имени объекта типа TField, например, Table1Salary, возможен только для статических полей, которые существуют на этапе разработки приложения. Попытка использовать имя объекта динамического поля приводит к ошибке при компиляции, т.к. объект поля еще не создан.
Поскольку при доступе к полю с помощью свойства value программист должен обеспечивать преобразование и согласование типов значений, то часто более удобно использовать варианты свойства AsXXX:
- AsBCD типа Tbcd
- AsBoolean типа bool
- AsCurrency типа Currency
- AsDateTime типа TdateTime
- AsFloat типа double
- Aslnteger типа int
- AsSQLTimeStamp типа TSQLTimeStamp
- AsString типа AnsiString
- As Variant типа Variant
При использовании любого из этих свойств выполняется автоматическое преобразование типа значения поля к типу, соответствующему названию свойства. При этом преобразование должно быть допустимо, в противном случае возникает ошибка компиляции по несоответствию типов, например, при попытке прочитать логическое значение как целочисленное.
Приведем теперь пример, где доступ к значению поля происходит с помощью свойств AsXXX:
Void fastcall TForm1::Button1Click(TObject *Sender)
{
// Доступ по имени поля в наборе данных
AnsiString s = Table1->FieldByName("N_Number")->AsString;
float x = Table1->FieldByName("Time")->AsFloat;
Edit1->Text= s;
Edit2->Text = FloatToStr(x);
// Доступ, как к отдельному компоненту
s = Table1Currency->AsString; // денежное поле
x = Table1Date->AsFloat; // Поле даты
Edit3->Text = s;
Edit4->Text = FloatToStr(x);
}
Как и в предыдущем примере, чтение значений полей вещественного типа, типа времени, денежного типа и типа даты осуществляется двумя способами. Доступ к полю выполняется по имени поля и по имени объекта поля, а значение поля интерпретируется как строковое или как вещественное с помощью свойств Asstring и AsFloat соответственно.
Для того чтобы записать значение в поле, оно должно допускать модификацию, а набор данных должен находиться в соответствующем режиме, например, редактирования или вставки.
При необходимости программист может запретить модификацию поля, а также скрыть его, используя свойства Readonly и Visible типа bool. Возможность модификации данных в отдельном поле определяется значением свойства CanModify типа bool. Напомним, что свойства Readonly и canModify есть также у набора данных: они определяют возможность модификации набора данных (всех его полей) в целом.
Даже если набор данных является модифицируемым и его свойство CanModify имеет значение true, для отдельных полей этого набора редактирование может быть запрещено, и любая попытка изменить значение такого поля вызовет исключение.
Если поле является невидимым (свойство visible имеет значение false), но разрешено для редактирования (свойство Readonly имеет значение false), то значение этого поля можно изменить программно.
Рассмотрим управление видимостью поля и возможностью его модификации на примере:
Table1->FieldByName("Number")->ReadOnly = true;
Table1->FieldByName("Salary")->Visible = false;
Здесь для поля Number запрещаются любые изменения, а поле salary скрывается, однако для него по-прежнему допускаются чтение и изменение значения, если его свойству Readonly не установлено значение true.
Для полей, имеющих типы TBLOBField (BLOB-объект), TGraphicField (графическое изображение) и TMemoField (текст), доступ к их содержимому выполняется обычными для объектов данного типа способами. Например, для загрузки содержимого из файла можно использовать метод LoadFromFile, а для сохранения содержимого поля в файле метод SaveToFile.