Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

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

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

Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Andreich » 05.05.2011 11:55:10

При переносе проекта на более новую версию Lazarus ( из 28-го в 30-й) столкнулся с одной крайне неприятной проблемой... Есть StringGrid, строки которого прокрашиваются в разные цвета для большего удобства чтения. Код следующий:

Код: Выделить всё
  procedure TForm1.UsersGridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
    if (aRow > 0) and (aRow mod 2 = 0) then
  begin
    UsersGrid.Canvas.Brush.Color:=RGBToColor(240, 240, 240);
    UsersGrid.Canvas.FillRect(aRect);
    UsersGrid.Canvas.Font.color:=clBlack;
  end
  else
  begin
    UsersGrid.Canvas.Brush.Color:=RGBToColor(225, 225, 225);
    UsersGrid.Canvas.FillRect(aRect);
    UsersGrid.Canvas.Font.color:=clBlack;
  end;
end;


В 0.9.28 все отлично, а вот в 0.9.30 текст находящийся в ячейках таблицы затирается и его невидно. Кто знает что такого поправили в последних версиях и почему на старых все отрабатывало корректно? Пробовал на сборке 0.9.31-30218-fpc-2.4.2-20110406, но там такая же проблема.

Если кто сможет проверить на последних сборках - буду крайне признателен (просто у самого сейчас нет возможности скачать).
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Nik » 05.05.2011 12:53:48

Вот мой код (писал в Lazarus 0.9.29, без проблем пересобирал в 0.9.30 и последнем SVN):

Код: Выделить всё
procedure TMainForm.MeasureGridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
var
xStyle: TTextStyle;
padding: integer;
begin

with (Sender as TStringGrid) do
  begin

  if (ARow mod 2)=0
   then Canvas.Brush.Color:=HexToInt('eceeff')
   else Canvas.Brush.Color:=HexToInt('fbfbfb');

  if (gdSelected in aState) then
   begin
    Canvas.Brush.Color:=HexToInt('d6f3d5');
    Canvas.Font.Color:=HexToInt('000000');
   end;

   Canvas.FillRect(aRect);
   xStyle:=Canvas.TextStyle;

   if (ACol=3) or (ACol=2)
    then xStyle.Alignment:=taCenter
    else xStyle.Alignment:=taLeftJustify;

   Canvas.TextRect(aRect, 0, 0, Cells[ACol, ARow], xStyle);
end;

end;


Можете проверить, или просто добавить в ваш код вызов TextRect.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Andreich » 05.05.2011 13:52:16

Nik писал(а):Можете проверить, или просто добавить в ваш код вызов TextRect.

Действительно, с TextRect все отлично работает. :) Спасибо!

Тогда еще спрошу, чтобы не создавать отдельной темы. Как при подобном методе раскраски и GoRowSelect=true,
осуществлять заливку выбранной строки, а не отображать выделение в виде сеточки?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Nik » 05.05.2011 21:46:57

При GoRowSelect=true такой код как раз и должен раскрашивать всю строку. Отдельная ячейка раскрашивается только если в условие вписать проверку ACol.

Или что вы имеете в виду под "сеточкой"? Может у вас goHorzLine / goVertLite = true?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Andreich » 06.05.2011 09:16:22

Nik писал(а):Или что вы имеете в виду под "сеточкой"? Может у вас goHorzLine / goVertLite = true?

Имелось в виду наличие/отсутствие синего (или какого-либо другого) цвета заливки выбранной строки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Andreich 06.05.2011 09:26:34, всего редактировалось 1 раз.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Nik » 06.05.2011 09:21:17

Теперь понятно :) Вас спасёт добавление вот такого примерно кода сразу после основной раскраски:

Код: Выделить всё
  if (gdSelected in aState) then
   begin
    Canvas.Brush.Color:=HexToInt('d6f3d5');
    Canvas.Font.Color:=HexToInt('000000');
   end;
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение Andreich » 06.05.2011 09:29:01

Да, именно то, что нужно! Еще раз спасибо. Тему можно считать закрытой.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Раскраска строк в StringGrid (Lazarus 0.9.28-> 0.9.30)

Сообщение mirk » 06.03.2014 14:03:38

Установил DefaultDrawing=False
В обработчике OnDrawCell раскрашиваю ячейки и пишу текст, но столкнулся с такими проблемами:
1. текст отображается только в первой колонке
2. TextRect не позволяет делать отступ по вертикали, хотя параметр Y присутствует

В чем может быть проблема?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru