添加 TeeChart 函数数据源导致访问冲突
Adding a TeeChart function datasource causes access violation
我正在使用 Delphi 10 Seattle Subscription Update 1 和 TeeChart Standard v2015.15.150420,它与 Delphi.
捆绑在一起
我将 TDBChart 组件放在新 VCL 应用程序的空白窗体上。然后,我使用在表单的 OnCreate 事件中的 http://www.teechart.net/docs/teechart/vclfmx/tutorials/UserGuide/Tutorials/tutorial7.htm#AddFunction 中的 "Adding a Function" 教程中概述的示例代码。使用此代码,一切正常,我得到两个填充了样本值的条形系列和一个代表两个条形系列的平均值的线系列。
如果我不想用线系列表示平均值,而是用条形系列表示,问题就来了。如果我将 TLineSeries 更改为 TBarSeries 和 运行 程序,它会导致 "access violation at 0x0066d665: read of address 0x00000198" 将第一个条形系列作为数据源添加到函数系列 (tmpLineSeries),例如。 tmpLineSeries.DataSources.Add( tmpBarSeries1 );
.
这是问题代码(请参阅下面的 "AV occurs here")。请注意,正如所解释的那样,唯一从工作教程示例中更改的代码是 tmpLineSeries 已更改为 TBarSeries 类型而不是 TLineSeries 类型:
procedure TForm1.FormCreate(Sender: TObject);
var tmpBarSeries1,
tmpBarSeries2 : TBarSeries;
tmpLineSeries : TBarSeries;
begin
//Add 2 data Series
tmpBarSeries1:=TBarSeries.Create(Self);
tmpBarSeries2:=TBarSeries.Create(Self);
DBChart1.AddSeries(tmpBarSeries1);
DBChart1.AddSeries(tmpBarSeries2);
//Populate them with data (here random)
tmpBarSeries1.FillSampleValues(10);
tmpBarSeries2.FillSampleValues(10);
//Add a series to be used for an Average Function
tmpLineSeries:=TBarSeries.Create(Self);
DBChart1.AddSeries(tmpLineSeries);
//Define the Function Type for the new Series
tmpLineSeries.SetFunction(TAverageTeeFunction.Create(Self));
//Define the Datasource for the new Function Series
//Datasource accepts the Series titles of the other 2 Series
tmpLineSeries.DataSources.Clear;
tmpLineSeries.DataSources.Add( tmpBarSeries1 ); ////// AV occurs here!!!
tmpLineSeries.DataSources.Add( tmpBarSeries2 );
// *Note - When populating your input Series manually you will need to
// use the Checkdatasource method
// - See the section entitled 'Defining a Datasource'
//Change the Period of the Function so that it groups averages
//every 2 Points
tmpLineSeries.FunctionType.Period := 2;
end;
这似乎是 TeeChart 中的错误,或者我遗漏了 BarSeries 所需的配置步骤,而 LineSeries 则不需要。
任何人都可以看到我做错了什么,或者建议解决该错误的方法吗?我不认为在这个阶段升级到最新版本的 TeeChart 是一个选项,因为据我所知,这只能通过升级 Delphi 来完成(我已经在 [=28 的最新更新=]),或者购买独立版本的 TeeChart。
我觉得这像是一个错误。我已将它 (bug #1484) to Steema Software's bugzilla. The only workaround I can think of is setting TTeeFunction.Period 属性 添加到大于零的值,因此不会执行有问题的代码。例如:
//workaround
tmpLineSeries.FunctionType.Period:=1;
tmpLineSeries.DataSources.Add( tmpBarSeries1 ); ////// AV occurs here!!!
tmpLineSeries.DataSources.Add( tmpBarSeries2 );
更新:这已在下一个 TeeChart 版本中修复。
我正在使用 Delphi 10 Seattle Subscription Update 1 和 TeeChart Standard v2015.15.150420,它与 Delphi.
捆绑在一起我将 TDBChart 组件放在新 VCL 应用程序的空白窗体上。然后,我使用在表单的 OnCreate 事件中的 http://www.teechart.net/docs/teechart/vclfmx/tutorials/UserGuide/Tutorials/tutorial7.htm#AddFunction 中的 "Adding a Function" 教程中概述的示例代码。使用此代码,一切正常,我得到两个填充了样本值的条形系列和一个代表两个条形系列的平均值的线系列。
如果我不想用线系列表示平均值,而是用条形系列表示,问题就来了。如果我将 TLineSeries 更改为 TBarSeries 和 运行 程序,它会导致 "access violation at 0x0066d665: read of address 0x00000198" 将第一个条形系列作为数据源添加到函数系列 (tmpLineSeries),例如。 tmpLineSeries.DataSources.Add( tmpBarSeries1 );
.
这是问题代码(请参阅下面的 "AV occurs here")。请注意,正如所解释的那样,唯一从工作教程示例中更改的代码是 tmpLineSeries 已更改为 TBarSeries 类型而不是 TLineSeries 类型:
procedure TForm1.FormCreate(Sender: TObject);
var tmpBarSeries1,
tmpBarSeries2 : TBarSeries;
tmpLineSeries : TBarSeries;
begin
//Add 2 data Series
tmpBarSeries1:=TBarSeries.Create(Self);
tmpBarSeries2:=TBarSeries.Create(Self);
DBChart1.AddSeries(tmpBarSeries1);
DBChart1.AddSeries(tmpBarSeries2);
//Populate them with data (here random)
tmpBarSeries1.FillSampleValues(10);
tmpBarSeries2.FillSampleValues(10);
//Add a series to be used for an Average Function
tmpLineSeries:=TBarSeries.Create(Self);
DBChart1.AddSeries(tmpLineSeries);
//Define the Function Type for the new Series
tmpLineSeries.SetFunction(TAverageTeeFunction.Create(Self));
//Define the Datasource for the new Function Series
//Datasource accepts the Series titles of the other 2 Series
tmpLineSeries.DataSources.Clear;
tmpLineSeries.DataSources.Add( tmpBarSeries1 ); ////// AV occurs here!!!
tmpLineSeries.DataSources.Add( tmpBarSeries2 );
// *Note - When populating your input Series manually you will need to
// use the Checkdatasource method
// - See the section entitled 'Defining a Datasource'
//Change the Period of the Function so that it groups averages
//every 2 Points
tmpLineSeries.FunctionType.Period := 2;
end;
这似乎是 TeeChart 中的错误,或者我遗漏了 BarSeries 所需的配置步骤,而 LineSeries 则不需要。
任何人都可以看到我做错了什么,或者建议解决该错误的方法吗?我不认为在这个阶段升级到最新版本的 TeeChart 是一个选项,因为据我所知,这只能通过升级 Delphi 来完成(我已经在 [=28 的最新更新=]),或者购买独立版本的 TeeChart。
我觉得这像是一个错误。我已将它 (bug #1484) to Steema Software's bugzilla. The only workaround I can think of is setting TTeeFunction.Period 属性 添加到大于零的值,因此不会执行有问题的代码。例如:
//workaround
tmpLineSeries.FunctionType.Period:=1;
tmpLineSeries.DataSources.Add( tmpBarSeries1 ); ////// AV occurs here!!!
tmpLineSeries.DataSources.Add( tmpBarSeries2 );
更新:这已在下一个 TeeChart 版本中修复。