Page 1 of 2

Canvas method must be used in the OnAfterDraw event?

Posted: Wed Nov 19, 2008 8:51 am
by 8574101
Hello,
Canvas method must be used in the OnAfterDraw event?

The following codes didn't work well.Nothing was painted on the Chart1.

Code: Select all

void __fastcall TForm1::Button4Click(TObject *Sender)
{
    int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
    int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

    for(int i=0;i++;i<5)
    {
        Chart1->Canvas->TextOutA(X0,Y0,"OK");
        X0 += 20;
        Y0 += 20;
    }
}
Best Regards
wwp3321

Posted: Wed Nov 19, 2008 9:01 am
by 8574101
The following codes also don't work very well, sometimes the "OK" text just flashed on the Chart1 and disappeared; sometimes the "OK" text can be well painted ,but It disappeared when I Minimize the Form .

Code: Select all

void __fastcall TForm1::Button4Click(TObject *Sender) 
{ 
    int X0 = Chart1->Axes->Bottom->CalcXPosValue(10); 
    int Y0 = Chart1->Axes->Left->CalcYPosValue(50); 

    Chart1->Canvas->TextOutA(X0,Y0,"OK"); 
} 


Posted: Wed Nov 19, 2008 9:07 am
by narcis
Hi wwp3321,

Yes, you need to use this in the OnAfterDraw event because calls like Chart1->Axes->Bottom->CalcXPosValue(10) need the chart being painted before so they can be correctly calculated and provide valid values. A simple example using a pie series:

Code: Select all

procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
  Chart1.Title.Text.Add(IntToStr(Series1.XRadius));
  Chart1.Title.Text.Add(IntToStr(Series1.YRadius));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Series1.FillSampleValues();
  Chart1.Draw;
end;
Hope this helps!

Posted: Thu Nov 20, 2008 1:31 am
by 8574101
Now customers want to add the mark by themself.
For example,they want to add a mark at some position by pushing
the Button1.But the following codes don't work well.

Code: Select all

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    int X0 = Chart1->Axes->Bottom->CalcXPosValue(10); 
    int Y0 = Chart1->Axes->Left->CalcYPosValue(50); 

    Chart1->Canvas->TextOutA(X0,Y0,"OK"); 
} 

Posted: Thu Nov 20, 2008 8:12 am
by narcis
Hi wwp3321,

This works fine for me here using code below TeeChart Pro v8.04 VCL. Which TeeChart version are you using?

Code: Select all

//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
	int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

	Chart1->Canvas->TextOutA(X0,Y0,"OK");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
	Series1->Clear();

	for (int i=0; i < 100; i++) {
		Series1->Add(i);
	}
}
//---------------------------------------------------------------------------
You may also want to try calling Draw method before retrieving axes positions, for example:

Code: Select all

void __fastcall TForm3::Button1Click(TObject *Sender)
{
	Chart1->Draw();

	int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
	int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

	Chart1->Canvas->TextOutA(X0,Y0,"OK");
}
Thanks in advance.

Posted: Thu Nov 20, 2008 9:06 am
by 8574101
My TeeChart version is 6.01

Posted: Thu Nov 20, 2008 9:08 am
by narcis
Hi wwp3321,

Could you please try calling Draw method as I suggested?

Thanks in advance.

Posted: Thu Nov 20, 2008 9:54 am
by 8574101

Code: Select all

void __fastcall TForm3::Button1Click(TObject *Sender) 
{ 
   Chart1->Draw(); 

   int X0 = Chart1->Axes->Bottom->CalcXPosValue(10); 
   int Y0 = Chart1->Axes->Left->CalcYPosValue(50); 

   Chart1->Canvas->TextOutA(X0,Y0,"OK"); 
}
When I Minimize the form ,"OK" disappeared.

Posted: Thu Nov 20, 2008 9:59 am
by narcis
Hi wwp3321,

Yes, because the chart has been repainted and custom text has not been painted this time. You'd better use this code in the OnAfterDraw event with a flag being enabled in the button clicked event, something like this:

Code: Select all

//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	DrawText=true;
	Chart1->Draw();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Chart1AfterDraw(TObject *Sender)
{
   if (DrawText) {
	   int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
	   int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

	   Chart1->Canvas->TextOutA(X0,Y0,"OK");
   }
}
//---------------------------------------------------------------------------

Posted: Thu Nov 20, 2008 10:00 am
by 8574101

Code: Select all

    Chart1->Draw();
    int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
    int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

    for(int i=0;i++;i<5)
    {
        Chart1->Canvas->TextOutA(X0,Y0,"OK");
        X0 += 20;
        Y0 += 20;
    }
The codes above painted nothting,even one "OK".

Posted: Thu Nov 20, 2008 10:07 am
by narcis
Hi wwp3321,

We may have crossed posts. Could you please check my last reply?

Thanks in advance.

Posted: Thu Nov 20, 2008 10:14 am
by 8574101
8574101 wrote:

Code: Select all

    Chart1->Draw();
    int X0 = Chart1->Axes->Bottom->CalcXPosValue(10);
    int Y0 = Chart1->Axes->Left->CalcYPosValue(50);

    for(int i=0;i++;i<5)
    {
        Chart1->Canvas->TextOutA(X0,Y0,"OK");
        X0 += 20;
        Y0 += 20;
    }
Please check the codes above.
The codes above painted nothting,even one "OK".
The codes above should paint five "OK".

BTW: I didn't resize the form.

Posted: Thu Nov 20, 2008 10:18 am
by narcis
Hi wwp3321,

Please send us a simple example project we can run "as-is" to reproduce the problem here.

You can either post your files at news://www.steema.net/steema.public.attachments newsgroup or at our upload page.

Thanks in advance.

Posted: Thu Nov 20, 2008 10:34 am
by 8574101
I have upload the source.
BCB6.0,Teechart6.01
Received TestTchartCanvas.zip Content Type application/x-zip-compressed Length 1903376

Posted: Thu Nov 20, 2008 10:42 am
by narcis
Hi wwp3321,

Thanks for the example project but I'm not able to run it because a.tee is not included. Could you please send the tee file too?

Thanks in advance.