Выбрать главу

var

 i, HighTheFields, LowTheFields: integer;

 BM: TBookmark;

begin

 TheTable.DisableControls;

 BM:= TheTable.GetBookmark;

 try

  LowTheFields:= Low(TheFields);

  HighTheFields:= High(TheFields);

  SFor:= UpperCase(SFor);

  Result:= False;

  if FromBeginning then TheTable.First;

  if SearchBackwardthen begin

   TheTable.Prior;

   while not TheTable.BOF do begin

    for i:= LowTheFields to HighTheFields do begin

     if DoFindIn(TheTable.Fields[TheFields[i]], SFor) then begin

      Result := True;

      Break;

     end;

    end;

    if Result then Break else TheTable.Prior;

   end;

  end else begin

   TheTable.Next;

   while not TheTable.EOF do begin

    for i:= LowTheFields to HighTheFields do begin

     if DoFindIn(TheTable.Fields[TheFields[i]], SFor) then begin

      Result:= True;

      Break;

     end;

    end;

    if Result then Break else TheTable.Next;

   end;

  end;

 finally

  TheTable.EnableControls;

  if not Result then TheTable.GotoBookmark(BM);

  TheTable.FreeBookmark(BM);

 end;

end;

end.

Калькуляция

Хитрость OnCalcFields

Событие OncalcFields генерится ОЧЕНЬ часто и может быть необязательным и занимать большое количество времени, например, у вас есть таблица с неким вычисляемым полем, и при каждом редактировании таблицы вызывается следующий код:

MyCalcField.AsInteger:= Table1Field1.AsInteger + 10;

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

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

Procedure TForm1.BigProcessingFunction;

begin

 Table1.OnCalcFields:= nil;

 <Включите любые по сложности вычисления в этом месте!>

 Table1.OnCalcFields:= Table1OnCalcFields;

end;

Поля не вычисляются в течение времени обработки, которое может быть достаточно велико, но при наличие громоздких вычислений специфического поля (или даже нескольких полей), все вычисляется за один проход!

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

dBASE

Таблицы dBASE: Структура .DBF-файла

Иногда возникает необходимость поработать с таблицей dBASE напрямую, без Borland Database Engine (BDE). К примеру, если .DBT-файл (содержащий MEMO-данные) для данной таблицы безвозвратно потерян, .DBF-файл становится абсолютно непригодным, поскольку байт в заголовке .DBF-файла указывает, что таблица должна содержать соответствующий MEMO-файл. Решение этой проблемы потребует обнуление этого байта, для того чтобы таблица не указывала на сопутствующий MEMO-файл. Или, если Вам захотелось написать собственную программу для работы с данными.

Ниже приводяся структуры .DBF-файлов для таблиц dBASE. Представлены структуры файлов для различных версий dBASE: dBASE III PLUS 1.1, dBASE IV 2.0, dBASE 5.0 под DOS и dBASE 5.0 для Windows.

Структура заголовка файла данных для таблицы dBASE III PLUS.
Заголовок табличного файла
Байт Содержание Описание
0 1-й байт Определение наличия MEMO-файла в таблице dBASE III PLUS (03h без MEMO-файла (.DBT-файл;) 83h с MEMO-файлом).
1-3 3 байта Дата последнего обновления в формате YYMMDD
4-7 32-битное число Количество записей в таблице
8-9 16-битное число Количество байтов, занимаемых заголовком
10-11 16-битное число Количество байтов, занимаемых записью
12-14 3 байта Зарезервированная область
15-27 13 байт Зарезервировано для сетевой версии dBASE III PLUS
28-31 4 байта Зарезервированная область
32-n 32 байта Массив с описаниями полей (структура каждого такого описания показана ниже)
n+1 1 байт Хранится значение 0Dh, выполняющее роль терминатора описаний полей

n – последний байт массива с описаниями полей. Размер массива зависит от количества полей в табличном файле.

Описание поля таблицы
Байт Содержание Описание
0-10 11 байт Имя поля в ASCII (заполнено нулями).
11 1 байт Тип поля в ASCII (C, D, L, M или N)
12-15 4 байта Адрес данных поля (ссылка на память, а не на диск)
16 1 байт Размер поля в бинарном формате
17 1 байт Порядковый номер поля в бинарном формате
18-19 2 байта Зарезервировано для сетевой версии dBASE III PLUS
20 1 байт ID рабочей области
21-22 2 байта Зарезервировано для сетевой версии dBASE III PLUS
23 1 байт Флаг установки поля
24-31 1 байт Зарезервированная область