Меню

Как изменить цвет строк dbgrid delphi



Как изменить цвет строк dbgrid delphi

Размещение сквозной ссылки

Замечательные возможности DBGrid

Нередко при разработке приложений, использующих табличный вывод данных, требуется отобразить те или иные строки таблиц нестандартным образом, например, с целью привлечения внимания пользователя к этим строкам. В данной статье содержатся некоторые советы, касающиеся нестандартного отображения данных в компоненте TDBGrid.

Как изменить цвет строки в TDBGrid

Предположим, нам требуется изменить атрибуты текста и фона строки в компоненте TDBGrid, если значение какого-либо поля удовлетворяет заранее заданному условию. Для этой цели принято использовать обработчик события OnDrawColumnCell этого компонента. Отметим, что возможности, предоставляемые при его использовании, весьма разнообразны.

Рассмотрим простейшее приложение с TDBGrid, содержащее один компонент TTable, один компонент TDataSource и один компонент TDBGrid: Установим значения их свойств в соответствии с приведенной ниже таблицей:

Компонент Свойство Значение
Table1 DatabaseName BCDEMOS ( или DBDEMOS)
TableName events.db
Active true
DataSource1 DataSet Table1
DBGrid1 DataSource DataSource1


Рис. 1 Тестовое приложение на этапе проектирования

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

Его параметр Rect – структура, описывающая занимаемый ячейкой прямоугольник; параметр Column — колонка DBGrid, в которой следует изменить способ рисования изображения. Для вывода текста используется метод TextOut свойства Canvas компонента TDBGrid.

Предположим, нам нужно изменить цвет текста и фона строки в зависимости от значения какого-либо поля (например, VenueNo). Создадим обработчик события OnDrawColumnCell компонента DBGrid1.

В случае Delphi соответствующий код имеет вид:

В результате на этапе выполнения при отображении строк, в которых значение поля VenueNo равно 1, фон ячеек будет окрашен в зеленый цвет, а текст выведен белым цветом.


Рис. 2 Изменение цвета фона и шрифта в строках со значением поля VenueNo=1 на этапе выполнения.

При выводе выделенных строк все данные в ячейках оказались выровненными по левому краю. Если мы хотим более корректно отобразить выравнивание текста в колонке, следует слегка модифицировать наш код, учитывая значение свойства Alignment текущей (то есть рисуемой в данный момент) колонки:

Читайте также:  Что такое цвет мочи см комм

Соответствующий код для Delphi имеет вид:

В этом случае выравнивание текста в колонках совпадает с выравниванием столбцов.

Отметим, что величина смещения (в данном случае два пиксела), вообще говоря, зависит от гарнитуры и размера шрифта, используемого в данной колонке, и должна подбираться индивидуально.


Рис. 3 Изменение цвета с учетом выравнивания текста в колонках.

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

Соответствующий код для Delphi имеет вид:

В результате выделенными оказываются только ячейки, для которых выполняются выбранные нами условия:


Рис. 4 Выделение цветом данных в одной колонке.

Как заменить данные в столбце компонента TDBGrid

Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid:

Соответствующий код для Delphi имеет вид:


Рис. 5 Замена данных в колонке другими значениями.

Еще один пример – использование значков из шрифтов Windings или Webdings в качестве подставляемой строки.

Соответствующий код для Delphi имеет вид:


Рис. 6 Использование символов из шрифта Windings для выделения нужных значений в колонке.

Как поместить графическое изображение в TDBGrid

Использование свойства Canvas компонента TDBGrid в методе OnDrawColumnCell позволяет не только выводить в ячейке текст методом TextOut, но и размещать в ячейках графические изображения. В этом случае используется метод Draw свойства Canvas.

Модифицируем наш пример, добавив в форму компонент TImageList и поместив в него несколько изображений.


Рис. 7 Компонент TImageLis с изображениями, помещаемыми в TDBGrid

Модифицируем код нашего приложения:

Соответствующий код для Delphi имеет вид:

Теперь в TDBGrid в колонке VenueNo находятся графические изображения.

Читайте также:  Названия цветов длинные зеленые

Источник

Как изменить цвет строк dbgrid delphi

Подскажите, как изменить цвет строки в DBGrid например в зависимости от значения какой либо колонки?
В методе OnDrawColumnCell есть только номер кононки DataCol, а вот номера строки которая в данный момент отрисовывается — нету.


DenK_vrtz © ( 2004-05-27 10:30 ) [1]


lightix ( 2004-05-27 10:41 ) [2]

тот пример который там имеется итак понятен, всмысле сама идея раскраски:
[code]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if <какое-то условие>then begin
with DBGrid1.Canvas do
begin
Brush.Color:=clGreen;
Font.Color:=clWhite;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
end;
end;
end;
[/code]
Но вопрос немного в другом : как определить КАКУЮ СТРОКУ В ДАННЫЙ МОМЕНТ КРАСИМ ? То есть что написать здесь:
[code]
if <какое-то условие>then begin
[/code]


