Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как закрасить определенные ячейки StringGrid 
V
    Опции темы
BuShaRt
Дата 11.5.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: нет
Всего: 6



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

Функция_Закрашивания_Ячейки (координата_строки, координата_колонки, цвет);
PM MAIL   Вверх
bems
Дата 12.5.2010, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Используй ondrawcell.
В чем невероятность способа?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
~FoX~
Дата 12.5.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



Выносить это за рамки 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;




Это сообщение отредактировал(а) ~FoX~ - 12.5.2010, 08:58


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
BuShaRt
Дата 12.5.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: нет
Всего: 6



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

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

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


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

Это сообщение отредактировал(а) BuShaRt - 12.5.2010, 14:02
PM MAIL   Вверх
BuShaRt
Дата 12.5.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: нет
Всего: 6



Вот, что у меня получилось сделать самому, но есть проблема - 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, 15:05
PM MAIL   Вверх
BuShaRt
Дата 12.5.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: нет
Всего: 6



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

PM MAIL   Вверх
~FoX~
Дата 12.5.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



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

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


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
bems
Дата 13.5.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
BuShaRt
Дата 13.5.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: нет
Всего: 6



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

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

Добавлено через 2 минуты и 24 секунды
А по поводу динамичности, я решил, что в таком случае надо просто завести глобальный массив и вписывать туда координаты необходимых точек, в итоге на базе этого массива циклом по ondrawcell красить ячейки.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.