Как изменить цвет строк 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 например в зависимости от значения какой либо колонки?
В методе 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