Телефон: +7 (926) 245-03-63

DBFSeek и DBFLocate Как выполнить поиск в таблице?

Следующая статья: TDBGrid - копирование в буфер обмена.

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

// 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 - поиск величины, не связанный с ключевым полем; замена теперь принимает FieldName, 
величина может быть частичной
function DBFLocate(const Table1: TTable; const sFld, sValue: string): boolean;
var
bmPos: TBookMark;
bFound: boolean;
len: integer;
begin
 Result:=False;
 if (sValue <>'') and (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;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Table1.UpdateCursorPos;
 if DBFSeek(Table1, xVal1) then
 begin 
  … // делаем все, что необходимо 
  if DBFLocate(Table1,'CUSTNAME', xVal2) then
  begin 
   … // делаем все, что необходимо
  end;
 end;
end;
Интересное в интернете: мобильная тревожная кнопка