Delphi中的TChart实例可以很好地制作显示点的图形。这是" Point"系列在TeeChart画廊。
我想在一些但不是全部的点之间划一条线。
例如,使用Delphi / TChart可以很容易地绘制点的散点图。我的目标是在一些要点之间画直线。
这可能吗?
此代码有效:
With Chart2.ChartRect do
begin
Canvas.MoveTo(0,0);
Canvas.LineTo(500,500);
end;
线条越过图形,除了图形上看不到线条。似乎图表有很多自己的画布,但我找不到任何关于查找和使用它的文档。
所以,我需要找到TChart创建的某些点的坐标,然后在它们之间划一条线。
答案 0 :(得分:2)
一些选项:
作为David Heffernan said,最佳选择可能是使用支持线段和指针的系列。 TLineSeries
似乎是完成这一系列的完美系列。
这里的问题是这个系列在每两个连续点之间绘制一个线段。您可以使用setNull(index)
方法指向null,这将使该索引处的指针消失,但前导线和后继线段将随之消失。
最简单的解决方案可能是创建一个继承自TLineSeries的TMyLineSeries来覆盖DrawValue方法,如here所述。
在您想要显示的每个点后添加一个空点。在此选项中,唯一未跟随空点的点将是您希望绘制线段的点。
为每个要绘制的线段添加TLineSeries
。
您始终可以使用自定义绘图技术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