Для понимания этой статьи вам будет достаточно базовых знаний о
программировании баз данных в 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;
|