IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Цвет ячеек StringGrid, C++ Builder
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!
Хочу добиться раскрашивания ячеек 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)..компилятор на этой строке ругается..
Скажи пожалуйста, как исправить?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






В Билдере это проверяется по-другому:
if (State.Contains(gdFocused))
{
StringGrid1->Canvas->Brush->Color = clBlack;
StringGrid1->Canvas->Font->Color = clWhite;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


А можно как-то на основе этого выделить последовательно группу ячеек, при этом "запоминая" выделенные клетки..?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






blink.gif Это то есть как? Что значит "запоминая"?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 27.11.2009 23:50) *

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

в матрицу записать номер строки и номер столбца каждой из окрашенных ячеек..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

Если ты хочешь "запоминать" именно выделенные (которые пользователь "протягивает мышкой") ячейки - то этого делать не нужно, для этого есть TStringGrid->Selection
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 28.11.2009 1:11) *

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

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

Вообщем вот что мне нужно:
есть StringGrid, пользователь щелкает по ячейкам этого StringGrid, изображая какую-нибудь циферку (не протягивает мышкой);
соответственно ячейки, по которым был сделан щелчок должны окрашиваться. И кроме того, мне нужно знать позиции этих ячеек.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Легко...
Класс формы:
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 - там, где она белая...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 12:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name