Лабораторная работа № 3
Тема: Работа с полями
Класс TField позволяет обращаться к полям таблиц баз данных (ТБД). Каждый набор данных (НД) состоит из записей, а те, в свою очередь, состоят из полей.
Под набором данных понимается группа записей из одной или нескольких таблиц БД, доступная для использования с помощью компонентов-наборов TTable.
Таким образом, в структуре таблицы имеется минимум одно поле.
Использование объектов полей.
Для удобства работы с конкретным полем можно создать объект-поле класса TField или одного из его специализированных потомков - TStringField, TIntegerField, TBlobField и т.д. Объект-поле создается на этапе конструирования программы с помощью редактора полей. Если определен объект-поле, получить доступ к полю можно по имени этого объекта. Редактор полей присваивает объектам-полям имена путем сцепления имени источника данных и имени поля. Если, допустим, вы имеете компонент Firms типа TTable (Firms:TTable), который связан с источником данных у которого есть поле City, то при определении объекта для этого поля, объекту будет присвоено имя FirmsCity и можно использовать прямое обращение к нему. Например :
FirmsCity.AsString:=’Омск’;
Если хотя бы для одного поля НД создан объект-поле, все поля НД, для которых такие объекты не определены, становятся недоступными. К «несуществующим» полям обратиться из данного НД нельзя. Вновь вернуться к использованию всех полей НД можно только на этапе конструирования программы, удалив в редакторе полей все определенные ранее объекты или добавив с его помощью объекты для недостающих полей.
Если нужно иметь доступ к полю, но не показывать его значение в компонентах, визуализирующих данные (например, в компоненте TDBGrid), свойство Visible этого объекта-поля следует поместить значение False.
Для вызова редактора полей нужно дважды щелкнуть по компоненту типа TTable или щелкнуть по нему правой кнопкой мыши и выбрать в локальном меню Fields Editor. Предварительно НД должен быть связан с нужной ТБД: в TTable должны быть определены свойства DatabaseName и TableName.
Создаем объекты-поля
|
Для каждого поля создан свой объект
|
Чтобы добавить объекты-поля, щелкните по окну редактора правой кнопкой и выберите AddFields (рис. 1). В появившемся списке будут выделены поля, для которых еще не созданы объекты. Если нужно создать объекты-поля для всех полей НД, выберите 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. Например, поле Dohod_cl (доход клиента) не может быть отрицательным. Для контроля за этим можно написать такой обработчик:
procedure TMainF.Table1Dohod_clValidate(Sender: TField);
begin
if Table1Dohod_cl.Value<0 then
begin
ShowMessage(‘Доход не может быть отрицательным’);
Abort;
end;
end;
Однако следует учесть, что, отказавшись от запоминания неверного значения в таблице, программа тем не менее оставила НД в состоянии редактирования. Это означает, что пользователь не может покинуть поле до тех пор, пока не введет в него правильное значение.
В этом случае использовать событие OnSetText значительно разумнее, т.к. в нем можно просто игнорировать неверные значения и не создавать исключительную ситуацию. Дело в том, что в этом обработчике программа должна присвоить полю новое значение, и если она этого не сделает, то поле останется без изменения:
procedure TMainF.Table1Dohod_clSetText(Sender: TField; const Text: String);
begin
if StrToFloat(Text)<0 then
ShowMessage(‘Доход не может быть отрицательным’)
Else
Table1Dohod_cl.Value:=StrToFloat(Text);
end;