В предыдущей статье «Как улучшить внешний вид DBGrid» мы рассмотрели некоторые из приемов визуального улучшения внешнего вида объекта представления данных в табличном виде.
Очень часто DBGrid используется для просмотра результатов выборки данных из таблицы. Причем не важно, является ли это выборка из одной или нескольких таблиц, объединенных посредством ключевых полей.
На мой взгляд, довольно удобным является представление таблицы в таком виде, которое будет подсвечивать поле отдельным цветом, по которому осуществлялась выборка. Давайте сделаем такую таблицу DBGrid, как на рисунке:
Обратим внимание на первый столбец таблицы. Он окрашен в светло-зеленый цвет. То есть, по данному столбцу осуществлялся поиск — были выбраны должности, которые входят в группу «Терапевты». Точно также можно сделать окрашивание по любому столбцу. В данном случае, таблица состоит из двух столбцов, поэтому можно окрасить столбец «Должность»:
В данном случае выборка осуществлялась по полю «Должность» по неполному совпадению и в результат попали все записи с должностями, где фигурирует слово «хирург».
Для окрашивания нам понадобиться завести глобальную переменную строкового типа sTipFilter. В ней мы будем хранить условное название столбца. Об этом будет рассказано немного ниже. Пока что объявите эту переменную в главной форме программы. Это удобно, поскольку мы ее можем использовать во всех остальных формах. При этом не стоит забывать, что главная форма должна быть подключена в разделе Uses того модуля, где мы будем использовать нашу переменную.
В процедуре, где мы будем осуществлять фильтрацию данных, мы будем задавать значение для нашей переменной sTipFilter.
Процедура, которая осуществляет поиск выглядит следующим образом (у меня поиск осуществляется при создании формы, но это может быть и событие onClick кнопки):
procedure TfrmFindPositions.FormCreate(Sender: TObject); var sFilter, sFilterSQL: string; //Переменная для поиска begin adoResult.sql.Clear; adoResult.sql.add('SELECT '); adoResult.sql.add('Группы_должностей.idГруппы_должностей,'); adoResult.sql.add('Группы_должностей.Группа,'); adoResult.sql.add('Должности.idДолжности,'); adoResult.sql.add('Должности.Должность'); adoResult.sql.add('FROM группы_должностей'); adoResult.sql.add('LEFT JOIN должности'); adoResult.sql.add('ON группы_должностей.idГруппы_должностей = должности.idГруппы_должностей'); //Формируем условия для запроса if frmPositions.rbGroup.Checked then begin sFilter:=trim('%'+frmPositions.txtFilter.Text+'%'); sFilterSQL:='WHERE Группы_должностей.Группа LIKE '''+sFilter+''''; sTipFilter:='Название группы'; end; if frmPositions.rbPosition.Checked then begin sFilter:=trim('%'+frmPositions.txtFilter.Text+'%'); sFilterSQL:='WHERE Должности.Должность LIKE '''+sFilter+''''; sTipFilter:='Должность'; end; //Подстанавливаем условие для запроса adoResult.sql.add(sFilterSQL); adoResult.Open; end;
Давайте обратим внимание на переменную sTipFilter, которую мы ранее объявляли в коде. Ей мы присваиваем произвольное строковое значение, которое мы задаем в зависимости от того, какой критерий поиска у нас указан.
Для раскрашивания столбца мы также будем использовать событие onDrawColumnCell нашего объекта DBGrid, которое известно нам по предыдущей статье (Как улучшить внешний вид DBGrid).
procedure TfrmFindPositions.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with TPeekAtCustomDBGrid(Sender) do begin if DataLink.ActiveRecord = Row - 1 then begin Canvas.Brush.Color := clBlue; Canvas.Font.Color := clYellow; end else if sTipFilter='Название группы' then TDBGrid(Sender).Columns[0].Color:=$0059B300; // то красим столбец Названия отдела if sTipFilter='Должность' then TDBGrid(Sender).Columns[1].Color:=$0059B300; end; // Перерисовываем DBGrid TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State); end;
Здесь мы как раз проверяем значение нашей переменной sTipFilter, и в зависимости от значения мы окрашиваем тот или иной столбец.
Как видите процесс окрашивания не сложный, но он в значительной степени способен изменить внешний облик объекта DBGrid в лучшую сторону.