Главная » Delphi » Работа с полями Delphi

0

Delphi позволяет получить доступ к полям  любого  набора данных  с помощью класса TField и его потомков. Эти классы дают возможность не только  возвратить или устано вить значение выбранного поля текущей  записи набора данных, но и изменить поведе ние поля модифицировав его свойства. Кроме  того,  можно  модифицировать набор  дан ных  в целом,  изменяя визуальный порядок расположения полей, удаляя  поля  или  же создавая новые  вычисляемые (calculated) или подстановочные поля (lookup fields).

Значения полей

Получить доступ к значениям полей  в Delphi очень  просто. Класс TDataSet обла дает стандартным массивом  свойств  по имени  FieldValues[], который возвращает значение определенного поля как значение типа Variant. Поскольку массив свойств FieldValues[] стандартный, то  для  доступа  к определенному  свойству  не  нужно специально указывать имя массива,  достаточно имени  свойства. Например, в следую щем фрагменте кода значение поля  CustName таблицы Table1 присваивается пере менной S типа String:

S := Table1[‘CustName’];

Так же просто присвоить значение целого  типа поля CustNo переменной I:

I := Table1[‘CustNo’];

Основным выводом из сказанного выше является возможность сохранения значе ний нескольких полей  в массиве  типа Variant. Единственным осложнением является то,  что  индекс  массива  типа  Variant должен  начинаться с нуля,  а его  содержимое представляет собой  переменные varVariant. Приведенный ниже  фрагмент кода де монстрирует эту возможность:const

AStr = ‘The %s is of the %s category and its length is %f in.';

var

VarArr: Variant;

F: Double;

begin

VarArr := VarArrayCreate([0, 2], varVariant);

{ Предполагаем, что объект Table1 связан с таблицей Biolife }

VarArr := Table1[‘Common_Name;Category;Length_In’];

F := VarArr[2];

ShowMessage(Format(AStr, [VarArr[0], VarArr[1], F]));

end;

Для доступа к отдельным объекта класса  TField, ассоциированным с набором дан ных,  можно  использовать также  массив  свойств   TDataset.Fields[] или  функцию FieldsByName(), поскольку класс TField содержит информацию обо всех полях.

Массив Fields[] (начинающийся с нулевого  элемента) является массивом  объек тов  класса  TField. Так,  элемент Fields[0] возвращает объект TField, представ ляющий первое логическое поле записи. Функции  FieldsByName() передается стро ковый  параметр, который соответствует некоторому имени поля  в таблице. Таким образом, вызов  этой  функции в виде  FieldsByName(‘OrderNo’) возвратит компо нент TField, соответствующий полю OrderNo в текущей записи  набора данных.

Создав  объект класса  TField, можно  получить доступ и на чтение и на запись  ко всем его полям,  используя свойства, представленные в табл. 7.2.

Таблица 7.2. Свойства для доступа к значениям полей объекта TField

Свойство                                                                    Возвращаемый тип

AsBoolean                        Boolean AsFloat      Double AsInteger  Longint AsString                                 String AsDateTime    TDateTime Value   Variant

Если первое поле в текущем наборе данных — строковое, то сохранить его значе

ние в переменной S типа String можно таким образом:

S := Table1.Fields[0].AsString;

В следующем  фрагменте кода  целой  переменной I присваивается значение поля

‘OrderNo’ в текущей записи  таблицы:

I := Table1.FieldsByName(‘OrderNo’).AsInteger;

Типы данных полей

Если необходимо узнать тип поля,  используйте свойство DataType объекта класса TField, которое отображает тип данных  таблицы базы данных  (независимо от типа Object  Pascal). Свойство DataType имеет  тип TFieldType, определенный следующим образом:

type

TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger,

ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD,

ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes,

ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,

ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor,

ftFixedChar, ftWideString, ftLargeint, ftADT,

ftArray, ftReference, ftDataSet, ftOraBlob,

ftOraClob, ftVariant, ftInterface, ftIDispatch,

ftGuid);

Для работы с упоминаемыми выше типами данных существуют специальные клас

сы, производные от класса TField. Они рассматриваются в настоящей главе далее.

Имена и номера полей

Для  поиска  имени определенного поля  используйте  свойство FieldName класса TField. Например, в следующем фрагменте кода имя первого поля в текущей таблице записывается в переменную S типа String:

var

S: String;

begin

S := Table1.Fields[0].FieldName;

end;

