Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 Практический раздел.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.18 Mб
Скачать

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

Как уже было отмечено, тип Field является лишь предком для целого ряда (всего их около 30) типизированных полей. При этом каждый тип поля в Delphi соответствует определенному типу данных, используемому в той или иной СУБД. Чаще всего используются следующие классы:

  • TBLOBField - поле BLOB-объекта;

  • TMemoField - поле типа Memo;

  • TGraphicField - графическое поле;

  • TStringField - поле строкового значения;

  • TBCDField - поле BCD-значения;

  • TDateTimeField - поле даты и времени;

  • TFloatField - поле вещественного числа;

  • TCurrencyField - поле денежной суммы;

  • TIntegerField - поле целого числа;

  • TAutoIncField - поле автоинкрементного значения.

Не все перечисленные классы происходят напрямую от TField - для некоторых из них существует "промежуточный" предок. Например, для всех числовых типов определен общий класс TNumericField.

В то же время, имеющееся у класса TField свойство DataType, позволяет получить информацию о том, какого типа значение хранится в поле. Таким образом, обращаясь к методу базового класса, можно не задумываться над тем, с каким конкретным типом объекта мы имеем дело. В Delphi 7 оно определено следующим образом:

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, ftTimeStamp, ftFMTBcd);

Очевидно, что названия типов образуются от префикса ft и названия типа данных. Соответственно, если нам надо получить информацию о том, принадлежит ли интересующее нас поле к тому или иному типу, скажем, к Currency, то достаточно написать выражение вида:

if Table1.FieldByName('BILL_SUMM').DataType = ftCurrency then

caption:='$';

Свойство DataType может пригодиться и в том случае, если нам требуется проверить, существует ли возможность привести данные поля к какому-то определенному виду. Например, если поле содержит целое или вещественное число, то оно может быть представлено как Currency, а если строкового, двоичного или какого-либо еще типа, то нет. Соответственно, проверка может выглядеть следующим образом:

var sum: Currency;

...

if Table1.FieldByName('BILL_SUMM').DataType in [ftInteger, ftWord, ftFloat, ftCurrency] then

sum:=Table1.FieldByName('BILL_SUMM').AsCurrency;

Определение типа поля актуально в том случае, если используются динамические поля, которые создаются автоматически при открытии набора данных. Однако поля можно определить жестко на этапе разработки приложения, в таком случае они будут статическими, и иметь какой-либо вполне определенный тип.

Для определения статических полей следует воспользоваться редактором полей, который можно вызвать двойным щелчком по компоненту Table. Внешне он напоминает редактор списка столбцов компонента DBGrid (см. рис. 19.2), что, впрочем, и не удивительно, так как в обоих случаях мы имеем дело с редактором коллекций. Выбрав их контекстного меню редактора полей пункт Add Fields, мы получим диалоговое окно со списком всех имеющихся в текущей таблице БД полей. Выбрав нужные поля, остается нажать OK и приступить к исследованию получившегося списка. В нем будут находиться выбранные поля (обозначенные по своим заголовкам в таблице БД), являющиеся объектами какого-либо из типов полей. Например, для таблицы клиентов это могут быть поля типа TAutoIncField (для CUST_ID) и TStringField (для CUST_NAME). Если щелкнуть по названию поля в списке, то в инспекторе объектов мы увидим все его опубликованные свойства. При этом автоматически будут созданы и помещены в объявление класса формы соответствующие переменные:

type TForm1 = class(TForm) Table1: TTable; Table1CUST_ID: TAutoIncField; Table1CUST_NAME: TStringField; ... end;

Соответственно, в дальнейшем мы сможем оперировать именно этими переменными, а не обращаться к полям таблицы при помощи методов FieldByName и подобных способов:

Caption:=Table1CUST_NAME;

Кроме того, определяя статические поля на уровне набора данных, становится возможность определить ряд параметров отображения непосредственно на этом этапе. Иначе говоря, задать выравнивание можно для самого поля, а при необходимости, (например, при выводе в таблицу DBGrid) оно будет учтено. Здесь же можно задать порядок следования полей и ограничить их состав.

ПРИМЕЧАНИЕ

Разумеется, можно определить параметры вывода и для динамических полей, но это менее удобно, поскольку на этапе разработки их свойства недоступны, в то время, как параметры статических полей можно определить визуально при помощи инспектора объектов.

Единственным недостатком статических полей по сравнению с динамическими является то, что в случае изменения структуры таблицы с данными, в программе может возникнуть исключительная ситуация.