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

时间:2014-11-18 03:44:18

标签: delphi delphi-xe2 teechart

Delphi中的TChart实例可以很好地制作显示点的图形。这是" Point"系列在TeeChart画廊。

我想在一些但不是全部的点之间划一条线。

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

这可能吗?

此代码有效:

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

线条越过图形,除了图形上看不到线条。似乎图表有很多自己的画布,但我找不到任何关于查找和使用它的文档。

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

3 个答案:

答案 0 :(得分:2)

一些选项:

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

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

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

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

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

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

答案 1 :(得分:1)

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

因此,继续进行的方法是添加一些代表您想要绘制的线的线系列。除了图表的其他系列之外,您还可以很好地添加这些系列。


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

答案 2 :(得分:0)

要连接某些点,必须遵循绘图原则,所有绘图必须在绘制事件中完成。

在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 事件。每次重绘图表组件时触发Chart1.OnAfterDraw事件,就在将内部位图复制到屏幕之前。

     

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

     

关键图表绘制事件:

     
      
  • OnBeforeDrawChart
  •   
  • OnBeforeDrawAxes
  •   
  • OnBeforeDrawSeries
  •   
  • OnAfterDraw
  •