C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
StringGrid — StringGrid1DrawCell, почему глючит...
seg_r
Отправлено: 17.11.2005, 19:23


Дежурный стрелочник

Группа: Участник
Сообщений: 74



есть SG, OnDrawCell — свой, желание раскрасить разными цветами т.е.

пример SG:

... 1 ... ... ...  — красный
... 1 ... ... ...  — красный
... 2 ... ... ...  — синий
... 3 ... ... ...  — красный
... 4 ... ... ...  — синий
... 4 ... ... ...  — синий
... 4 ... ... ...  — синий

в принципе получилось, но при прокрутки все цвета сбиваются...

вот код :


переменные сразу после include :

bool d_color =true;
AnsiString d_Zn;


в самом начале, после загрузки данных в SG из файла
d_Zn = Form1->StringGrid1->Cells[1][1]

далее

CODE

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
     int ARow, TRect &Rect, TGridDrawState State)
{
//..

 if (d_Zn!=Form1->StringGrid1->Cells[1][ARow]) d_color=!d_color;

 if (d_color) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(253,238,217));
 else Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(250,222,175));

// указатель
if (Form1->StringGrid1->Row==ARow) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(192,120,17));
// первая строка серая
if (ARow==0) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(190,190,190));
// PAINT
Form1->StringGrid1->Canvas->Font->Color=clBlack;
if (Form1->StringGrid1->Row==ARow) Form1->StringGrid1->Canvas->Font->Color=clWhite;


Form1->StringGrid1->Canvas->FillRect(Rect);
Form1->StringGrid1->Canvas->TextOutA(Rect.Left+2,Rect.Top+2,Form1->StringGrid1->Cells[ACol][ARow]);

d_Zn=Form1->StringGrid1->Cells[1][ARow];

// после прорисовки возвращаем начальные значения
if ((ARow==Form1->StringGrid1->RowCount-1)&&(ACol==Form1->StringGrid1->ColCount-1)) d_Zn=Form1->StringGrid1->Cells[1][1];

}
seg_r
Отправлено: 17.11.2005, 20:29


Дежурный стрелочник

Группа: Участник
Сообщений: 74



ну найдите ошибку, или подскажите че-нить... замучился уже...

плиз...
seg_r
Отправлено: 17.11.2005, 21:06


Дежурный стрелочник

Группа: Участник
Сообщений: 74



!!!!!АФИГЕТЬ!!!!! ЗАРАБОТАЛО ! ! ! добавил строчку (выделена красным)


void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
//..

if (d_Zn!=Form1->StringGrid1->Cells[1][ARow]) d_color=!d_color;

if (d_color) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(253,238,217));
else Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(250,222,175));

// указатель
if (Form1->StringGrid1->Row==ARow) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(192,120,17));
// первая строка серая
if (ARow==0) Form1->StringGrid1->Canvas->Brush->Color=TColor(RGB(190,190,190));

Form1->StringGrid1->Cells[1][ARow]=Form1->StringGrid1->Cells[1][ARow];

// PAINT
Form1->StringGrid1->Canvas->Font->Color=clBlack;
if (Form1->StringGrid1->Row==ARow) Form1->StringGrid1->Canvas->Font->Color=clWhite;


Form1->StringGrid1->Canvas->FillRect(Rect);
Form1->StringGrid1->Canvas->TextOutA(Rect.Left+2,Rect.Top+2,Form1->StringGrid1->Cells[ACol][ARow]);

d_Zn=Form1->StringGrid1->Cells[1][ARow];

// после прорисовки возвращаем начальные значения
if ((ARow==Form1->StringGrid1->RowCount-1)&&(ACol==Form1->StringGrid1->ColCount-1)) d_Zn=Form1->StringGrid1->Cells[1][1];

}

Отредактировано seg_r — 17/11/2005, 21:07
seg_r
Отправлено: 18.11.2005, 09:04


Дежурный стрелочник

Группа: Участник
Сообщений: 74



Заработало... но только в Win XP в Win 2000 также все глючит... sad.gif
gvg
Отправлено: 18.11.2005, 09:36


Машинист паровоза

Группа: Участник
Сообщений: 222



У меня давно свой потомок от TStringGrid с реализацией замены цветов. Если готовы делать свой компонент, могу предложить DrawCell от своего. Но, думаю, таких компонентов море.
seg_r
Отправлено: 18.11.2005, 09:48


Дежурный стрелочник

Группа: Участник
Сообщений: 74



QUOTE
У меня давно свой потомок от TStringGrid с реализацией замены цветов. Если готовы делать свой компонент, могу предложить DrawCell от своего. Но, думаю, таких компонентов море.


Спасибо, но я понял причину... но пока не понял как ее исправить...

переменная d_color меняется не там где надо, когда запускается OnDrawCell рисуя выделение...
seg_r
Отправлено: 18.11.2005, 12:56


Дежурный стрелочник

Группа: Участник
Сообщений: 74



все, сделал...

убрал проверку из OnDrawCell,

поставил на OnMouseClick и создал массив раскраски...
gvg
Отправлено: 18.11.2005, 13:18


Машинист паровоза

Группа: Участник
Сообщений: 222



QUOTE (seg_r @ 18/11/2005, 12:56)
поставил на OnMouseClick и создал массив раскраски...

А каким боком здесь OnMouseClick?
seg_r
Отправлено: 18.11.2005, 16:45


Дежурный стрелочник

Группа: Участник
Сообщений: 74



ну определение того, какой ряд, каким цветом поставил на MouseClick

Вернуться в Вопросы программирования в C++Builder