【问题标题】:Is it possible to draw a line between points on a TChart "point" chart是否可以在 TChart“点”图表上的点之间画一条线
【发布时间】:2014-11-18 03:44:18
【问题描述】:

Delphi 中的 TChart 实例很好地制作了显示点的图形。这是 TeeChart 库中的“Point”系列。

我想在一些(但不是全部)点之间画线。

例如,绘制一个点的散点图,用 Delphi/TChart 很容易制作。我的目标是在一些点之间画直线。

这可能吗?

此代码有效:

With Chart2.ChartRect do
  begin
    Canvas.MoveTo(0,0);
    Canvas.LineTo(500,500);
  end;

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

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

【问题讨论】:

  • 您可以添加 LineSeries 并让 Chart 进行绘图。
  • 你不应该让图表画线吗?图上的点之间的线是...折线图 :) TChart 绝对支持这一点。

标签: delphi delphi-xe2 teechart


【解决方案1】:

一些选项:

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

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

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

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

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

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

【讨论】:

  • 所以每行创建一个系列。或者使用每条线段的点。 Pt1、Pt2 和一个空值。无需派生新类
  • 谢谢!在 David Heffernan 的协助下,我接受了你的回答。
  • 您似乎接受了建议手动绘制而不是依靠图表来完成工作的答案。
  • 其实。不。更清楚地说,我接受了他的回答,即在您的 cmets 中使用 TLineSeries 关于为每条线使用一个系列并让图表完成工作。谢谢!
  • 嗯,绿色勾号在 LURD 的答案上。这很好。我认为我的 cmets 没有添加任何未在我的回答 FWIW 中说明的内容。
【解决方案2】:

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

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


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

【讨论】:

    【解决方案3】:

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

    在 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帮助中有一个章节很好地介绍了自定义绘图:“图表上的自定义绘图”。

    来自帮助:

    什么时候画?

    您在画布上绘制的顺序很重要。

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

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

    关键图表绘制事件:

    • OnBeforeDrawChart
    • OnBeforeDrawAxes
    • OnBeforeDrawSeries
    • OnAfterDraw

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2011-09-29
      • 2020-12-14
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多