Последовательный поиск

   Для понимания этой статьи вам будет достаточно базовых знаний о программировании баз данных в Delphi.
   Основная форма проекта должна содержать компоненты TTable и TEdit (назовем его edtSearch). Заметим, что таблица, к которой прикреплен компонент TTable, должна быть проиндексирована по полю, в котором производится поиск.
   Компонент TTable содержит несколько методов для поиска заданного значения в таблице. Это методы Goto, GoToKey, GoToNearest, Find, FindKey, Find Nearest и другие (описание этих методов смотрите в помощи). Добавим обработчик события OnChange для компонента TEdit:

procedure TForm1.edtSearchChange(Sender: TObject);
begin
  with Table1 do begin
    SetKey;
    FieldByName('Company').AsString:=edtSearch.text;
    GotoNearest;
  end;
end;

   Собственно, все. Можно откомпилировать и запустить программу. Введите что-нибудь в поле ввода и вы увидите, как после набора каждого символа указатель текущей записи таблицы перемещается, указывая на запись, сответствующую тому, что вы ввели.
   Теперь можно немного усложнить обработчик onChange. Например, можно отключить обработчик, если пользователь нажимает Backspace или Delete, или поле ввода не содержит текста. Выглядеть это будет примерно так:

procedure TForm1.edtSearchChange(Sender: TObject);
var txt, sfind:string;
      len:integer;
begin
  //don't do anything if user presses
  //delete or backspace
  if edFromCode = true then begin
    edFromCode := false;
    exit;
  end;

  //don't do anything if there is
  //no text in edSearch
  txt:=edtSearch.Text;
  if Length(txt)=0 then exit;

  //goto nearest match
  with Table1 do begin
    SetKey;
    FieldByName('Company').AsString:=edtSearch.text;
    GotoNearest;
  end;

  //calculate what part of text should be selected
  sfind := Table1.FieldByName('Company').AsString;
  len := Length(sfind) - Length(txt);
  if len > 0 then begin
    edFromCode:=true;
    edtSearch.Text:=sfind;
    edtSearch.SelStart:=Length(txt);
    edtSearch.SelLength:=len;
  end;
end;

 

   Для такого случая нужен дополнительный код - обработчик события onKeyDown:

procedure TForm1.edtSearchKeyDown(Sender: TObject; var Key: Word;
                Shift: TShiftState);
begin
  if (Key=VK_DELETE) or (Key=VK_BACK) then begin
    if Lenght(edtSearch.Text)>0 then begin
    //onchange event should not be executed...
      edFromCode := true;
    end;
  end;
end;


Опубликовал admin
1 Дек, Понедельник 2003г.



Программирование для чайников.