Телефон: +7 (926) 245-03-63

DBGrid с цветными ячейками

Следующая статья: Различные цвета строк в DBCtrlGrid.

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

Решение 1

Здесь показано, как изменить цвет отдельных ячеек GBGrid без создания нового компонента.

Создайте форму, поместите на нее компонент TTable и укажите ему на таблицу EMPLOYEE.DB в базе данных DBDEMOS. Затем разместите на форме DataSource и DBGrid, «соедините» их и вы получите «живые» данные.

Для демонстрации данной технологии выбрано поле Номер служащего в таблице EMPLOYEE.DB «покрашены» ячейки с нечетными числами. То есть, если число нечетное, красим ячейку в зеленый цвет.

Единственный код расположился в обработчике события OnDrawColumnCell компонента DBGrid и выглядел он так:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var holdcolor:Tcolor;
begin
holdcolor:=DBGrid1.Canvas.Brush.color; { сохраняем оригинальный цвет }
if Column.FieldName ='EmpNo' then { «раскрашиваем» ячейки только для поля EmpNo }
if (Column.Field.AsInteger mod 2<>0) then
begin
DBGrid1.Canvas.Brush.color:=clGreen;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
DBGrid1.Canvas.Brush.color:=holdcolor;
end;
end;

В данном случае вызывается метод DefaultDrawColumnCell компонента TCustomDBGrid, являющийся родителем для TDBGrid. Он раскрашивает зеленым цветом нечетные ячейки поля EmpNo.

Решение 2

Обработайте событие OnDrawDataCell. Вот пример, который использует демонстрационную таблицу COUNTRY и выводит текст красным цветом во всех строках, содержащих страны с населением свыше 10 миллионов человек:

 procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
 begin
 if Table1.FieldByName('Population').AsFloat > 10000000 then DBGrid1.Canvas.Font.color:=clRed;
 dbGrid1.DefaultDrawDataCell(Rect, Field, State);
 end;

Примечание: Borland не рекомендует использовать в новых разработках обработчик события OnDrawDataCell, которому пришел на смену обработчик OnDrawColumnCell. Старый вызов сохранен для совместимости.

Интересное в интернете: автоматизация розничного магазина