2016-10-05 63 views
1

我很难搞清楚如何将TZoomDragTool添加到TChart。我知道TChart已经构建了对缩放的支持,但我想同时禁用平移(通过右键点击拖动)。有一个属性禁用缩放,但没有直接的方法来禁用平移。Lazarus TAChart在运行时添加TChartToolSet和TZoomDragTool

我发现,如果我添加一个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; 

回答

3

TAChart具有添加TChartTool(这是一个TIndexedComponent)到TChartToolset的有点奇怪方式。 TChartToolset有一个TIndexedComponentList,Tools,其行为类似于一个集合,并且所有在这里遇到困难的人的代码只是通过调用Add方法将TIndexedComponent添加到TIndexedComponentList。但是,这并不是所有的工作。相反,TChartTool有一个公共属性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相同的代码。

+0

你的意思是说m_zoom.toolset:= m_toolset;对?有效。谢谢。请更正帖子。我会选择它作为答案。 –

+0

感谢纠正我 - 修复。 –