
Лабораторная работа № 3
Тема: Работа с полями
Класс TField позволяет обращаться к полям таблиц баз данных (ТБД). Каждый набор данных (НД) состоит из записей, а те, в свою очередь, состоят из полей.
Под набором данных понимается группа записей из одной или нескольких таблиц БД, доступная для использования с помощью компонентов-наборов TTable.
Таким образом, в структуре таблицы имеется минимум одно поле.
Использование объектов полей.
Для удобства работы с конкретным полем можно создать объект-поле класса TField или одного из его специализированных потомков - TStringField, TIntegerField, TBlobField и т.д. Объект-поле создается на этапе конструирования программы с помощью редактора полей. Если определен объект-поле, получить доступ к полю можно по имени этого объекта. Редактор полей присваивает объектам-полям имена путем сцепления имени источника данных и имени поля. Если, допустим, вы имеете компонент Firms типа TTable (Firms:TTable), который связан с источником данных у которого есть поле City, то при определении объекта для этого поля, объекту будет присвоено имя FirmsCity и можно использовать прямое обращение к нему. Например :
FirmsCity.AsString:=’Омск’;
Если хотя бы для одного поля НД создан объект-поле, все поля НД, для которых такие объекты не определены, становятся недоступными. К «несуществующим» полям обратиться из данного НД нельзя. Вновь вернуться к использованию всех полей НД можно только на этапе конструирования программы, удалив в редакторе полей все определенные ранее объекты или добавив с его помощью объекты для недостающих полей.
Если нужно иметь доступ к полю, но не показывать его значение в компонентах, визуализирующих данные (например, в компоненте TDBGrid), свойство Visible этого объекта-поля следует поместить значение False.
Для вызова редактора полей нужно дважды щелкнуть по компоненту типа TTable или щелкнуть по нему правой кнопкой мыши и выбрать в локальном меню Fields Editor. Предварительно НД должен быть связан с нужной ТБД: в TTable должны быть определены свойства DatabaseName и TableName.
Чтобы добавить
объекты-поля, щелкните компоненте Table
правой кнопкой и выберите Fields
Editor.
затем щелкните правой кнопкой в
появившемся окне и выберите Add
All
Fields.
Вот появились объекты-поля для всех
полей НД.
Обращение к значению поля
К значению поля можно обратиться при помощи свойства Value и Asxxxx класса TField или его потомков.
В классе TField определены следующие свойства Asxxxx для приведения типов полей:
Property AsBoolean:Boolean; |
Property AsInteger:Integer; |
Property AsCurrency:Currency; |
Property AsString:String; |
Property AsDateTime:TDateTime; |
Property AsVariant:Variant; |
Property AsFloat:Double; |
|
Каждое из этих свойств приводит значение поля к соответствующему типу данных, указанному в названии свойства. Например, если BooksBookId – поле TIntegerField, для приведения его к типу String нужно воспользоваться свойством AsString:
Edit1.Text:= BooksBookId.AsString
Следует знать, что преобразование не всех типов возможно.
Если для НД не создан ни один объект-поле, получить доступ к значению поля этого НД можно с помощью его метода FieldByName:
Function FieldByName (const FieldName:string):TField
или через его свойства Fields и FieldValues:
property Fields[Index]:TField
property FieldValues[‘Имя поля’]:Variant
Допустим у вас имеется Books:TTable (Books типа TTable) и в этой таблице имеется поле Year, то следующие обращения будут идентичными:
Books.FieldByName(‘Year’).AsInteger:=2000;
Books[‘Year’]:=2000;
Books.FieldValues[‘Year’]:=2000;
Books.Fields[4].AsInteger:=2000;
(предполагается, что поле ‘Year’ является 5-м по счету в НД Books).
События объекта-поля
В качестве примера возьмем проверку правильности введенного в поле значения.
Для контроля за правильностью вводимых в поле значений можно использовать события OnValidate или OnSetText объекта-поля. Оба события наступают после изменения значения поля, но до его запоминания в таблице.
В обработчике OnValidate в случае обнаружения неверного значения программа должны предотвратить его запоминание, создав исключительную ситуацию или обратившись к глобальной процедуре Abort. Например, поле Price (Цена «табл.D») не может быть отрицательным. Для контроля за этим можно написать такой обработчик:
procedure TForm1.Table4PRICEValidate(Sender: TField);
begin
if Table4Price.Value<0 then
begin
ShowMessage('Цена не может быть отрицательной');
Abort;
end;
end;
Однако следует учесть, что, отказавшись от запоминания неверного значения в таблице, программа тем не менее оставила НД в состоянии редактирования. Это означает, что пользователь не может покинуть поле до тех пор, пока не введет в него правильное значение.
В этом случае использовать событие OnSetText значительно разумнее, т.к. в нем можно просто игнорировать неверные значения и не создавать исключительную ситуацию. Дело в том, что в этом обработчике программа должна присвоить полю новое значение, и если она этого не сделает, то поле останется без изменения:
procedure TForm1.Table4PRICESetText(Sender: TField; const Text: String);
begin
if StrToFloat(Text)<0 then
ShowMessage('Цена не может быть отрицательной')
Else
Table4Price.Value:=StrToFloat(Text);
end;