Разноцветный DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Валентина
новенький
Сообщения: 16
Зарегистрирован: 02.09.2013 13:05:37

Разноцветный DBGrid

Сообщение Валентина »

В дельфи работает вот такая раскраска DBGrid

Код: Выделить всё

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if ... then
 begin
         TDBGrid(Sender).Canvas.Brush.Color:=clYellow;
         TDBGrid(Sender).Canvas.Font.Color:=clBlack;
 end
 else
 begin
         TDBGrid(Sender).Canvas.Brush.Color:=clBlue; 
         TDBGrid(Sender).Canvas.Font.Color:=clYellow;
 end
 TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;

В Лазарусе цвет шрифта меняется, а цвет фона - нет. Подскажите, в чем дело может быть и как решить проблему.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Последовательность вызовов:
procedure Paint -> procedure DrawAllRow -> proecdure DrawRow -> procedure DrawCell.
procedure DrawCell в TDBGrid:
PrepareCanvas - погтоавливает инструменты рисования Canvas: Brash, Font и т.д.
if DefaultDrawing then DefalutDrawCell - Заливает фон и выводит текст
if Assigned(OnDrawColumnCell) then OnDrawColumnCell - Пользовательская функция рисования
DrawCellGrid - рисует сетку

Как видите, здесь сначала идет стандартная функция заливки и вывода текста (если Default Drawing), потом уже вызывается пользовательская.

Поставьте DefaultDrawing := False, должно работать как вам нужно.
Последний раз редактировалось *Rik* 29.10.2013 15:37:31, всего редактировалось 1 раз.
Валентина
новенький
Сообщения: 16
Зарегистрирован: 02.09.2013 13:05:37

Сообщение Валентина »

Эвон как... Спасибо.

Добавлено спустя 11 минут 4 секунды:
Хм, теперь фон стал во всех ячейках серый...
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Валентина писал(а):Эвон как... Спасибо.

Добавлено спустя 11 минут 4 секунды:
Хм, теперь фон стал во всех ячейках серый...


В стандартной процедуре рисования идет вызов DefaultDrawCell, вы вызываете DefaultDrawColumnCell.
DefaultDrawCell объявлена в защищенном разделе класса и вам будет не доступна, а ваша DefaultDrawColumnCell не производит заливку ячеек цветом.

Попробуйте залит фон самостоятельно:
TDBGrid(Sender).Canvas.FillRect(Rect);

Код: Выделить всё

if ... then
begin
         TDBGrid(Sender).Canvas.Brush.Color:=clYellow;
         TDBGrid(Sender).Canvas.Font.Color:=clBlack;
end
else
begin
         TDBGrid(Sender).Canvas.Brush.Color:=clBlue; 
         TDBGrid(Sender).Canvas.Font.Color:=clYellow;
end;
TDBGrid(Sender).Canvas.FillRect(Rect);
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
Валентина
новенький
Сообщения: 16
Зарегистрирован: 02.09.2013 13:05:37

Сообщение Валентина »

Ура! Ура! Раскрасилось! Спасибочки огромное!!! Вы гений!
Ответить