Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Разноцветный DBGrid


Автор: MacTep 2.7.2005, 23:08
Привет всем! Хочу сделать так, чтобы цвет строчек в DBGrid был разным. Т.е., допустим, первая строчка светло серая, вторая темно серая, и так далее. Вот код:

Код

...

type TMyDBGridEh = class(TDBGridEh)
  property DataLink;
  property UpdateLock;
end;

...

procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
var index: Integer;
    Marked, Selected: Boolean;

begin
  Marked:=False;
  if (dgMultiSelect in DBGridEh1.Options)and
  (TMyDBGridEh(DBGridEh1).Datalink.Active) then

Marked:=DBGridEh1.SelectedRows.Find(TMyDBGridEh(DBGridEh1).Datalink.Datasource.Dataset.Bookmark, index);
  Selected:=(TMyDBGridEh(DBGridEh1).Datalink.Active) and (DBGridEh1.Row-1 =TMyDBGridEh(DBGridEh1).Datalink.ActiveRecord);

  // цвет строки в зависимости от ее номера
  if Main.RecNo mod 2=0 then
    DBGridEh1.Canvas.Brush.Color:=RGB(224,234,243)
  else
    DBGridEh1.Canvas.Brush.Color:=RGB(237,242,249);
  // цвет букв
  DBGridEh1.Canvas.Font.Color:=RGB(14,69,121);
  // если выделена строка
  if Selected then
    DBGridEh1.Canvas.Brush.Color:=RGB(169,184,201);
  // перерисовка DBGridEh1
  DBGridEh1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Все отлично работает! Но когда мне надо сделать выборку в данной базе, то происходит следующее: номера записей различны и какие-то записи подсвечиваются в таблице светло-серым, а какие-то темно-серым цветом, т.е. не по порядку, а вразнобой. Может идти 3 светло-серых строки, а потом 5 темно-серых. А мне надо, чтобы и во всех режимах работы DBGrid чередовался цвет строк. Как этого добиться? Пытался меня строку:

Код

if Main.RecNo mod 2=0 then

на
Код

if DBGridEh1.Row mod 2=0 then

но это мне не подходит. Работает в таком случает программа как-то странно... Посоветуйте, пожалуйста, что-нибудь!

Автор: ~FoX~ 4.7.2005, 09:17
MacTep
Придется перерисовывать каждый раз при выборке.

Автор: MacTep 4.7.2005, 12:16
~FoX~, каким же образом перерисовывать? Я же смотрю по номеру записи, а номер записи всегда фиксирован!

Автор: offline 4.7.2005, 12:30
Если хочешь сделать "зебру" из DBGrid, то перейди на EHLib (GridEh), там и пример есть, как "зебра" делается

Автор: ~FoX~ 4.7.2005, 12:41
kirilllius Так он и юзает ehLib
Цитата(MacTep @ 3.7.2005, 00:08)
DBGridEh1


MacTep
Ты каким макаром выборку делаешь?
Если хочешь зебру надо смотреть не на номер записи в БД, а на номер записи в рекордсете.

Автор: offline 4.7.2005, 12:52
Ну так пусть смотрит первый пример, а именно вкладка DBLIST, чеквокс Dichromatic

Автор: MacTep 4.7.2005, 13:14
Цитата(kirilllius @ 4.7.2005, 12:52)
Ну так пусть смотрит первый пример, а именно вкладка DBLIST, чеквокс Dichromatic
Там написано, мол, DBGridEh1.Invalidate; А вот откуда это взялось - не монимаю! smile

Автор: offline 4.7.2005, 15:23
Вот код на событие onGetCellParams у грида

Взято из примера

Код

