Lazarus TAChart 在运行时添加 TChartToolSet 和 TZoomDragTool
Lazarus TAChart add TChartToolSet and TZoomDragTool at runtime
我无法弄清楚如何将 TZoomDragTool 添加到 TChart。我知道 TChart 内置了对缩放的支持,但我想同时禁用平移(右键单击拖动)。有一个 属性 来禁用缩放,但没有直接的方法来禁用平移。
我发现,如果我将 TChartToolSet 添加到图表,它将禁用内置的缩放和平移功能。如果我可以将 TZoomDragTool 添加到 TChartToolSet,那么它将执行我想要的操作。如果我在设计时这样做,效果很好,但我不知道在 运行 时间该怎么做。
如果有人能告诉我怎么做,我将不胜感激。
我有一个小代码片段,如果我 运行 它会给我错误。
TForm1 = class(TForm)
Button1: TButton;
m_chart: TChart;
m_toolset: TChartToolset;
m_zoom: TZoomDragTool;
procedure Button1Click(Sender: TObject);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
m_chart:= TChart.Create(self);
with m_chart do begin
autosize:= False;
left:= 10;
top:= 40;
width:= 300;
height:= 150;
parent:= Self;
visible:= True;
end;
m_toolset:= TChartToolset.Create(m_chart); //is the owner correct?
m_zoom:= TZoomDragTool.Create(m_toolset); //is the owner correct?
m_toolset.Tools.Add(@m_zoom); //is this correct?
m_chart.Toolset:= m_toolset; //is this the way?
//or something like
//m_chart.Toolset.InsertComponent(m_toolset);
//both of them crash
end;
TAChart 将 TChartTool
(这是 TIndexedComponent
)添加到 TChartToolset
的方式有点奇怪。 TChartToolset
有一个TIndexedComponentList
,Tools
,作用类似于集合,这里有困难的人的代码都是在[=中加上TIndexedComponent
15=] 通过调用它的 Add
方法。但是,这并不能完成所有工作。相反,TChartTool
有一个 public 属性 Toolset
,您必须将其分配给添加到表单的 TChartToolset
组件。
这是正确的代码:
m_toolset:= TChartToolset.Create(self);
// since ChartTools can be used by several charts it is safer to have the ChartToolset be owned by the form
m_zoom:= TZoomDragTool.Create(m_toolset);
m_zoom.ToolSet := m_toolset;
除了 ChartTools,运行 时间创建的 ChartTransformations 也需要相同的代码。
我无法弄清楚如何将 TZoomDragTool 添加到 TChart。我知道 TChart 内置了对缩放的支持,但我想同时禁用平移(右键单击拖动)。有一个 属性 来禁用缩放,但没有直接的方法来禁用平移。
我发现,如果我将 TChartToolSet 添加到图表,它将禁用内置的缩放和平移功能。如果我可以将 TZoomDragTool 添加到 TChartToolSet,那么它将执行我想要的操作。如果我在设计时这样做,效果很好,但我不知道在 运行 时间该怎么做。
如果有人能告诉我怎么做,我将不胜感激。
我有一个小代码片段,如果我 运行 它会给我错误。
TForm1 = class(TForm)
Button1: TButton;
m_chart: TChart;
m_toolset: TChartToolset;
m_zoom: TZoomDragTool;
procedure Button1Click(Sender: TObject);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
m_chart:= TChart.Create(self);
with m_chart do begin
autosize:= False;
left:= 10;
top:= 40;
width:= 300;
height:= 150;
parent:= Self;
visible:= True;
end;
m_toolset:= TChartToolset.Create(m_chart); //is the owner correct?
m_zoom:= TZoomDragTool.Create(m_toolset); //is the owner correct?
m_toolset.Tools.Add(@m_zoom); //is this correct?
m_chart.Toolset:= m_toolset; //is this the way?
//or something like
//m_chart.Toolset.InsertComponent(m_toolset);
//both of them crash
end;
TAChart 将 TChartTool
(这是 TIndexedComponent
)添加到 TChartToolset
的方式有点奇怪。 TChartToolset
有一个TIndexedComponentList
,Tools
,作用类似于集合,这里有困难的人的代码都是在[=中加上TIndexedComponent
15=] 通过调用它的 Add
方法。但是,这并不能完成所有工作。相反,TChartTool
有一个 public 属性 Toolset
,您必须将其分配给添加到表单的 TChartToolset
组件。
这是正确的代码:
m_toolset:= TChartToolset.Create(self);
// since ChartTools can be used by several charts it is safer to have the ChartToolset be owned by the form
m_zoom:= TZoomDragTool.Create(m_toolset);
m_zoom.ToolSet := m_toolset;
除了 ChartTools,运行 时间创建的 ChartTransformations 也需要相同的代码。