Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 40
5. для синонимов определите таблицу синонимов (например, «hang»,"kaput»), и также производите поиск синонимов, добавляя их к тому же списку как и оригинальное слово.
6. слова, имеющие общие окончания (например, «hang» и «hanged»), можно также сделать синонимами, или, как это делает большинство систем, производить анализ окончаний слов, вычисляя корень по их перекрытию (например, слову «hang» соответствует любое слово, чьи первые 4 буквы равны «hang»).
Конечно, есть множестно технических деталей, которые необходимо учесть, например, организация списков, их эффективное управление и объединение. Оптимизация этой характеристики может вам дать очень быстрое время поиска (примером удачный реализаций могут служить двигатели поиска Nexus, Lycos или WebCrawler, обрабатывающие сотни тысяч записей в течение секунды).
dBase
Текущий номер записи набора данных
Delphi 1
>{Извлекает физический номер записи xBase. Требует наличие модулей DBITYPES, DBIPROCS, и DBIERRS в списке используемых модулей. Функция требует на входе один аргументтипа TTable (например, Table1).}
>function Form1.Recno(oTable: TTable): Longint;
>var
> rError: DBIResult;
> rRecProp: RECprops;
> szErrMsg: DBIMSG;
>begin
> Result := 0;
> try
> oTable.UpdateCursorPos;
> rError := DbiGetRecord(oTable.Handle, dbiNOLOCK, nil, @rRecProp);
> if rError = DBIERR_NONE then Result := rRecProp.iPhyRecNum
> else case rError of
> DBIERR_BOF: Result := 1;
> DBIERR_EOF: Result := oTable.RecordCount + 1;
> else
> begin
> DbiGetErrorString(rError, szErrMsg);
> ShowMessage(StrPas(szErrMsg));
> end;
> end;
> excepton
> E: EDBEngineError do ShowMessage(E.Message);
> end;
>end;
Как открыть индексированную таблицу dBase, если отсутствует файл индекса?
Nomadic советует:
Для dBase-таблицы встроенными средствами ты не перестроишь индекс, если его нет. Для этой цели мне пришлось написать процедуру для физического удаления признака индексации в самом dbf-файле и после её применения добавлять индексы заново.
Для этого в заголовок файла dbf по смещению 28(dec) записываешь 0.
По другому никак не выходит(я долго бился) — вот для Paradox таблиц все Ok.
С помощью BDE Callbacks. Пример для Delphi 2.0, на первом не проверял:
=== Callback.pas ===
>unit Callback;
>interface
>uses BDE, Classes, Forms, DB, DBTables;
>type
> TForm1 = class(TForm)
> Table1: TTable;
> procedure FormCreate(Sender: TObject);
> procedure FormDestroy(Sender: TObject);
> private
> CBack: TBDECallback; // опpеделение BDE CallBack
> CBBuf: CBInputDesc; // пpосто буфеp
> function CBFunc(CBInfo: Pointer): CBRType; // Callback-функция
> public
> end;
>var
> Form1: TForm1;
>implementation
>{$R *.DFM}
>procedure TForm1.FormCreate(Sender: TObject);
>begin
> Session.Open; // В это вpемя сессия ещё не откpыта
> CBack := TBDECallback.Create(Session {Hапpимеp}, nil, cbINPUTREQ, @CBRegBuf, SizeOf(CBBuf), CBFunc, False); // Опpеделили Callback
> Table1.Open;
> //^^^^^^^^^^^ - здесь возможна ошибка с индексом, etc.
>end;
>procedure TForm1.FormDestroy(Sender: TObject);
>begin
> CBack.Free; // Освобождаем CallBack
>end;
>function TForm1.CBFunc(CBInfo: Pointer): CBRType;
>begin
> with PCBInputDesc(CBInfo)^ do case eCbInputId of
> cbiMDXMissing {, cbiDBTMissing - можно ещё и очищать BLOB-поля}:
> begin
> iSelection := 3; // Hомеp ваpианта ответа (1-й - откpыть только
> // для чтения, 2-й - не откpывать, 3-й - отсоединить индекс).
> // Возможный источник непpиятностей: а вдpуг в последующих веpсиях
> // BDE номеpа будут дpугими?
> Result := cbrCHKINPUT; // Обpабатывать введённый ответ
> end;
> end;
>end;
>end.
=== Callback.pas ===
PS: конечно, это лишь пример, делающий минимум необходимого. В рамках данного письма невозможно дать какое-то описание BDE Callbacks. Информацию я взял из BDE32.HLP, BDE.INT и DB.PAS. В VCL.HLP совсем ничего нет по этому поводу.
Вообще, руки бы оторвал тем, кто писал справку по Дельфям: я неделю мучался с сабжем, пока случайно не набрёл на Callbacks.
Определение удаления записей в .DBF
Delphi 1
Взято из "Dtopics Database 1.10 from 3K computer Consultancy":
Dbase в BDE имеет большее количество ситуаций 'особого случая', чем таблицы SQL и Paradox, поскольку данный формат поддерживает выражения в индексах и прочие характеристики, например: