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


Автор: freshAngel 2.2.2009, 16:07
Привет.
Пробую сделать, чтобы при нажатии на ячейку StringGrid'a закрашивалась вся строка.
Например цвет первой строки по умолчанию белый. Щелкаю на ячейку первая строка окрасилась, например в желтый.
Щелкаю на вторую строку таблицы. Теперь она окрасилась в желтый, а остальные строки стали белыми.
Делаю так:

В событии OnDrawCell StringGrid'a:
Код

if(ARow == 0) // Как здесь передать ссылку на строку, которую выбрали!!?
  {
  Form2->StringGrid2->Canvas->Brush->Color = clYellow;
  Form2->StringGrid2->Canvas->Font->Color  = clBlack;
  Form2->StringGrid2->Canvas->FillRect(Rect);
  Form2->StringGrid2->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Form2->StringGrid2->Cells[ACol][ARow]);
  }
  else
{
 Form2->StringGrid2->Canvas->Brush->Color = clWhite;
  Form2->StringGrid2->Canvas->Font->Color  = clBlack;
  Form2->StringGrid2->Canvas->FillRect(Rect);
  Form2->StringGrid2->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Form2->StringGrid2->Cells[ACol][ARow]);
}


Интересует два вопроса:
Правильный это метод окрашивания строки, или нет!?
Как этому событию передать ссылку (номер) на строку которую я выбрал и которую нужно окрасить!?

Автор: taiven 2.2.2009, 17:32
Код


void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
    StringGrid1->Invalidate();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
    if(ARow == StringGrid1->Row)
    {
        if(ACol > 0)
        {
            StringGrid1->Canvas->Brush->Color = clYellow;
            StringGrid1->Canvas->FillRect(Rect);
            StringGrid1->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
                                          StringGrid1->Cells[ACol][ARow]);
        }
    }
}

Автор: freshAngel 2.2.2009, 20:50
taiven, большущее человеческое спасибо!

Автор: freshAngel 3.2.2009, 21:06
Все гуд!
Только вот при таком методе подсветки строки, текст в ячейках нулевого столбца все время затирается.

Код

void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
    StringGrid1->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
    if(ARow == StringGrid1->Row)
    {

            StringGrid1->Canvas->Brush->Color = clYellow;
            StringGrid1->Canvas->FillRect(Rect);
            StringGrid1->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
                                          StringGrid1->Cells[ACol][ARow]);
        }
    }



Просто желтая ячейка.
Это наверное связано с тем, что метод перерисовки Invalidate() для StringGrid'а вызывается в свойстве onSelectCell, поэтому когда "побегаешь" по остальным ячейкам таблицы, тест в ячейках нулевого столбца тоже видно.
Или просто C++ Builder пытается выделить синим ячейку!?
Как можно это исправить!? Что - бы строка подсвечивалась как нужно и был виден текст в ячейках.

Автор: taiven 3.2.2009, 21:57
прикрепи лучше скрин, а то так не совсем понятно, что ты имеешь в виду.

Автор: freshAngel 3.2.2009, 22:15
Цитата(taiven @ 3.2.2009,  21:57)
прикрепи лучше скрин, а то так не совсем понятно, что ты имеешь ввиду.

Конечно.
Это начальное состояние грида, при запуске программы.

http://ipicture.ru/Gallery/Viewfull/12733596.html

А вот, если побегать по ячейкам таблицы.

http://ipicture.ru/Gallery/Viewfull/12733680.html

Такая "затирка" текста  происходят на выделенной в данный момент ячейки, если "побегать" по остальным ячейкам грида, все отрисовывается нормально.

Автор: taiven 4.2.2009, 01:29
Код

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
    if(ARow == StringGrid1->Row)
    {

            if(ACol == StringGrid1->Col)
            {
                StringGrid1->Canvas->Font->Color = clWhite;
                StringGrid1->Canvas->Brush->Color = clNavy;
            }
            else
            {
                StringGrid1->Canvas->Font->Color = clBlack;
                StringGrid1->Canvas->Brush->Color = clYellow;
            }

            StringGrid1->Canvas->FillRect(Rect);
            StringGrid1->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
                                          StringGrid1->Cells[ACol][ARow]);
    }
}

Автор: freshAngel 7.2.2009, 21:57
Спасибо.
Теперь все работает!

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