Search code examples
delphiteechart

Delphi-TeeChart : Marks.DrawItem not working


I'd like to draw marks in Chart.ChartAfterDraw using Aseries.Marks.DrawItem method. I'm using the following code.

procedure TMyForm.ChartAfterDraw(Sender: TObject);
var
  mark : TTextShape;
begin
  mark := TTextShape.Create(Chart);
  mark.Font := ClickedSeries.Marks.Font;
  ClickedSeries.Marks.DrawItem(mark,
                              clRed,
                              'pippo',
                              ClickedSeries.Marks.Positions[ ClickedTask ] );


end;

But as you can see in figure below mark is created fine, in correct position, but its text is not printed.

enter image description here

In debug mod when cursor go past the end of TMyForm.ChartAfterDraw the following message appear.

enter image description here

This sounds like an error occured in Marks.DrawItem method. Unfortunately i'm using TeeChart Lite, so i cant't see where that method fails (if it really fails)

Can you help me? Thank you.

P.s. I'm using XE5


Solution

  • It may be easier to directly draw your texts/marks using Chart1.Canvas.Rectangle() and Chart1.Canvas.TextOut() functions, but here you have an example using Marks.DrawItem() function. Note you had to create and initialize a TSeriesMarkPosition to pass it to the Marks.DrawItem().

    uses Series;
    
    type
      TShapeAccess=class(TCustomTextShape);
    
    var ClickedSeries: TChartSeries;
        ClickedTask: Integer;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var i: Integer;
    begin
      Chart1.View3D:=false;
    
      for i:=0 to 3 do
        with Chart1.AddSeries(TPointSeries) do
          FillSampleValues;
    end;
    
    procedure TForm1.Chart1Click(Sender: TObject);
    var i: Integer;
    begin
      for i:=0 to Chart1.SeriesCount-1 do
      begin
        ClickedTask:=Chart1[i].Clicked(Chart1.GetCursorPos.X, Chart1.GetCursorPos.Y);
        if ClickedTask>-1 then
        begin
          ClickedSeries:=Chart1[i];
          Break;
        end;
      end;
      Chart1.Draw;
    end;
    
    procedure TForm1.Chart1AfterDraw(Sender: TObject);
    var
      mark : TTextShape;
      position: TSeriesMarkPosition;
      tmpString: String;
    begin
      if (ClickedSeries<>nil) and (ClickedTask>-1) and (ClickedTask<ClickedSeries.Count-1) then
      begin
        tmpString:='pippo';
    
        mark := TTextShape.Create(Chart1);
        mark.Text:=tmpString;
        mark.Font := ClickedSeries.Marks.Font;
        TShapeAccess(mark).CalcBounds(Chart1);
    
        position:=TSeriesMarkPosition.Create;
        position.LeftTop.X:=ClickedSeries.CalcXPos(ClickedTask);
        position.LeftTop.Y:=ClickedSeries.CalcYPos(ClickedTask);
        position.Width:=Chart1.Canvas.TextWidth(tmpString)+2;
        position.Height:=Chart1.Canvas.TextHeight(tmpString)+4;
    
        ClickedSeries.Marks.DrawItem(mark, clRed, tmpString, position);
      end;
    end;