Аналогично,  зная   имя   поля,   можно   получить  его  номер,  используя  свойство FieldNo. В следующем  фрагменте кода номер поля  OrderNo помещается в перемен ную I типа Integer:

var

I: integer;

begin

I := Table1.FieldsByName(‘OrderNo’).FieldNo;

end;

НА ЗАМЕТКУ

Для определения количества полей, содержащихся в наборе данных, используйте свойство FieldList объекта TDataSet. Свойство FieldList представляет собой линейное представление всех вложенных полей в таблице, имеющих абстрактный тип данных (ADT — Abstract Data Type).

Для совместимости с прежними версиями в текущей версии Delphi поддерживается также свойство FieldCount, но оно не поддерживает поля типа ADT, которые просто пропускаются.

Манипулирование данными полей

Ниже  приведена последовательность действий, которые следует предпринять для изменения одного  или нескольких полей  в текущей записи.

1.   Чтобы перейти в  режим  редактирования  (Edit),  вызовите  метод  Edit() теку

щего набора данных.

2.  Присвойте полям новые  значения.

3.  Внесите изменения в набор  данных, вызвав  метод  Post() или просто перейдя на новую запись. В этом случае изменения будут внесены автоматически.

Например, типичная процедура изменения записи  выглядит следующим образом:

Table1.Edit; Table1[‘Age’] := 23; Table1.Post;

CОВЕТ

Иногда приходится работать с наборами данных, доступными только для чтения. Примером таких данных может служить информация, расположенная на компакт-диске или получен- ная в ответ на запрос, результат которого не допускает редактирования. Прежде чем пред- принимать попытки редактирования данных, следует убедиться, что текущий набор не со- держит данных, доступных только для чтения. Для этого достаточно проверить значение свойства CanModify. Если возвращаемое значение свойства CanModify равно True, то редактирование набора данных разрешено.

Редактор полей

В Delphi  существует утилита  Fields Editor (Редактор полей), предоставляющая воз можность более  гибкого управления полями набора данных.  Этот  инструмент можно использовать для просмотра отдельного набора данных  в окне  конструктора  форм, для чего достаточно дважды щелкнуть  на компоненте TTable, TQuery или TStored- Proc либо выбрать пункт Fields Editor в контекстном меню для набора данных.  В окне редактора полей  можно  выбрать поля  набора данных, с которыми необходимо рабо тать,  или же создать  новые  вычисляемые либо подстановочные поля.  Для этого  мож но воспользоваться контекстным меню редактора. На рис. 7.3 показано окно  редакто ра полей  с раскрытым контекстным меню.

Для демонстрации использования редактора полей  откройте новый проект и по местите в главную форму  компонент TTable. Установите свойство DatabaseName объекта Table1 равным DBDEMOS (это  псевдоним демонстрационной таблицы, кото рая  входит  в комплект Delphi), а свойство TableName —  равным ORDERS.DB. Помес тите  в форму  компоненты TDataSource и  TDBGrid, чтобы   отобразить результат. Свяжите объект DataSource1 с объектом Table1, а объект DBGrid1 —  с объектом DataSource1. Теперь установите свойство Active объекта Table1 в состояние True и вы увидите данные  таблицы на экране.

Рис. 7.3. Контекстное меню окна редактора полей

(Fields Editor)

Добавление полей

Откройте окно редактора полей  (см. рис. 7.3), дважды щелкнув на объекте Table1. Предположим, что  требуется ограничить  представление таблицы нескольким поля ми. В контекстном меню  окна  редактора полей  выберите команду  Add Fields (Доба вить  поля).  На экране раскроется диалоговое окно  Add Fields. Выделите в списке Available fields (Доступные поля)  поля OrderNo, CustNo и ItemsTotal, а затем щелк ните  на кнопке OK. Эти три  выделенных поля  появятся в окне  редактора полей  и в сетке с данными.

Для представления полей  набора данных, выделенных в окне редактора полей, Delphi  создает  объекты классов, производных от класса  TField. Например, для вы бранных только  что трех полей  таблицы ORDERS.DB Delphi помещает в исходный код формы следующие объявления:

Table1OrderNo: TFloatField; Table1CustNo: TFloatField; Table1ItemsTotal: TCurrencyField;

Заметьте, что  имя  объекта поля —  это  объединение имени  TTable и имени поля. Поскольку эти объекты полей  создаются программно, можно  получить доступ ко всем унаследованным ими от класса TField свойствам и методам  непосредственно во вре мя выполнения программы, а не только  во время  проектирования.

