Базы данных
Программирование баз данных в Delphi:
Использование фильтрации записей в компонентах TTable и TQuery
(TPanel, TEdit, TCheckBox, Filter).
Наша складская программа уже многое может, но что делать
, если потребуется просмотреть или просто вывести на экран не все записи
, а лишь небольшую их часть, отфильтрованную так, как нам нужно. Для этих целей нам потребуется
2-а свойства компонентов TTable (или TQuery, зависит от того, что используется):
Свойство "Filter" имеет строковый тип данных и предназначено для ввода
строки относительно которой будет производиться фильтрация,
а свойство "Filtered" имеет логический тип данных
и предназначено для активации фильтра данных
(значения: "True" - использовать фильтр данных, а "False" - не использовать).
Теперь попробуем использовать данную информацию для реализации нашего фильтра.
Для начала немножко изменим внешний вид формы "frmTableView"
(Редактирование списка товаров). Разместим на форме компонент -
"TPanel"*:
и дадим ему имя "pnBottom" (свойство компонента "Name").
Вырежем с формы компонент "dbnView" (Делаем клик правой кнопкой по
компоненту и в появившемся контекстном меню выбираем пункт
"Cut")*:
Теперь нам необходимо вставить вырезанный компонент на нашу панель
(Делаем клик правой кнопкой по панели "pnBottom" и
в появившемся контекстном меню выбираем пункт
"Paste")*:
В итоге мы получили следующую картину (либо что-то похожее)*:
Проведем следующие изменения свойств компонентов:
Имя компонента
|
Свойство
|
Значение
|
Описание действий
|
pnBottom
(TPanel) |
|
|
|
|
Align
|
alBottom
|
Выравнивание компонента по нижнему краю.
|
|
Caption
|
Очишаем содержимое.
|
Очищаем заголовок компонента (Панели).
|
dbgView
|
|
|
|
|
Align
|
alClient
|
Выравнивание компонента до границ объекта, на котором он находится, в данном случае формы.
|
Расположим покрасивее компонент "dbnView", который теперь у нас
располагается на панели и вуаля, мы можешь растягивать как угодно форму или развернуть ее на весь экран, вместе с формой будет растягиваться и табличка.
Поместим на нашу панель еще 2-а
компонента, которые понадобятся нам для фильтрации данных:
Укажем имя компоненту (свойство Name) TEdit - eFilter и компоненту TCheckBox
- chbFEnable. Теперь очистим содержимое свойства "Text" компонента eFilter,
а заголовку компонента "chbFEnable" (свойство "Caption") присвоить значение
"Активировать фильтр". Если потребуется, то компонент "chbFEnable"
придется немного растянуть, чтобы влазил весь текст заголовка.
Смотрим, что примерно должно получиться*:
Поехали дальше. Пишем процедуру, которая будет заниматься фильтрацией данных:
...
private
{ Private declarations }
procedure AddFilter;
// Не забудем объявить нашу процедуру в ветке private.
...
procedure TfrmTableView.AddFilter;
var
strFilter: String; // Строка фильтра.
fieldName: String; // Имя поля.
fieldNum: Integer; // Номер поля.
fieldIsString: Boolean; // Переменная для определения, является ли поле строкового типа поля.
i: Integer; // Код ошибки при преобразовании типа.
tmpR: Real; // Переменная для временных числовых данных.
begin
if
chbFEnable.Checked // Проверяем наличие галочки.
and (Length(eFilter.Text) > 0) // проверяем наличие строки для фильтрации.
then
begin
fieldName := dbgView.SelectedField.FieldName; // Получаем имя поля.
fieldNum := tbView.FindField(fieldName).Index; // Получаем номер поля.
// Проверяем, является ли тип поля строковым. if (tbView.Fields[fieldNum].DataType in [ftString])
then
fieldIsString := True // Говорим что строка.
else
begin
fieldIsString := False; // Говорим что не строка.
Val(eFilter.Text, tmpR, i); // Так-как не строка, то должны проверить, нет ли символов кроме чисел.
if i <> 0 then
begin
tbView.Filtered := False; // Снимаем фильтр.
exit; // Прерываем выполнение, если есть символы кроме чисел.
end;
end;
// Начинаем формировать строку фильтра.
strFilter := fieldName + '=';
// Проверяем является ли поле строковым и относительно этого задаем строку фильтра.
if fieldIsString = True then
strFilter := strFilter + QuotedStr(eFilter.Text + '*') // Задаем строке фильтра значение компонента eFilter с символом маски (*) на конце.
else
strFilter := strFilter + QuotedStr(eFilter.Text); // Задаем строке фильтра значение компонента eFilter
tbView.Filtered := False; // отключаем фильтр. tbView.Filter := strFilter; // Задаем фильтр.
tbView.Filtered := True; // Включаем фильтрацию данных.
end
else
tbView.Filtered := False; // Отключаем фильтр, если условие не выполнено.
end;
|
Немножко пройдемся по коду. Определение типа данных, введенных в компоненте eFilter
проводится с целью исключить ошибки при установке фильтра, для этой цели
была использована процедура val(), которая возвращает код ошибки,
в случае когда перевод невозможен, этим мы и воспользовались для определения
типа введенных данных. А определение типа данных выделенного поля проводится для того, чтобы можно было наложить фильтр по маске, для увеличения результата поиска, так-как в данном случае поиск будет проводиться
по вхождению первых символов, либо по тому, как будет наложена масска. Например в случае когда мы укажем строку фильтра вот так - "*CD*", поиск будет проводиться по вхождению слова "CD", независимо от его нахождения в тексте, а в нашем случае маска ставится вконце слова - "CD*", таким образом будет выведен список слов начинающихся на "CD".
Устанавливаем на обработчики событий компонентов(изображено: компонент -> событие):
"eFilter" -> "KeyUp"
"dbgView" -> "CellClick"
"chbFEnable" -> "Click"
выполнение процедуры "AddFilter" и запускаем наш проект, вуаля:
Для установки фильтра по заданному полю, необходимо выделить
поле, на которое необходимо установить фильтр и поставить галочку -
"Активировать фильтр".
Попробуем установить заведомо неверный фильтр на числовое поле,
наш фильтр отключается:
P.S.
При фильтрации необходимо учитывать регистр символов.
В этой статье был разобран фильтр на основе компонента
TTable, но установка фильтра при использовании компонента TQuery
выглядит аналогичным образом.
Скриншоты, помеченные знаком * ,
являются цитатами и иллюстрациями
программного продукта "Turbo Delphi",
авторское право на который принадлежит "Borland
Software Corporation".
|