是否可以在 TChart "point" 图表上的点之间画一条线



德尔福的 TChart 实例在制作显示点的图表方面做得很好。这是 TeeChart 库中的"点"系列。

我想在一些但不是全部要点之间划清界限。

例如,对点的散点图进行成像,这很容易用德尔福/克哈特制作。 我的目标是在一些点之间画直线。

这可能吗?

此代码有效:

With Chart2.ChartRect do
  begin
    Canvas.MoveTo(0,0);
    Canvas.LineTo(500,500);
  end;
线条在图形

上交叉,但线条在图形上不可见。 似乎图形有自己的画布,但我找不到任何有关查找和使用它的文档。

因此,我需要找到一些点的坐标,由 TChart 创建,然后在它们之间画一条线。

一些选项:

  1. 正如David Heffernan所说,最好的选择可能是使用同时支持线段和指针的系列。 TLineSeries似乎是做到这一点的完美系列。

    这里的问题是,这个序列在每两个连续点之间绘制一条线段。您可以使用setNull(index)方法将点设为 null,这将使该索引处的指针消失,但前置线段和后继线段将随之消失。

    最简单的解决方案可能是创建从 TLineSeries 继承的 TMyLineSeries 以覆盖 DrawValue 方法,如此处所述。

  2. 要显示的每个点之后添加一个空点。在此选项中,唯一不后跟空点的点是要绘制线段的点。

  3. 为每个要绘制的线段添加一个TLineSeries

  4. 正如LU RD所说,您始终可以使用自定义绘图技术。

尝试自己画线条不是继续的方式。图表控件的设计基础是用逻辑术语定义图表,并让控件处理绘制图表。

因此,继续的方法是添加一些表示您希望绘制的线条的线条系列。除了图表的其他系列之外,您还可以完美地添加这些折线系列。


关于尝试在图表画布上绘制的代码,您应该意识到绘制是一个微妙的过程。系统的设计使得控制表面不是永久性的。绘制控件是为了响应WM_PAINT消息。因此,虽然您可以随心所欲地在控件的画布上绘画,但您绘制的内容只会存活到下一个周期。一旦控件无效,它就需要重新绘制自身。这里的教训,作为一般规则,只是为了响应WM_PAINT消息而绘画。或者,在 OnPaint 事件或被覆盖的 Paint 中,VCL 为响应WM_PAINT而调用的方法。

要互连某些点,您必须遵循绘图原则,所有绘图都必须在绘画事件中完成。

在 TChart 中,最好的选择是在 OnAfterDraw 事件中进行自定义绘图。

procedure TForm1.Chart2AfterDraw(Sender: TObject);
begin
  With Chart2.ChartRect do
  begin
    Canvas.MoveTo(0,0);
    Canvas.LineTo(500,500);
  end;
end; 

如果您需要知道点数组中给定点的画布坐标。

MyYPosX := Series1.CalcXPos( Series1.XValue[ 0 ] ); { <-- first point }
MyYPosY := Series1.CalcYPos( Series1.YValue[ 0 ] ); { <-- first point }

在 TChart 帮助中,有一章很好地介绍了自定义绘图:"图表上的自定义绘图"。

从帮助:

什么时候画?

绘制到画布的顺序很重要。

如果您希望自定义绘制的项目显示在图表系列上方,则应使用图表后绘制事件。每次重绘图表组件时,都会触发 Chart1.OnAfterDraw 事件,就在将内部位图复制到屏幕之前。

通过将代码放置在图表绘制系列事件中,可以将自定义绘制的项目放置在图表网格上方和图表系列下方。

关键图表绘制事件:

  • 在绘制图表之前
  • 在绘制轴之前
  • 开前抽奖系列
  • 后绘图

相关内容

  • 没有找到相关文章

最新更新