Разноцветные ячейки в DBGrid

Разноцветные ячейки в DBGrid

На практике очень часто требуется отображать данные из базы данных на форме в табличном виде.

В поставку Delphi входит всем известный компонент DBGrid. Это достаточно развитый компонент и по своим возможностям он не уступает платным аналогам. Единственное исключение состоит в том, что нужно для той или иной нестандартной функции написать несколько строк программного кода.

Если таблица на форме будет одного цвета, то восприятие информации будет не самым удобным, но если сделать разноцветные ячейки в DBGrid в зависимости от значений, находящихся в ячейках, то зрительное восприятие такой таблицы будет намного приятнее.

Событие onDrawColumnCell объекта DBGrid возникает при прорисовке любой из его ячеек. Поэтому для раскрашивания наших ячеек как раз потребуется именно это событие.

Но перед этим необходимо объявить класс TPeekAtCustomDBGrid. Его нужно объявить перед объявлением класса формы в разделе описания классов (типов). В коде это показано красной строкой:

unit control_;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, Mask, Buttons, DB, ADODB,
  Vcl.Styles, Vcl.Themes, uxTheme, Vcl.ComCtrls, Vcl.WinXCalendars,
  Winapi.CommCtrl, Vcl.Imaging.pngimage, DateUtils, Vcl.Grids, Vcl.DBGrids,
  frxClass, frxDBSet, inifiles;
type
  TPeekAtCustomDBGrid = class(TCustomDBGrid);
  TfrmControl = class(TForm)
    Panel4: TPanel;
    Panel5: TPanel;
    Panel3: TPanel;
    imgClose: TImage;
    txtFilter: TEdit;
    adoTovarL: TADOQuery;

Затем, после того, как класс (тип) объявлен можно написать процедуру, представленную ниже:

procedure TfrmControl.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 := $002C2B2C;
          Canvas.Font.Color := clWhite;
        end else
        begin
            TDBGrid(Sender).Columns[0].Color:=clGray;
            TDBGrid(Sender).Columns[1].Color:=clGray;
            TDBGrid(Sender).Columns[2].Color:=clGray;
            TDBGrid(Sender).Columns[3].Color:=clGray;
            TDBGrid(Sender).Columns[4].Color:=clGray;
            TDBGrid(Sender).Columns[5].Color:=clGray;
            TDBGrid(Sender).Columns[6].Color:=clGray;
            TDBGrid(Sender).Columns[7].Color:=clGray;
            TDBGrid(Sender).Columns[8].Color:=clGray;
            TDBGrid(Sender).Columns[9].Color:=clGray;
            TDBGrid(Sender).Columns[10].Color:=clGray;
            if Column.FieldName = 'Разница' then
            begin
               if (Column.Field.AsInteger < 0) then
               begin
                   DBGrid1.Canvas.Brush.Color := clRed;
                   Canvas.Font.Color := clWhite;
               end;
               if (Column.Field.AsInteger > 0) then
               begin
                   DBGrid1.Canvas.Brush.Color := clGreen;
                   Canvas.Font.Color := clWhite;
               end;
               if (Column.Field.AsInteger = 0) then
               begin
                   DBGrid1.Canvas.Brush.Color := clGray;
                   Canvas.Font.Color := clWhite;
               end;
            end;
        end;
   end;
   // Говорим объекту DbGrid, чтобы он перерисовался
     TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;

Здесь, код, отвечающий за раскраску ячеек выделен красным цветом.

В данном коде мы все столбцы с 0 по 10 (а соответственно и ячейки в них) раскрашиваем в серый цвет (clGray). Допустим нам нужно раскрасить столбец «Разница». Тогда мы в коде проверяем: Если у нас столбце «Разница» (if Column.FieldName = 'Разница'), то делаем дополнительное вложенное условие на предмет того, что если значение поля меньше нуля, то раскрашиваем фон в красный цвет (clRed), а шрифт в белый (clWhite). Если больше нуля, то в зеленый, а если равно нулю, то оставляем также серым цветом.

Замечу сразу, что код значительно можно сократить, например, раскрасить в цикле все столбцы, то есть вот этот кусок:

TDBGrid(Sender).Columns[0].Color:=clGray;
TDBGrid(Sender).Columns[1].Color:=clGray;
TDBGrid(Sender).Columns[2].Color:=clGray;
TDBGrid(Sender).Columns[3].Color:=clGray;
TDBGrid(Sender).Columns[4].Color:=clGray;
TDBGrid(Sender).Columns[5].Color:=clGray;
TDBGrid(Sender).Columns[6].Color:=clGray;
TDBGrid(Sender).Columns[7].Color:=clGray;
TDBGrid(Sender).Columns[8].Color:=clGray;
TDBGrid(Sender).Columns[9].Color:=clGray;
TDBGrid(Sender).Columns[10].Color:=clGray;

А вместо конструкции if можно использовать case. Эти изменения желательно выполнить в коде, чтобы он выглядел более профессионально. Здесь же это отсутствует, чтобы иметь возможность показать логику раскрашивания ячеек для читателей, имеющих небольшой опыт в программировании.

Результат раскрашивания будет выглядеть как на рисунке ниже:

Понравилась статья? Поделиться с друзьями:
Блог Алексея Иванкова
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: