Фильтрация при помощи свойства Filter

Свойство Filter – наиболее часто используемый способ фильтрации записей, имеет тип String. Вначале программист задает условия фильтрации в этом свойстве, затем присваивает логическому свойству Filtered значение True, после чего таблица будет отфильтрована.

Применяя это свойство, достаточно сложных условий задать невозможно, но если условия фильтрации просты, то данный способ незаменим.

Фильтрация при помощисобытия onFilterRecord

Это событие возникает при установке значения True в свойстве Filtered. Применение этого способа имеет большой плюс, и большой минус. Плюс в том что, сгенерировав это событие, программист получает возможность задать гораздо более сложные условия фильтрации. Минус заключается в том, что проверка осуществляется перебором всех записей таблицы. Если таблица содержит очень много записей, процесс фильтрации может затянуться.

Рассмотрим этот способ на примере. Сделаем так, чтобы если пользователь введет букву “П”, то останутся только фамилии, начинающиеся на “П”. Если пользователь введет еще букву “е”, то останутся только фамилии, начинающиеся на “Пе”, и так далее. Поочередно вводя начальные буквы, пользователь доберется до нужных фамилий.

Для начала подготовим модуль данных. В нем нам потребуется создать глобальную переменную ed, чтобы мы могли передавать в нее текст из компонента Edit1:

Пишем в раздел public:

var

fDM: TfDM;

ed: String; //текст из Edit1

Этого действия можно было бы избежать, если бы компонент ADOTable, подключенный к таблице LichData, располагался на главной форме. Но поскольку он находится в модуле данных, то и событие onFilterRecord будет сгенерировано в нем. А в этом событии нам нужно будет знать, что в данный момент находится в поле ввода Edit1. Именно для этого и нужна глобальная переменная ed.

Далее выделяем TLichData, то есть, компонент ADOTable, подключенный к таблице LichData. На вкладке Events (События) инспектора объектов найдите событие onFilterRecord и дважды щелкните по нему, сгенерировав процедуру. Полный листинг процедуры:

{onFilterRecord главной таблицы}

procedure TfDM.TLichDataFilterRecord(DataSet: TDataSet;

var Accept: Boolean);

var

s: String; //для значения поля

begin

//получаем столько начальных букв из поля Фамилия,

//сколько букв имеется в переменной ed:

s:= Copy(DataSet['Фамилия'], 1, Length(ed));

//делаем проверку на совпадение значений:

Accept:= s = ed;

end;

Здесь в переменную s попадает столько начальных букв из поля “Фамилия”, сколько букв содержит в данный момент компонент Edit1 на главной форме (эти буквы мы передадим в переменную ed чуть позже). Если текст в переменной s совпадает с текстом из поля Edit1, то переменной Accept присваивается True, и запись принимается. Иначе запись отфильтровывается. Не забудьте сохранить проект.

Далее перейдем в главную форму. Нужно удалить весь текст из события onChange компонента Edit1, и вписать новый:

{Изменение поиска по фамилии}

procedure TfMain.Edit1Change(Sender: TObject);

begin

//если в поле Edit1 есть хоть одна буква,

if Edit1.Text <> ” then begin

fDM.TLichData.Filtered:= False; //отключаем фильтр

fDM.ed:= Edit1.Text; //передаем в fDM новый текст

fDM.TLichData.Filtered:= True; //включаем фильтр

end

//если букв нет, фильтрацию отключаем:

else fDM.TLichData.Filtered:= False;

end;

Как только пользователь введет хоть одну букву, срабатывает событие onChange компонента Edit1. Если в Edit1 есть хоть одна буква, то мы вначале отключаем фильтрацию, отменяя прошлый фильтр, если он был. Затем мы передаем в глобальную переменную ed, расположенную в модуле данных, текст из Edit1. Далее снова включаем фильтр. При этом срабатывает событие onFilterRecord нашей таблицы, и в этом событии сравнивается текущее значение переменной ed и записей поля “Фамилия”.

Сохраните проект, скомпилируйте и запустите программу. Проверьте, как фильтруются записи. При вводе букв учитывайте регистр символов.

При помощи события onFilterRecord можно создавать сложные проверки. В этом событии можно сравнивать не одно поле, а несколько, причем поля не обязательно должны быть индексированы. Вы можете проверять на совпадение хоть все поля таблицы, и поскольку фильтрация происходит путем перебора записей, то усложнение условных проверок заметно не замедлит этот процесс.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: