Здравствуйте!
Хочу добиться раскрашивания ячеек StringGrid, соответственно использую обработку события OnDrawCell..
Получается вот так: (на основе примера из Delphi)
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
int clPaleGreen = TColor(0xCCFFCC);
int clPaleRed = TColor(0xCCCCFF);
if (gdFocused in State) //Ошибка!
{
StringGrid1->Canvas->Brush->Color = clBlack;
StringGrid1->Canvas->Font->Color = clWhite;
}
else
if (ACol == 2)
StringGrid1->Canvas->Brush->Color = clPaleGreen;
else
StringGrid1->Canvas->Brush->Color = clPaleRed;
if ((ACol > 0)&&(ARow>0))
{
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid1->Cells[ACol][ARow]);
}
}
В Билдере это проверяется по-другому:
if (State.Contains(gdFocused))
{
StringGrid1->Canvas->Brush->Color = clBlack;
StringGrid1->Canvas->Font->Color = clWhite;
}
А можно как-то на основе этого выделить последовательно группу ячеек, при этом "запоминая" выделенные клетки..?
Это то есть как? Что значит "запоминая"?
Не понял, по каким признакам надо окрашивать-то? Формула какая-то? Тогда озвучь ее.
Если ты хочешь "запоминать" именно выделенные (которые пользователь "протягивает мышкой") ячейки - то этого делать не нужно, для этого есть TStringGrid->Selection
Легко...
Класс формы:
private: // User declarations, и изменяешь обработчики нескольких событий:
int **myArray; // Добавляешь вот это
// Создание и удаление формыВот и все, теперь у тебя в матрице myArray в каждый момент времени хранится 1 там, где ячейка красная, и 0 - там, где она белая...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
myArray = new int* [StringGrid2->RowCount];
for(int i = 0; i < StringGrid2->RowCount; i++)
{
myArray[i] = new int[StringGrid2->ColCount];
for(int j = 0; j < StringGrid2->ColCount; j++) myArray[i][j] = 0;
}
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
for(int i = 0; i < StringGrid2->RowCount; i++)
delete [] myArray[i];
delete [] myArray;
}
// Клик по ячейке и ее отрисовка:
void __fastcall TForm1::StringGrid2SelectCell(TObject *Sender, int ACol, int ARow,
bool &CanSelect)
{
myArray[ARow][ACol] = 1 - myArray[ARow][ACol];
CanSelect = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
TGridDrawState State)
{
if(myArray[ARow][ACol])
StringGrid2->Canvas->Brush->Color = clRed;
else
StringGrid2->Canvas->Brush->Color = clWhite;
StringGrid2->Canvas->FillRect(Rect);
StringGrid2->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid2->Cells[ACol][ARow]);
}