Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков КРЭКЕРСТВО + ПРОГРАММИРОВАНИЕ 2017
(актуальность: июнь 2017)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



DBFSeek и DBFLocate

Автор: Tom

Надежней и намного быстрее (если вы ищите отдельные записи) выполнить поиск строки с помощью Seek (если найдена первая запись), или выполнить Locate (индекс не требуется)

например


 Table1.UpdateCursorPos;
 if DBFSeek( Table1, xVal1 ) then {_не_ delphi-функция - смотри ниже}
 begin
   if DBFLocate( Table1, 'CUSTNAME', xVal2  ) then {_не_ delphi-функция - модификация из faq}
   begin
     //... делаем все, что необходимо
   end;
 end;
 

P.S.

  1. DBFLocate - модифицированная из faq фунция fieldname
  2. DBFSeek - функция, найденная методом проб и ошибок! - значительно лучшая (IMHO) чем setkey...fieldbyname1...fieldbyname2...gotokey, используемые для выражений индексов dBase за первым полем. Вы можете использовать FindKey для dBase индексов, состоящих из одного поля, вопреки мнению других участников форума.

 {============================================================
 { DBFSeek
 { поиск величины с использованием индекса - простой путь
 {============================================================}
 
 function DBFSeek(const Table1: TTable; const sValue: string): boolean;
 var
 
   sExpValue: DBIKEYEXP;
   bmPos: TBookMark;
   nOrder: integer;
 
 begin
 
   Result := False;
 
   with Table1 do
   begin
     if (Active) and (Length(IndexName) > 0) then
     begin
       bmPos := GetBookMark;
       DisableControls;
 
       StrPCopy(sExpValue, sValue);
       if (DbiGetRecordForKey(Handle, True, 0, strlen(sExpValue), @sExpValue, nil)
         = DBIERR_NONE) then
         Result := True
       else
         GotoBookMark(bmPos);
 
       FreeBookMark(bmPos);
       EnableControls;
     end;
   end;
 end;
 
 {==================================================================================
 { DBFLocate
 { поиск величины, не связанный с ключевым полем
 { замена из faq, теперь акцептует fieldname, величина может быть частичной
 {================================================================================}
 
 function DBFLocate(const Table1: TTable; const sFld, sValue: string): boolean;
 var
 
   bmPos: TBookMark;
   bFound: boolean;
   len: integer;
 begin
 
   Result := False;
   if (not StrEmpty(sValue)) and (not StrEmpty(sFld)) then
   begin
     with Table1 do
     begin
       DisableControls;
       bFound := False;
       bmPos := GetBookMark;
       len := Length(sValue);
       First;
 
       while not EOF do
       begin
         if FieldByName(sFld).AsString <> sValue then
           Next
         else
         begin
           Result := True;
           bFound := True;
           Break;
         end;
       end;
 
       if (not bFound) then
         GotoBookMark(bmPos);
 
       FreeBookMark(bmPos);
       EnableControls;
     end;
   end;
 end;
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS