Delphi-TeeChart:Marks.DrawItem无效

时间:2014-03-20 11:33:49

标签: delphi teechart

我想使用Chart.ChartAfterDraw方法在Aseries.Marks.DrawItem中绘制标记。我使用以下代码。

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;

但是如下图所示,标记创建正确,位置正确,但不打印文本。

enter image description here

在调试模式中,当光标超过TMyForm.ChartAfterDraw的末尾时,将显示以下消息。

enter image description here

这听起来像是Marks.DrawItem方法中出现的错误。不幸的是我使用的是TeeChart Lite,所以我不知道该方法失败的地方(如果真的失败了)

你能帮帮我吗?谢谢。

P.S。我正在使用XE5

1 个答案:

答案 0 :(得分:0)

使用Chart1.Canvas.Rectangle()Chart1.Canvas.TextOut()函数直接绘制文本/标记可能更容易,但这里有一个使用Marks.DrawItem()函数的示例。请注意,您必须创建并初始化TSeriesMarkPosition以将其传递给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;