int i,j,a11,b11;
double a1,b1,sum1,sum2,sum3,sum,dh;
double matr;
StringGrid - шрифт разного цвета каждой ячейки в зависимости от условия
Код:
Код:
void __fastcall TFrmVpl::Btn21Click(TObject *Sender)
{
FrmVpl->PgCont1->Pages[2]->Show();
StGr2->FixedCols=0;
StGr2->FixedRows=0;
StGr2->ColCount=a11;
StGr2->RowCount=b11;
for(i=0;i<FrmVpl->StGr1->ColCount-1;i++){
for(j=0;j<FrmVpl->StGr1->RowCount-1;j++){
sum1=StrToFloat(StGr1->Cells[j])+
StrToFloat(StGr1->Cells[j+1]);
sum2=StrToFloat(StGr1->Cells[i+1][j])+
StrToFloat(StGr1->Cells[i+1][j+1]);
sum3=(sum1+sum2)/4; //ср отметка каждой ячейки
matr+=StrToFloat(StGr1->Cells[j]); //сложение ячеек всей матрицы
sum=matr/((a11+1)*(b11+1)); //общ ср отметка
dh=sum-sum3; //средняя отметка каждой ячейки
FrmVpl->StGr2->Cells[j]=dh;
}}
}
{
FrmVpl->PgCont1->Pages[2]->Show();
StGr2->FixedCols=0;
StGr2->FixedRows=0;
StGr2->ColCount=a11;
StGr2->RowCount=b11;
for(i=0;i<FrmVpl->StGr1->ColCount-1;i++){
for(j=0;j<FrmVpl->StGr1->RowCount-1;j++){
sum1=StrToFloat(StGr1->Cells[j])+
StrToFloat(StGr1->Cells[j+1]);
sum2=StrToFloat(StGr1->Cells[i+1][j])+
StrToFloat(StGr1->Cells[i+1][j+1]);
sum3=(sum1+sum2)/4; //ср отметка каждой ячейки
matr+=StrToFloat(StGr1->Cells[j]); //сложение ячеек всей матрицы
sum=matr/((a11+1)*(b11+1)); //общ ср отметка
dh=sum-sum3; //средняя отметка каждой ячейки
FrmVpl->StGr2->Cells[j]=dh;
}}
}
Далее, выделение цветом шрифт в зависимости от условия, например, если отрицательная отметка, то выделяется зеленым цветом, если положит - красным, ноль - желтым. Не меняется цвет, он остается черным.
Код:
void __fastcall TFrmVpl::StGr2DrawCell(TObject *Sender, int ACol, int ARow,
TRect &Rect, TGridDrawState State)
{
FrmVpl->StGr2->Cells[j]=dh;
if(dh>0){
//FrmVpl->StGr2->Canvas->Brush->Color=clRed;
StGr2->Canvas->Brush->Color=clRed;
}
else if(dh<0) {
//FrmVpl->StGr2->Canvas->Brush->Color=clGreen;
StGr2->Canvas->Brush->Color=clGreen;
}
else {
//FrmVpl->StGr2->Canvas->Brush->Color=clRed;
StGr2->Canvas->Brush->Color=clYellow;
}
}
TRect &Rect, TGridDrawState State)
{
FrmVpl->StGr2->Cells[j]=dh;
if(dh>0){
//FrmVpl->StGr2->Canvas->Brush->Color=clRed;
StGr2->Canvas->Brush->Color=clRed;
}
else if(dh<0) {
//FrmVpl->StGr2->Canvas->Brush->Color=clGreen;
StGr2->Canvas->Brush->Color=clGreen;
}
else {
//FrmVpl->StGr2->Canvas->Brush->Color=clRed;
StGr2->Canvas->Brush->Color=clYellow;
}
}
И по данным SrGr1->Cells[j] должен строиться график(Lines или Area - не знаю точно) как горизонтальная поверхность. Код:
Код:
void __fastcall TFrmVpl::Btn22Click(TObject *Sender)
{
const double dAXVal=0.0;
const double dAYVal=0.0;
const AnsiString sLabel="";
const TColor Color1=clBlue;
FrmVpl->PgCont1->Pages[1]->Show();
Chart1->Series[0]->Clear();
Chart1->Series[0]->AddXY(dAXVal,dAYVal,sLabel,Color1);
}
{
const double dAXVal=0.0;
const double dAYVal=0.0;
const AnsiString sLabel="";
const TColor Color1=clBlue;
FrmVpl->PgCont1->Pages[1]->Show();
Chart1->Series[0]->Clear();
Chart1->Series[0]->AddXY(dAXVal,dAYVal,sLabel,Color1);
}
Помогите, пожалуйста:(, пишу диплом.Заранее спасибо.
В OnDrawCell пользоваться свойством Cells как LValue нельзя, рисуйте самостоятельно, например через Canvas.TextOut(). Цвет шрифта задается Font->Color. Параметры вывода задаются ДО использования вывода а не после.
Код:
void __fastcall TFrmVpl::StGr2DrawCell(TObject *Sender, int ACol, int ARow,
TRect &Rect, TGridDrawState State)
{
AnsiString S=dh; //все равно без изменений
if(dh>0){
FrmVpl->StGr2->Canvas->Font->Color=clRed;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
else if(dh<0) {
FrmVpl->StGr2->Canvas->Font->Color=clGreen;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
else {
FrmVpl->StGr2->Canvas->Font->Color=clYellow;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
}
TRect &Rect, TGridDrawState State)
{
AnsiString S=dh; //все равно без изменений
if(dh>0){
FrmVpl->StGr2->Canvas->Font->Color=clRed;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
else if(dh<0) {
FrmVpl->StGr2->Canvas->Font->Color=clGreen;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
else {
FrmVpl->StGr2->Canvas->Font->Color=clYellow;
//StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,S);
}
}
Написала так, но выводятся одинаковые значения во всех ячейках, почему?
и посмотри чему равно dh!
Я думаю, если по номеру столбца и номеру строки брать
разные dh, то будет все норм.
Как сделать точку останова? Я с ней ни разу не сталкивалась. Пару слов скажите, пожалуйста. Заранее спасибо
Код:
AnsiString S=StGr2->Cells[j];
на которой надо остановитсья - появится красная точка и при выполнении программы она
остановится на этой строчке. А дальше F8 - по шагам...
Надо почитать основы отладки, сходу всего не объяснишь.
А еще лучше создать массив цветов, соответствующий каждой ячейке,
например так:
TColor color[число столбцов][ число строк];
заполнять его при вычислениях и в обработчике использовать:
StGr2->Canvas->Font->Color=color[ACol][ARow];
Как Вы написали, так нельзя к цвету приравнивать ячейки двумерной матрицы
StGr2->Canvas->Font->Color имеет тип TColor - мы и присваиваем ему значение типа ТСolor.
Код:
StGr2->DefaultDrawing=false;
AnsiString S=StGr2->Cells[j];
if(S>0){
StGr2->Brush->Color=clRed;
FrmVpl->StGr2->Canvas->Font->Color=clRed;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
else if(S<0) {
StGr2->Brush->Color=clGreen;
FrmVpl->StGr2->Canvas->Font->Color=clGreen;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
else {
StGr2->Brush->Color=clBlue;
FrmVpl->StGr2->Canvas->Font->Color=clBlue;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
AnsiString S=StGr2->Cells[j];
if(S>0){
StGr2->Brush->Color=clRed;
FrmVpl->StGr2->Canvas->Font->Color=clRed;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
else if(S<0) {
StGr2->Brush->Color=clGreen;
FrmVpl->StGr2->Canvas->Font->Color=clGreen;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
else {
StGr2->Brush->Color=clBlue;
FrmVpl->StGr2->Canvas->Font->Color=clBlue;
StGr2->Canvas->FillRect(Rect);
StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
}
В чем проблема? А выводи значения правильно, но цвета не меняются
Код:
AnsiString S=StGr2->Cells[j];
а при чем тут i и j? на ACol и ARow не пробовали поменять?