Помощь - Поиск - Пользователи - Календарь
Полная версия: Цвет ячеек StringGrid
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Здравствуйте!
Хочу добиться раскрашивания ячеек 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]);
}
}


Вообщем что-то не то я делаю в условии (gdFocused in State)..компилятор на этой строке ругается..
Скажи пожалуйста, как исправить?
volvo
В Билдере это проверяется по-другому:
if (State.Contains(gdFocused))
{
StringGrid1->Canvas->Brush->Color = clBlack;
StringGrid1->Canvas->Font->Color = clWhite;
}
18192123
А можно как-то на основе этого выделить последовательно группу ячеек, при этом "запоминая" выделенные клетки..?
volvo
blink.gif Это то есть как? Что значит "запоминая"?
18192123
Цитата(volvo @ 27.11.2009 23:50) *

blink.gif Это то есть как? Что значит "запоминая"?

в матрицу записать номер строки и номер столбца каждой из окрашенных ячеек..
volvo
Не понял, по каким признакам надо окрашивать-то? Формула какая-то? Тогда озвучь ее.

Если ты хочешь "запоминать" именно выделенные (которые пользователь "протягивает мышкой") ячейки - то этого делать не нужно, для этого есть TStringGrid->Selection
18192123
Цитата(volvo @ 28.11.2009 1:11) *

Не понял, по каким признакам надо окрашивать-то? Формула какая-то? Тогда озвучь ее.

Если ты хочешь "запоминать" именно выделенные (которые пользователь "протягивает мышкой") ячейки - то этого делать не нужно, для этого есть TStringGrid->Selection

Вообщем вот что мне нужно:
есть StringGrid, пользователь щелкает по ячейкам этого StringGrid, изображая какую-нибудь циферку (не протягивает мышкой);
соответственно ячейки, по которым был сделан щелчок должны окрашиваться. И кроме того, мне нужно знать позиции этих ячеек.
volvo
Легко...
Класс формы:
private:	// User declarations
int **myArray; // Добавляешь вот это
, и изменяешь обработчики нескольких событий:
// Создание и удаление формы
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]);
}
Вот и все, теперь у тебя в матрице myArray в каждый момент времени хранится 1 там, где ячейка красная, и 0 - там, где она белая...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.