procedure TForm1.dbgListGetCellParams(Sender: TObject; Column: TColumnEh;
  AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
  if cbDichromatic.Checked then
    if dbgList.SumList.RecNo mod 2 = 1 then
      Background := $00FFC4C4
    else
      Background := $00FFDDDD;
end;

Автор: korotkov 26.4.2007, 00:29
>Вот код на событие onGetCellParams у грида
в этом случае чепуха при фильтрации получается

FIBPlus 6.4 + EhLib 4.1 Build 4.1.4 Russian version

при применении фильтра полосатость EhDBGrida исчезает, но при отмене фильтра также не появляется :(

как это побороть?

   Added OddRowColor and EvenRowColor property to draw odd and even
   rows with different colors. It works only if sequence numbers are available
   for DataSet(DataSet.IsSequenced = True) and DataSet.RecNo return valid info.

неужели нет решения?

хотябы полосатость вернуть при отмене фильтра и то уже дело - отличать фильтрованные данные от полных, но как!?

Автор: SergeBS 26.4.2007, 07:34
korotkov, 
DelphiKingdom - статья "Разноцветный DBGrid". В DRKB тоже есть.

Автор: korotkov 26.4.2007, 08:33
Цитата(SergeBS @ 26.4.2007,  07:34)
korotkov, 
DelphiKingdom - статья "Разноцветный DBGrid". В DRKB тоже есть.


Разноцветный D B G R I D
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168

По следам «полосатого DBGrid»
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1193

Дополнение по теме 'полосатый DBGrid'
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=170

>и что такое DRKB?
http://www.drkb.ru/
скачать не могу, сижу на GSM GPRS инете :(

интересует полосатая раскраска EhDBGrid именно при фильтрации и после, а не раскраска отдельных ячеек и их текста в зависимости от значения ячейки, это мы умеем ;)

Автор: Rodman 26.4.2007, 08:40
Код


procedure TFrmShowOrg.DBGrdDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if(DataCol=0)then
    Inc(StrNum);
  if (strnum mod 2=0)then
  begin
    DBGrd.Canvas.Font.Color := clBlack;
    DBGrd.Canvas.Brush.Color:= clCream;
  end
  else
  begin
    DBGrd.Canvas.Font.Color := clBlack;
    DBGrd.Canvas.Brush.Color:= clWhite;
  end;
  DBGrd.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


я так делал...

Автор: korotkov 26.4.2007, 10:05
если можно поясни идею if(DataCol=0)then Inc(StrNum);

что есть StrNum когда он а обнуляется?

Автор: Rodman 26.4.2007, 10:40
это для чередования строк, грид рисует каждый в каждой строке столбцы, а потом переходит на следующую строку...

просто поэкспериментируй и увидишь разницу...

Покрайней мере я другого методы не нашел... 

Автор: korotkov 26.4.2007, 12:24
... это понятно что чередования , не понятна химия if(DataCol=0)then Inc(StrNum); и где, когда обнуляется StrNum???

этим ты поборол неполосатость при фильтрации и при снятии фильтра или просто сделал полосатую таблицу? так с версии 3.6 она делается полосатой штатными средствами.

Автор: Rodman 26.4.2007, 13:15
Цитата(korotkov @  26.4.2007,  11:24 Найти цитируемый пост)
так с версии 3.6 она делается полосатой штатными средствами.

да без проблем, если мой метод совершенно не подходит не юзайте. я предложил выход, каждый в праве выбирать...
Цитата(korotkov @  26.4.2007,  11:24 Найти цитируемый пост)
не понятна химия if(DataCol=0)then Inc(StrNum);

Код

DataCol=0

срабатывает когда прорисовуется первый столбец строки, и я переключаю в это время цвет...

Автор: korotkov 26.4.2007, 19:05
StrNum обнуляю при открытии набора данных, с надеждой что не будет переполнения, т.е. такого количества строк при выборке, сортировке  или фильтрации ...

... сделал, получилось, но ...

>if(DataCol=0)
здесь не обязательно условие на 0, у меня например первые столбцы скрытые ;) и вся таблица получалась кремовой, поэтому в условии следует указывать номер видимого столбца в DBGrid.

если потаскать поверх такого грида какое-нибудь окно, то в гриде получится венигрет с цветами строк ... ;)

со скролингом данных в таблице проблема прорисовки полосатости ...

и в этом варианте не работает множественное выделение цветом строк ... т.е. я не вижу какие строки я выделяю ctrl + мышка, они просто тупо перересовываются ;)

Автор: korotkov 30.4.2007, 23:14
всеже интересует "честный" вариант полосатой таблицы при фильтрации или хотябы при отмене оной!

Автор: korotkov 4.5.2007, 00:37
Ура, победил, нашел "честный" путь:

в Options у pFIBDataSet установил poVisibleRecno = True и таблица стала полосатой и при фильтрации ;)

надо иногда и описания читать, та и голова не только чтоб в нее есть ...  ;)

Автор: Telepyz 24.12.2010, 00:08
Че вы паритесь все просто...

делаем что то вроде этого

Код

procedure TFSeans.STableDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  h: integer;                  //высота хедера дата грида
  font_h: integer;          //высота текущего шрифта дата грида
begin
  h:=//наодим высоту хедера дата грида
  font_h:=//наодим высоту текущего шрифта дата грида
  if Odd((Rect.Top-h)/font_h) then
    (Sender as TDBGrid).Canvas.Brush.Color := $B0B0FF
  else
    (Sender as TDBGrid).Canvas.Brush.Color := $FFB0B0;
  (Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Вот и все код не проверял, но что-то подобное использовал
его немного подшлифовать и все должно работать
Odd - стандартная проверка на четность

Автор: superVad 24.12.2010, 01:17
В jvcl библиотеке ДБГрид умеет делать черезстрочную раскраску.

Автор: Deniz 24.12.2010, 06:58
Telepyz, зачем поднимать топик 3-х летней давности, тем более что там решение уже было, как в части кода так и штатными средствами используемого грида (EHLib).

Добавлено через 57 секунд
PS: может модераторы закроют данную тему?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)