Vlad © ( 2004-05-27 10:43 ) [3]


> Но вопрос немного в другом : как определить КАКУЮ СТРОКУ
> В ДАННЫЙ МОМЕНТ КРАСИМ ? То есть что написать здесь:

а ты что, произвольные строки красишь произвольным цветом ?
У записи должен же быть какой-то критерий, по которому ты раскрашиваешь строку в тот или иной цвет ? Вот и проверяй его.


Yarik © ( 2004-05-27 10:48 ) [4]

with Grid1.Canvas do begin
if Column.FieldName = «Kom1» and
spMatches.FieldByName(«Kom1»).asString = «xxx»
then
begin .

так я покрашу только одну ячейку, а нужно всю строку


lightix ( 2004-05-27 10:54 ) [6]

ПРИМЕР.
Я знаю что если в ПОЛЕ1 записан 0 то ВСЯ СТРОКА остается неподкрашеная, если 1 то подкрашенная.

КАК ПРОВЕРИТЬ КАКОЕ ЗНАЧЕНИЕ В 1 СТОЛБЦЕ ОКРАШИВАЕМОЙ В ДАННЫЙ МОМЕНТ СТРОКИ?


Vlad © ( 2004-05-27 10:54 ) [7]


> lightix (27.05.04 10:51) [5]

with TDBGrid(Sender) do
if DataSource.DataSet.FieldByName(«NAME»).AsString=»ВАСЯ» then
Canvas.Brush.Color:=clRed;

Все записи где поле NAME = ВАСЯ будут покрашены в красный цвет.


Sergey13 © ( 2004-05-27 10:57 ) [8]

if (Sender as TDBGrid).DataSource.DataSet.FieldByName(«my_field»).AsInteger=0 then
Background:=clRed else Background:=clWhite;


lightix ( 2004-05-27 11:01 ) [9]

Vlad © , Угу, и красится только текущая ячейка .

Читайте также:  Тематическая свадьба с красным цветом

Народ ну вы сами пробовали то что пишете.
[code]
(Sender as TDBGrid).DataSource.DataSet.FieldByName(«my_field»).AsInteger
[/code]
это содержимое ТЕКУЩЕЙ СТРОКИ, которая в текущий момент является активной в НАБОРЕ ДАННЫХ, а при перерисовке DrawColumnCell она не изменяется.


KADAN © ( 2004-05-27 11:05 ) [11]

2 ligthix
этот код РАБОТАЕТ, не пудри мозги
with TDBGrid(Sender) do
if (DataSource.DataSet.FieldByName(«id»).AsInteger mod 2)=0 then begin
Canvas.Brush.Color:=clRed;
Canvas.FillRect(Rect);
end;


lightix ( 2004-05-27 11:10 ) [12]

2 KADAN Спасибо, действительно работает 🙂


Vlad © ( 2004-05-27 11:11 ) [13]


> lightix (27.05.04 11:01) [9]
> Vlad © , Угу, и красится только текущая ячейка .

см также
> KADAN © (27.05.04 11:05) [11]

особенно вот это:

> не пудри мозги


Sergey13 © ( 2004-05-27 11:13 ) [14]

2lightix (27.05.04 11:05) [10]
>Народ ну вы сами пробовали то что пишете.
А ты пробовал? Ты думаешь я это по памяти набивал? Делать мне больше нечего! Скопировал и рабочей проги.

2 Vlad попробуй напиши свой код — и увидишь что в этом случае подкрашивается только текущая ячейка на которой стоишь.


lightix ( 2004-05-27 11:19 ) [16]

Народ, всем спасибо, понял свою ошибку, все работает 🙂


Vlad © ( 2004-05-27 11:21 ) [17]

Мой код красит всю строку целиком.
Хоть писал и не проверяя, но теперь порверил и (в который раз :-)) убедился что это так


lightix ( 2004-05-27 11:24 ) [18]

Vlad ©>
> Мой код красит всю строку целиком.
> Хоть писал и не проверяя, но теперь порверил и (в который
> раз :-)) убедился что это так
Странно у меня же получилось с этим кодом только подкрашивание ободка выделеенной ячейки.


Vlad © ( 2004-05-27 11:32 ) [19]


> lightix (27.05.04 11:24) [18]

Ну так ты говоришь статью читал ?
А если читал — там написано что свойство DefaultDrawing ставим в false, вместо этого дефолтную прорисовку делаем в коде после раскраски.
DefaultDrawColumnCell(Rect, DataCol, Column, State);


lightix ( 2004-05-27 11:34 ) [20]

Я твою проверку применил для другой версии, с включенным DefaultDrawing

Источник

Adblock
detector