我使用的是Delphi 10 Seattle Subscription Update 1和TeeChart Standard v2015.15.150420,它与Delphi捆绑在一起。
我把一个TDBChart组件放到一个新的VCL应用程序的空白表单上http://www.teechart.net/docs/teechart/vclfmx/tutorials/UserGuide/Tutorials/tutorial7.htm#AddFunction在表单的OnCreate事件中。有了这段代码,一切都正常工作,我得到了两个用样本值填充的条形系列和一个表示两个条形系列平均值的线性系列。
如果我不想用线级数来表示平均值,而是用条形级数来表示,那么问题就来了。如果我将TLineSeries更改为TBarSeries并运行程序,则在将第一个条形序列作为数据源添加到函数序列(tmpLineSeries)(例如tmpLineSeries.DataSources.Add( tmpBarSeries1 );
)时,会导致"0x0066d665处的访问冲突:读取地址0x00000198"。
这是问题代码(请参阅下面的"此处发生AV")。请注意,与工作教程示例不同的唯一代码是,如前所述,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(我已经在了解Delphi的最新更新)或购买独立版本的TeerChart来完成。
这对我来说就像一个bug。我已经将它(bug#1484)添加到了Steema Software的bugzilla中。我能想到的唯一解决方法是将TTeeFunction.Period属性设置为大于零的值,这样就不会执行有问题的代码。例如:
//workaround
tmpLineSeries.FunctionType.Period:=1;
tmpLineSeries.DataSources.Add( tmpBarSeries1 ); ////// AV occurs here!!!
tmpLineSeries.DataSources.Add( tmpBarSeries2 );
更新:此问题已在下一个TeeChart版本中修复。