Советы по 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, поскольку данный формат поддерживает выражения в индексах и прочие характеристики, например: