Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Закраска своим цветом активной строки StringGrid


Автор: Нитонисе 31.8.2013, 15:55
Компонент StringGrid. Записи в строках логически связаны, но по некоторым причинам опцию RowSelect не использую. Однако при выборе какой-либо ячейки - все прочие ячейки этой строки должны закрашиваться своим цветом. Я это реализовал в событии OnDrawCell. При навигации мышкой все работает как надо - своим цветом выделяется вся строка, которой принадлежит выбранная ячейка. Но вот когда осуществляю навигацию стрелками с клавиатуры - ячейки закрашиваются некорректно. Пробую обрабатывать событие OnKeyDown. Ставлю там лишь одну команду - StringGrid1->Refresh() . Очевидно при этом происходит отрисовка всех ячеек по новой с использованием обработчика OnDrawCell. Но проблема в том, что перерисовка грида происходит ПЕРЕД тем, как я нажимаю например стрелку вниз. То есть допустим активная ячейка такая: ряд - 3, колонка - 2. Нажимаю стрелку вниз. Вот как теперь выглядит грид - все ячейки ряда номер 3 закрашены цветом выделения, кроме ячейки в колонке номер 2 (становится белой), также цветом выделения закрашена ячейка в ряду номер 4 в колонке номер 2. Нажимаю еще раз стрелку вниз - все ячейки ряда номер 4 закрашены цветом выделения, кроме ячейки в колонке номер 2 (становится белой), также цветом выделения закрашена ячейка в ряду номер 5 в колонке номер 2. То есть как бы выделение отстает на один ряд. Если StringGrid1->Refresh() записать в обработчик события OnKeyUp, то нужная строка таки закрашивается, но происходит это не сразу. То есть я нажал клавишу со стрелкой - активная ячейка сместилась на ряд (с соответствующей закраской), а вот весь остальной ряд перекрашивается только после того, как я отпустил нажатую клавишу со стрелкой. Это не очень удобно. Так как бы решить эту небольшую проблемку с корректной перекраской выделенного ряда?

Автор: Riviero 3.9.2013, 09:46
Может, я конечно чего-то и не понял..
Код

int sRow;
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
   if (ARow == sRow)
   {
        StringGrid1->Canvas->Brush->Color=    clLime;
        StringGrid1->Canvas->FillRect(Rect);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
    sRow = ARow;
    StringGrid1->Repaint();
}
//---------------------------------------------------------------------------

Автор: Нитонисе 11.10.2013, 21:18
Riviero, ваш код работает не так как нужно. Сначала происходит отрисовка ячеек, а потом применяется новое значение sRow. То есть скажем, если выбрана 5-я строка, затем кликаю мышкой на 10-ую, то закрашивается выделенным цветом 5-ая. Затем кликаю на 15-ую - закрашивается 10-ая. То есть всегда как бы опаздывает закраска на один ход. При этом в том ряду, на который я кликнул - самая первая ячейка и та, на которую я непосредственно кликнул - закрашиваются выделенным цветом. 

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