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


Автор: Ptica 24.3.2005, 14:30
Проблема следующая: нужно отображать разные строки в таблице разным цветом в зависимости от условия. Прочел тучу примеров того, как это делается, сделал... работает! Похвастался коллеге. Он у себя давай то же самое делать... не работает! Во блин... Фрагменты кода практически идентичные, но у меня работает, а у него - нет. Бились мы с ним, бились... вот и у меня перестало работать. smile smile . Что же выяснилось: я в своих экспериментах просто кинул на форму DBGrid, подсоединил к DataSource, и успокоился. А у коллеги в программе колонки грида были добавлены через Column Editor. И как только я сделал то же самое... вся моя радуга с экрана пропала.
Вот код (Delphi 6)
Код

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  If Table1.FieldByName('age').AsInteger > 30 then
     DBGrid1.Canvas.Font.Color := clNavy
  Else
     DBGrid1.Canvas.Font.Color := clRed;
     
  DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;

Есть ли методы получше?

Автор: bursa 24.3.2005, 14:47
Цитата(Ptica @ 24.3.2005, 14:30)
А у коллеги в программе колонки грида были добавлены через Column Editor

Если просто, оставляя всё как есть - прибить колонки в DBGrid, а добавить их из FieldEditor самого TTable или TQuery. Эффект тот же (название, длина, маска,видимость), а глюков меньше. Ну а главное, твой код выше будет работать

Автор: Ptica 24.3.2005, 15:22
bursa
Спасибо, попробую. Пока что я обнаружил, что если вместо
Цитата
DrawDataCell
использовать
Цитата
DrawColumnCell
то все будет нормально. И правильно; написано же в хэлпе, что DrawDataCell оставлен только для обратной совместимости.

Автор: Cetus 24.3.2005, 16:28
смотри DRKB23 там все прекрасно расписано smile

Автор: Bes 5.4.2005, 07:33
Кстати, а можно ячейки закрашивать, а не цвет шрифта менять?

Автор: DimW 5.4.2005, 07:59
Цитата
Кстати, а можно ячейки закрашивать, а не цвет шрифта менять?


DBGrid1DrawDataCell:
Код

if gdFocused in State then
with (Sender as TDBGrid).Canvas do
   begin
     Font.Color := $D56A00;
     FillRect(Rect);
     TextOut(Rect.Left,Rect.top, Field.AsString);
   end;

Автор: Bes 5.4.2005, 09:36
2DimW: У меня ничего не произошло...?
А, нет, все заработало, только все равно не то.
Надо сделать "шахматную доску" из DBGrid-а.

Автор: DimW 5.4.2005, 12:00
Во класс, ну тебя прет...
А поподробнее можно!!!! smile
Может тему новую откроешь?

Автор: Bes 5.4.2005, 13:19
smile Не, ну т.е. есл каждую клеточку в особый цвет можно покрасить, значит любую задачу связаную с расцветкой ДБГрида решить можно.

Автор: DimW 5.4.2005, 13:59
Цитата
Надо сделать "шахматную доску" из DBGrid-а.


Все понял это ты образно сказал... а я и думаю почему DBGrig...

Автор: Bes 5.4.2005, 15:25
Ага, ну дак че, есть идеи. додумался только до того, чтобы программно модифицировать Рект в таком коде,

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
     REC:TRect;
begin
     If ADOQuery1.FieldByName('sm').AsInteger = 12 then
     begin
          DBGrid1.Canvas.Font.Color := clNavy;
          DBGrid1.Canvas.Brush.Color:=clYellow;
          Rec:=Rect;
          Rec.Left:=DBGrid1.Columns[0].Width+13;
          Rec.Right:=Rec.Left+DBGrid1.Columns[1].Width;

     //REC.Right:=2;
     DBGrid1.DefaultDrawColumnCell(Rec,DataCol,Column,State);// (Rect, DataCol, State); }
     end Else
     begin
          DBGrid1.Canvas.Font.Color := clRed;
          //DBGrid1.Columns[1].Color:=clBlack;
          DBGrid1.Canvas.Brush.Color:=clBlack;
          DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);// (Rect, DataCol, State); }
     end;
     {Rec:=Rect;
     Rec.Left:=1;
     REC.Right:=2;
     DBGrid1.DefaultDrawColumnCell(Rec,DataCol,Column,State);// (Rect, DataCol, State); }


end;


но может есть что-то человеческое?

Автор: DimW 6.4.2005, 08:28
Bes вот тебе шахматная доска из DBGrid:

Код

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
if Table1.RecNo mod 2<>0 then
  begin
  if  (Field.FieldNo mod 2=0) then DBGrid1.Canvas.Brush.Color := clblack;
  if  (Field.FieldNo mod 2<>0)then DBGrid1.Canvas.Brush.Color := clYellow;
  end;

if Table1.RecNo mod 2=0 then
  begin
  if  (Field.FieldNo mod 2=0) then DBGrid1.Canvas.Brush.Color :=clYellow;
  if  (Field.FieldNo mod 2<>0)then DBGrid1.Canvas.Brush.Color :=clblack;
  end;
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;


Все оказалось довольно просто, ведь правда? smile

Автор: Cetus 7.4.2005, 07:49
в догонку ...
я бы к DataSet через DBGrid.DataSource.DataSet обращался

procedure ...
var DS : TDataSet;
begin
DS := DBGrid.DataSource.DataSet;
if DS.RecNo = ...
...
end;

и тогда эту процедуру на несколько DBGrid можно будет завести

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