Недавно добавленные исходники

•  TDictionary Custom Sort  3 227

•  Fast Watermark Sources  2 992

•  3D Designer  4 751

•  Sik Screen Capture  3 259

•  Patch Maker  3 467

•  Айболит (remote control)  3 528

•  ListBox Drag & Drop  2 904

•  Доска для игры Реверси  80 791

•  Графические эффекты  3 843

•  Рисование по маске  3 172

•  Перетаскивание изображений  2 544

•  Canvas Drawing  2 672

•  Рисование Луны  2 500

•  Поворот изображения  2 094

•  Рисование стержней  2 120

•  Paint on Shape  1 525

•  Генератор кроссвордов  2 183

•  Головоломка Paletto  1 730

•  Теорема Монжа об окружностях  2 158

•  Пазл Numbrix  1 649

•  Заборы и коммивояжеры  2 017

•  Игра HIP  1 262

•  Игра Go (Го)  1 201

•  Симулятор лифта  1 423

•  Программа укладки плитки  1 178

•  Генератор лабиринта  1 512

•  Проверка числового ввода  1 297

•  HEX View  1 466

•  Физический маятник  1 322

•  Задача коммивояжера  1 357

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

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;








Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте