DBGrid с цветными ячейками
DBGrid с цветными ячейками
DBGrid с цветными ячейками Есть ли какой-либо способ придать ячейке 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; В данном случае вызывается метод 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. Старый вызов сохранен для совместимости. Источник: http://www.gyry.net ********************************************************************** Автор: alex schlecht stringgrids / dbgrids с цветными ячейками смотрятся очень красиво, и Вы можете информировать пользователя о важных данных внутри grid. Совместимость: все версии delphi К сожалению, невозможно применить один и тот же метод к stringgrids и к dbgrids. Итак сперва рассмотрим как это сделать в stringgrid: 1. stringgrid ============= Для раскрашивания будем использовать событие "ondrawcell". Следующий код показывает, как сделать в grid красный бэкраунд. Бэкграунд второй колонки будет зелёным. procedure tform1.stringgrid1drawcell(sender: tobject; acol, arow: integer; rect: trect; state: tgriddrawstate); const //сдесь определяем Ваш цвет. Так же можно использовать //цвета по умолчанию. clpalegreen = tcolor($ccffcc); clpalered = tcolor($ccccff); begin //Если ячейка получает фокус, то нам надо закрасить её другими цветами if (gdfocused in state) then begin stringgrid1.canvas.brush.color := clblack; stringgrid1.canvas.font.color := clwhite; end else //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным if acol = 2 //Вторая колонка будет зелёной , другие - ячейки красными then stringgrid1.canvas.brush.color := clpalegreen else stringgrid1.canvas.brush.color := clpalered; //Теперь закрасим ячейки, но только, если ячейка не title- row/column //Естевственно это завит от того, есть у Вас title-row/columns или нет. if (acol > 0) and (arow>0) then begin //Закрашиваем бэкграунд stringgrid1.canvas.fillrect(rect); //Закрашиваем текст (text). Также здесь можно добавить выравнивание и т.д.. stringgrid1.canvas.textout(rect.left,rect.top,stringgrid1.cells[acol,arow]); end; Если Вы захотите чтобы цвет ячеек менялся в зависимости от значения в них, то можно заменить 3 линии (if acol = 2 ......) на что-нибуть вроде этого if stringgrid1.cells[acol,arow] = 'highlight it' then stringgrid1.canvas.brush.color := clpalered else stringgrid1.canvas.brush.color := clwhite; Ну а теперь давайте раскрасим dbgrids: 2. dbgrid ========= С dbgrids это делается намного проще. Здесь мы будем использовать событие "ondrawcolumncell". Следующий пример разукрашивает ячейки колонки "status" когда значение НЕ равно "a". Если Вы хотите закрасить целую линию, то достаточно удалить условие "if..." (смотрите ниже) procedure tform1.dbgrid1drawcolumncell(sender: tobject; const rect: trect; datacol: integer; column: tcolumn; state: tgriddrawstate); const clpalegreen = tcolor($ccffcc); clpalered = tcolor($ccccff); begin if column.fieldname = 'status' then //Удалите эту линию, если хотете закрасить целую линию if column.field.dataset.fieldbyname('status').asstring <> 'a' then if (gdfocused in state) //имеет ли ячейка фокус? then dbgrid1.canvas.brush.color := clblack //имеет фокус else dbgrid1.canvas.brush.color := clpalegreen; //не имеет фокуса //Теперь давайте закрасим ячейку используя стандартный метод: dbgrid1.defaultdrawcolumncell(rect,datacol,column,state) end; Вот и всё. Не правда ли красиво ? :)