Помощь - Поиск - Пользователи - Календарь
Полная версия: Цвет ячеек StringGrid
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
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 - там, где она белая...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.