C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: StringGrid  (Прочитано 4397 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« : 30 Апрель 2013, 14:49:04 »

Здравствуйте. Вопрос появился по данномо компоненту а точнее по событию StringGrid1DrawCell     при этом событии идет перерисовка всех ячеек сразу а мне необходимо изменить цвет только одной. Как быть чтоб не тратить на это системные ресурсы.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #1 : 30 Апрель 2013, 17:10:20 »

Цитировать
при этом событии идет перерисовка всех ячеек сразу
Давай не будем путать причину и следствие. StringGrid1DrawCell перерисовывает всегда только одну ячейку. Перерисовка всего подряд идет потому, что ты вызываешь Invalidate для всего грида, чтобы заставить его перерисоваться. Однако, у TCustomGrid-а есть защищенный метод InvalidateCell, который позволяет тебе объявить невалидным (и, следовательно - заставить перерисовываться) только одну ячейку. Тогда и StringGrid1DrawCell будет вызываться только для одной ячейки.

И я об этом уже говорил: https://cbuilder.ru/index.php/topic,8974.0.html
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #2 : 26 Май 2013, 11:22:25 »

А можно маленький примерчик  а то честно говоря идею понял а как конкретно сделать нет.
Записан
LEXONNN
Участник


Сказали спасибо: +0/-1
Offline

Сообщений: 70


« Ответ #3 : 26 Май 2013, 21:02:15 »

Код
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
     int ARow, TRect &Rect, TGridDrawState State)
{
 
StringGrid1->Canvas->Brush->Color = clBlue; //цвет
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->Font->Color = clWhite;
StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
 
 
}
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #4 : 27 Май 2013, 08:31:49 »

Спасибо но вот только где же здесь InvalidateCell?
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #5 : 27 Май 2013, 08:33:21 »

Вопрос же заключался в том чтобы только одну ячейку перерисовать а не всю сетку.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #6 : 28 Май 2013, 15:16:10 »

Сказали же выше: у TCustomGrid есть всякие InvalidateCell, InvalidateRow, InvalidateCol. Но эти методы защищенные. Нужно, стало быть, пронаследоваться от TCustomGrid и перенести нужные методы в public, а затем приводить указатель к этому типу. Например:
Код
class TMyGrid : public TCustomGrid
{
public:
  using TCustomGrid::InvalidateCell;
  using TCustomGrid::InvalidateRow;
  using TCustomGrid::InvalidateCol;
};
 
// для нашего грида приводим тип к TMyGrid и вызываем метод:
reinterpret_cast<TMyGrid*>(Grid1)->InvalidateCell();
 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #7 : 28 Май 2013, 16:51:13 »

Честно говоря в жизни бы не догадался так сделать. Чувствую себя полным днищем)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.064 секунд. Запросов: 22.