Потомки класса TField

Давайте отвлечемся на минуту от рассмотрения компонентов класса  TField. Для каждого  типа  поля  (типы данных  полей  описывались выше)  существует  один  или не сколько  различных классов,  производных от  класса  TField. Многие  из  этих  типов полей   также   соответствуют  типам   данных,  существующим   в  языке   Object   Pascal. В табл. 7.3 приведены сведения о различных классах  иерархии TField, типах  их ба зовых классов, типах данных их полей  и эквивалентных типах данных  Object  Pascal.Таблица 7.3. Потомки класса TField и типы данных их полей

Производный класс

Базовый

Тип поля

Тип Object Pascal

TStringField TWideStringField TGuidField TNumericField TIntegerField TSmallIntField TLargeintField TWordField TAutoIncField TFloatField TCurrencyField TBCDField TBooleanField TDateTimeField TDateField TTimeField TBinaryField TBytesField

TVarBytesField TBlobField TMemoField TGraphicField TObjectField TADTField TArrayField TDataSetField TReferenceField

TField TStringField TStringField TField TNumericField TIntegerField TNumericField TIntegerField TIntegerField TNumericField TFloatField TNumericField TField

TField TDateTimeField TDateTimeField TField TBinaryField TBytesField TField TBlobField TBlobField TField TObjectField TObjectField TObjectField TDataSetField

ftString ftWideString ftGuid

* ftInteger ftSmallInt ftLargeint ftWord ftAutoInc ftFloat ftCurrency ftBCD ftBoolean ftDateTime ftDate ftTime

* ftBytes ftVarBytes ftBlob ftMemo ftGraphic

* ftADT ftArray ftDataSet ftReference

String WideString TGUID

* Integer SmallInt Int64

Word Integer Double Currency Double Boolean TDateTime TDateTime TDateTime

* Нет Нет Нет Нет Нет

* Нет Нет

TDataSet

TVariantField TInterfaceField TIDispatchField TAggregateField

TField TField TInterfaceField TField

ftVariant ftInterface ftIDispatch Нет

OleVariant IUnknown IDispatch Нет

* Означает абстрактный базовый класс в иерархии TField

Как видно  из табл. 7.3, типы  полей  BLOB и Object — это специальные типы, кото рые  не имеют  прямого аналога  среди  типов  Object  Pascal. Поля  типа  BLOB будут под робно рассматриваться в этой главе далее.

Поля и инспектор объектов

Если  выделить поле  в окне  редактора полей, то  в окне  инспектора объектов (Object Inspector) можно  будет получить доступ к свойствам и событиям, ассоциированным с дан ным экземпляром класса, производного от TField. Это позволяет модифицировать свой ства полей  (например, определять минимальное и максимальное значение, формат ото бражения, а также  делать их доступными только  для чтения). Назначение одних  свойств (таких как ReadOnly — только  для чтения) очевидно из их названия, а назначение других может быть не совсем понятно. Некоторые из "интуитивно непонятных" свойств рассмат риваются в настоящей главе далее.

Открыв в окне инспектора объектов вкладку Events (События), можно увидеть, что с объектами поля ассоциированы и некоторые события. События OnChange, OnGetText, OnSetText и OnValidate подробно описаны в интерактивной справочной системе. Для получения справки по событию достаточно щелкнуть  слева  от его имени, а затем нажать  клавишу  <F1>. Из всех событий чаще  всего  используется, пожалуй,  OnChange. Оно  позволяет выполнять некоторые действия при  каждом  изменении содержимого поля (например, переходить на другую запись или добавлять новую).

Вычисляемые поля

Помимо прочего, в окне редактора полей  к набору данных  можно  добавить вычис ляемые поля.  Допустим, к примеру, что  в набор  данных  необходимо добавить поле, отображающее для каждой  строки в таблице ORDERS объем  оптовой продажи, состав ляющий 32% от общего  объема.  Выберите в контекстном меню окна редактора полей пункт  New Field. На  экране раскроется диалоговое окно  New Field, показанное на рис. 7.4. В поле  Name этого  окна  введите имя  нового поля —  WholesaleTotal. Тип этого  поля —  Currency, поэтому  в раскрывающемся списке  Type выберите именно это значение. В группе  Field Type установите переключатель в положение Calculated (Вычисляемый) и щелкните на кнопке OK. Новое поле  появится в сетке,  но пока  не будет содержать никаких данных.

Рис. 7.8. Перетаскивание полей в форму

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии