【问题标题】:Delphi-TeeChart : Marks.DrawItem not workingDelphi-TeeChart:Marks.DrawItem 不工作
【发布时间】:2014-03-20 11:33:48
【问题描述】:

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

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;

但正如您在下图中看到的,标记创建得很好,位置正确,但它的文本没有打印出来。

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

这听起来像是在Marks.DrawItem 方法中发生了错误。不幸的是,我使用的是 TeeChart Lite,所以我看不到该方法在哪里失败(如果它真的失败了)

你能帮帮我吗?谢谢。

附:我正在使用 XE5

【问题讨论】:

  • 如果您在该对话框中单击Ignore,您会收到异常消息吗?
  • 你有其他代码设置你的笔/字体/画笔吗?如果是这样,请将其添加到您的问题中。如果没有,您需要设置这些。

标签: delphi teechart


【解决方案1】:

使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多