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


Автор: BuShaRt 11.5.2010, 20:55
Есть задача закрасить или хотя бы просто выделить жирным шрифтом определенные ячейки StringGrid.
В сети я нашел множество невероятных способов на основе работы с событием ondrawcell, но не смог найти информации, как это можно организовать просто функцией, чтоб в итоге от меня требовалось только написать.

Функция_Закрашивания_Ячейки (координата_строки, координата_колонки, цвет);

Автор: bems 12.5.2010, 03:49
Используй ondrawcell.
В чем невероятность способа?

Автор: ~FoX~ 12.5.2010, 08:51
Выносить это за рамки DrawCell нету ни какого смысла

Код




procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = 1) and (ARow = 1) then begin
    StringGrid1.Canvas.Brush.Color := clRed;
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;


Но если очень хочится:
Код

//................
 private
       procedure DrawColorCell(CACol,  //Текущий столбец
                CARow,              //Текущая строка
                ACol,               //Какой столбец метить
                ARow: integer;      //Какую строку метить
                Rect: TRect;        //Область
                CellColor: TColor); //Цвет
//................
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 DrawColorCell(ACol, ARow, 2, 3, Rect, $6612AA);
end;

procedure TForm2.DrawColorCell(CACol, CARow, ACol, ARow: integer; Rect: TRect; CellColor: TColor);
begin
  StringGrid1.Canvas.Brush.Color := CellColor;
  if (CACol = ACol) and (CARow = ARow) then begin
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;



Автор: BuShaRt 12.5.2010, 11:19
Сразу уточню, что я могу ошибаться в своих суждениях, поэтому если мои аргументы будут не верными, убедительная просьба исправить меня.

Цитата(bems @  12.5.2010,  03:49 Найти цитируемый пост)
Используй ondrawcell.
В чем невероятность способа? 

Я считаю, что все задачи должны выполняться четко, без лишних телодвижений. Конечно, есть вариант, что я плохо понимаю как работает ondrawcell, но меня терзают сомнения, что лишнего она делает порядочно много.


~FoX~
Оба варианта решены возможности гибкого динамического закрашивания n-ого кол-ва ячеек, в то время как обычную процедуру можно будет запустить из любого участка кода в цикле или с условиями.

Автор: BuShaRt 12.5.2010, 15:04
Вот, что у меня получилось сделать самому, но есть проблема - canvas ложиться только поверх краев (0,n) и (n,0) иначе он заходит под белые ячейки и его не видно. Как это можно исправить?

Код

procedure TForm1.DrowStringGrid1(xcor,ycor:Integer);
var
ColWidth,RowHeight,ColMod,RowMod:Integer;
Rects: TRect;
begin
ColWidth := StringGrid1.DefaultColWidth;
RowHeight := stringGrid1.DefaultRowHeight;
ColMod := ColWidth*xcor+1*xcor;
RowMod := RowHeight*ycor+1*ycor;
Rects := Rect(0+ColMod, 0+RowMod, ColWidth+ColMod, RowHeight+RowMod);
StringGrid1.Canvas.Brush.Color := $6612AA;
StringGrid1.Canvas.FillRect(Rects);
end;

Автор: BuShaRt 12.5.2010, 16:28
Хм, что интересно - моя функция срабатывает коряво если ее запускать при событие DblClick, но если ее использовать через ondrawcell, то результат именно такой, какой нужен. Может кто-нибудь объяснить почему так.

Автор: ~FoX~ 12.5.2010, 18:24
Цитата(BuShaRt @  12.5.2010,  12:19 Найти цитируемый пост)
, в то время как обычную процедуру можно будет запустить из любого участка кода в цикле или с условиями.

Не выйдет фокус... Попробуй что нить закрась, а потом сверни и разверни обратно окно...

Автор: bems 13.5.2010, 00:50
Цитата(BuShaRt @  12.5.2010,  16:28 Найти цитируемый пост)
Хм, что интересно - моя функция срабатывает коряво если ее запускать при событие DblClick, но если ее использовать через ondrawcell, то результат именно такой, какой нужен. Может кто-нибудь объяснить почему так.

Потому что событие возникает, когда ячейка нуждается в перерисовке. А рисование по даблклику одноразовое - раз нарисовал, при соледующей же порче картинки (перекрытие другим окном, изменение размеров и тд) эта информация теряется. 
Твоя проблема в том, что ты не понимаешь, что грид не хранит картинку (окей, с DoubleBuffered картинка хранится, но буфер тебе недоступен). Нельзя просто "закрасить ячейку". Можно нарисовать её закрашенной, когда грид сообщает, что ему нужна нормальная нарисованная ячейка.

Автор: BuShaRt 13.5.2010, 21:57
Цитата(bems @  13.5.2010,  00:50 Найти цитируемый пост)
Твоя проблема в том, что ты не понимаешь

Я все понял. Просто почему-то авторы популярных статей на эту тему, решили, что программистам не обязательно знать, почему именно ondrawcell. От сюда и пошло мое невежество.

Добавлено через 2 минуты и 24 секунды
А по поводу динамичности, я решил, что в таком случае надо просто завести глобальный массив и вписывать туда координаты необходимых точек, в итоге на базе этого массива циклом по ondrawcell красить ячейки.

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