Delphi 3 и создание приложений баз данных

Инкрементальный локатор


Под локатором будем понимать механизм поиска (точного или приблизительного) записей в НД с последующим позиционированием на них курсора компонента TTable. Для реализации локатора обычно применяется один или несколько компонентов TEdit для ввода условий поиска и кнопка TButton, обработчик события нажатия которой и реализует поиск.

Описанные выше обработчики события нажатия кнопки FindButton реализуют локаторы. Однако, вне рассмотрения остался еще один режим: по вводу каждого символа в TEdit переходить на запись, ближе всего лежащую к искомой. Чем больше введено символов, тем ближе курсор БД к искомой записи. Такой локатор называется инкрементальным.

Пусть необходимо реализовать инкрементальный локатор для уточняющего поиска записи по названию товара. Пусть описанный выше НД отсортирован по индексному полю 'Tovar'. Пусть текущая запись в нем - логически первая. Тогда он имеет вид, показанный на рис. 8.13.

Ввод значения для поиска осуществляется в компонент Edit3. Напишем обработчик для события OnChange, возникающего при любом изменении значения в Edit3:

procedure TForm1.Edit3Change(Sender: T0b;ect) ;

begin

Table1.FindNearest([Edit3.Text]) ;

end;

Пусть нам нужно сделать текущей запись с наименованием товара "Комплект отверток". При использовании описываемого механизма инкрементального локатора необязательно вводить это название полностью. Курсор НД будет приближаться к искомой записи по мере ввода символов в Edit3.

Введем в Edit3 символ "К" (Edit3.Text = 'К');

Тогда Tablel.FindNearest([Edit3.Text]) ;

есть на самом

деле Table1.FindNearest(['К']) ;

в результате курсор переместится на 1-ю запись, имеющую в поле Tovar значение, большее строки 'К' (рис. 8.14).



Введем в Edit3 следующий символ, "о" (Edit3.Text = 'Ко').

В результате курсор переместится на 1-ю запись, имеющую в поле Tovar значение, большее строки 'Ко' (рис. 8.15).

Это и есть искомая запись. Заметим, что применение инкрементальных локаторов возможно не только для символьных полей, но и для числовых. Пусть для того же НД, отсортированного по номеру группы (рис.8.16).

производится поиск по этому номеру. Для этой цели используется такой обработчик изменения значения в компоненте Editi:

procedure TForm1.Edit1Change(Sender: TObject) ;

var GrTmp : Longint;

begin

GrTmp := StrToInt(Edit1.Text);

//поиск записи

Table1.FindNearest([GrTmp]) ;

end;

Будем вводить в Edit1 значение "100". Тогда после ввода "1" текущей останется запись с номером группы, равным 1 (рис. 8.17).

после ввода "100" текущей станет запись с номером группы, равным 100, т.е. удовлетворяющая условию поиска (рис. 8.19):



Содержание раздела