Изменение цвета строки
Заполняю StringGrid. По мере заполнения, в зависимости от содержания, некоторые строки надо выделять цветом.
Проделываю следующее:
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
StringGrid1->Canvas->Brush->Color=clRed;
StringGrid1->Canvas->Font->Color = clYellow;
StringGrid1->Canvas->Font->Style = TFontStyles() << fsBold;
}
но ничего не изменяется, кроме выделяющего пунктирного курсора ячейки, которую кликаю. :???:
void __fastcall TValueTypes::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
AnsiString text=StringGrid1->Cells[ACol][ARow];
double ww;
if (State.Contains(gdFixed)) // Если заголовок
{
StringGrid1->Canvas->Brush->Color=clMoneyGreen;
StringGrid1->Canvas->Font->Name="Times New Roman";
StringGrid1->Canvas->Font->Color=clBlack;
StringGrid1->Canvas->Font->Size=16;
StringGrid1->Canvas->FillRect(Rect);
// Чтобы текст заголовка был по центру
///////////////
ww=StringGrid1->Canvas->TextExtent(text).cx;
StringGrid1->Canvas->TextRect(Rect,Rect.Left+(Rect.Width()-ww)/2.0, Rect.Top, text);
///////////////////
return;
}
else // Если не заголовок
{
StringGrid1->Canvas->Pen->Color=clBlack;
if (State.Contains(gdSelected)) StringGrid1->Canvas->Brush->Color=clSkyBlue+450;
else StringGrid1->Canvas->Brush->Color=clCream;
StringGrid1->Canvas->Font->Name="Times New Roman";
StringGrid1->Canvas->Font->Style=TFontStyles();
StringGrid1->Canvas->Font->Color=clNavy;
StringGrid1->Canvas->Font->Size=12;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->FrameRect(Rect);
ww=StringGrid1->Canvas->TextExtent(text).cx;
StringGrid1->Canvas->TextRect(Rect,Rect.Left, Rect.Top, text);
}
}
И сделай толщину сетки 2 пикселя, будет симпатичнее.
Да, не забудь OwnerDraw отключить.
К сожалению не знаю, как изменить цвет линий сетки, если додумаешься - дай знать.
TStringList *sl=new TStringList;
sl->Assign(StringGrid1->Cols[6]);
if(sl->Strings[ARow].IsEmpty())
sl->Strings[ARow]="zzz";
else
sl->Strings[ARow]=EmptyStr;
int CellsIndex=sl->IndexOf(StringGrid1->Cells[ACol][ARow]);
delete sl;
if(CellsIndex>=0)
{//есть повторения
StringGrid1->Canvas->Font->Color=clRed;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextOut(Rect.Left+5,Rect.Top+1,StringGrid1->Cells[ACol][ARow]);
}
Но закрашивается (при совпадении) полностью только проверяемя строка и шестая ячейка совпадающей строки, которая тоже должна быть полностью закрашена. Что не так? :???:
Цитата:
Originally posted by Micle1
Но закрашивается (при совпадении) полностью только проверяемя строка и шестая ячейка совпадающей строки, которая тоже должна быть полностью закрашена. Что не так?
Но закрашивается (при совпадении) полностью только проверяемя строка и шестая ячейка совпадающей строки, которая тоже должна быть полностью закрашена. Что не так?
Для тех кому интересно...
На самом деле оказался сущий пустяк. Там где заполняется StringGrid, в конце надо добавить:
StringGrid1->Refresh();
Закрасятся полностью обе совпадающие строки.