Интернет-решения от доктора Боба

Преобразование полей


HTML страница может содержать только простой ASCII текст. Конечно, здесь могут быть и другие вещи встроенный в текст, обычно картинки в .GIF или .JPEG формат. Таблица базы данных содержит поля, у которых есть значения, которые можно преобразовать в строки символов. Дельфи даже имеет встроенное свойство "AsString" для всех основных классов наследованных от TField. Свойство AsString в действительно преобразующие свойство. Для TStringField, AsString может использоваться для чтения значения из поля как строка. Для TBCDField, TCurrencyField, TDateField, TDateTimeField, TFloatField, TIntegerField, TSmallintField, TTimeField, и TWordField, свойство AsString преобразует тип в строку при чтении из поля. Для TBooleanField, свойство AsString возвращает 'T' или 'F'. Для TMemoField, TGraphicField, TBlobField, TBytesField или TVarBytesField, свойство AsString должно использоваться только для чтения из поля. Это возвращает строковое выражение '(Memo)', '(Graphic)', '(Blob)', '(Bytes)' или '(Var Bytes)' соответственно. Так как мемо поля могут содержать важную текстовую информацию, я решил игнорировать все кроме TMemoField, и при работе с TMemoField мы можем использовать метод SaveToStream для чтения данных из поля, как мы увидим это позже. Так что мы можем разделить их на две группы: те у которых мы можем использовать свойство AsString, и те у которых нет. Мы можем определить третий тип (неизвестный - unknown), и использовать следующие определения лоя таблиц не более 255 полей:

const

  MaxField = 255;

  sf_UnKnown = 0;

  sf_String  = 1;

  sf_Memo    = 2;

var

  FieldTypes: Array[0..Pred(MaxField)] of Byte; { default unknowns }

Мы должны просмотреть структуру таблицы для получения информации об типах полей:

 with TTable.Create(nil) do

 try

   DatabaseName := ADatabase;

   TableName := ATable;



   Active := True;

   keys := -1; { no key in table }

   for i:=0 to Pred(FieldDefs.Count) do

   begin

     if Fields[i].IsIndexField then keys := i;

     FieldTypes[i] := sf_String; { default }

     if (FieldDefs[i].FieldClass = TMemoField) then

       FieldTypes[i] := sf_Memo

     else

       if (FieldDefs[i].FieldClass = TGraphicField) or

          (FieldDefs[i].FieldClass = TBlobField) or

          (FieldDefs[i].FieldClass = TBytesField) or

          (FieldDefs[i].FieldClass = TVarBytesField) then

         FieldTypes[i] := sf_UnKnown { ignore }

   end

 finally

   Free

 end;



Содержание раздела