Вот так: Код (Text): void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (ARow==1) { StringGrid1->Canvas->Brush->Color = clRed; StringGrid1->Canvas->FillRect(Rect); } }
В коде Сумасброда сделай так: Код (Text): void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (ARow == selectRow ) { StringGrid1->Canvas->Brush->Color = clRed; StringGrid1->Canvas->FillRect(Rect); } } а selectRow задавай уже при щелчке по ячейке таблицы.
Xerx StringGrid1DrawCell событие настает когда я запусаю программу и рисуется сама таблица. Но мне надо чтобы при клике на какой либо ячейке подсвечивалась вся строка, подсвечиваю ячейку следующим образом: Код (Text): void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (State.Contains(gdFocused)) { StringGrid2->Canvas->Brush->Color = clActiveCaption; StringGrid2->Canvas->FillRect(Rect); StringGrid2->Canvas->TextOut(Rect.Left+1,Rect.Top+1,StringGrid2->Cells[ACol][ARow]); } }
Keva StringGrid1DrawCell вызывается при каждой перерисовке ячейки. если нужно отрисовывать всю строку, то сделай так: Код (Text): StringGrid2->Canvas->Rectangle( 0, Rect.Top, StringGrid2->Canvas->ClipRect.Right-1, Rect.Bottom - Rect.Top+1 ); StringGrid2->Canvas->TextOut(Rect.Left+1, Rect.Top+1, StringGrid2->Cells[ACol][ARow]); К сожалению нет под рукой ни BCB, ни Delphi, а работал с VCL давно. Но вроде правильно написал. Да и во всяком случае суть ясна. Если не получится - пиши, посмотрю дома.
Вот полностью рабочий код, только ячейка которую выделяешь остается нераскрашеной. И когда снова выделяешь ту же строку получается с 3-го клика что не есть гуд. Дальше думать не охота. Код (Text): void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { TRect Rect; for (int i=1; i<StringGrid1->ColCount; i++) { for (int j=1; j<StringGrid1->RowCount; j++) { Rect = StringGrid1->CellRect(i,j); StringGrid1->Canvas->Brush->Color = clWhite; StringGrid1->Canvas->FillRect(Rect); } } for (int i=1; i<StringGrid1->ColCount; i++) { Rect = StringGrid1->CellRect(i,ARow); StringGrid1->Canvas->Brush->Color = clRed; StringGrid1->Canvas->FillRect(Rect); } }
SUMASBROD Во первых, почему в первом случае вложенный цикл оба раза по ColCount? Во вторых, почему в этих же циклах итерации от 1 до кол-ва элементов-1? Уж или от 0, или терминальное условие не <, а <=. В третьих, ужасный код. Уж если и делать настолько через ж**у (извиняюсь конечно), то хотя бы в первом цикле Код (Text): Rect1 = StringGrid1->CellRect(i,0); Rect2 = StringGrid1->CellRect(i,StringGrid1->ColCount-1); Rect1.Bottom = Rect2.Bottom; Rect1.Right = Rect2.Right; StringGrid1->Canvas->Brush->Color = clWhite; StringGrid1->Canvas->FillRect(Rect1); Ну а второй цикл вообще не нужен. Я дома набросаю нормальный код. Сегодня или завтра с утра запостю.
Да, в первом случае, упустил, сознаюсь. По поводу второго замечания начинаю с 1 т.к. по умолчанию первая строка и столбец фиксированные. То что через ж**у, да но другой, более быстрой идеи не нашел.
Код (Text): int selIndex = -1; ... void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { selIndex = ARow; InvalidateRect( StringGrid1->Handle, NULL, false ); } void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { StringGrid1->Canvas->Brush->Color = ( ARow == selIndex ) ? clRed : clWhite; StringGrid1->Canvas->Rectangle( Rect ); } Ну и не забудь где-нибудь ранее вызвать Код (Text): StringGrid1->Canvas->Brush->Style = bsSolid; SUMASBROD Первая-то строка фиксированная, если пользователь не поменял свойства компонента ColFixed & RowFixed (вроде так называются). Так что или их учитывать или рисовать вручную все.
Xerx Благодарю за помощь. Можно сделать все намного проще в Options->goRowSelect=true, и будет то что надо.