【发布时间】:2016-03-16 00:04:33
【问题描述】:
(Delphi 6 与 TChart,Win XP)
我在尝试清除点系列中的点时出现了不稳定的行为,当然,这段代码曾经可以工作。
基本上,我的程序的这一部分会生成 5 个数据点并绘制它们。当我尝试使用 OSC_Series.Clear 清除它们时,出现“列表索引超出范围 [0]”错误。
我检查以确保我绘制的值没有任何奇怪之处。那里一切都很好。然后我尝试了不同的方法来尝试隔离和解决问题。
这是一些代码。
type
TksGraph_DataFrm = class(TForm)
.
.
.
private
OSC_Series: TPointSeries
public
end;
procedure TksGraph_DataFrm.cat7AnalysisInitialize(var P:TTest_Project);
begin
// Do a bunch of stuff.
// Set up the analysis data points series.
OSC_Series:=TPointSeries.Create(self);
AnalysisChart.AddSeries(OSC_Series);
with OSC_Series do
begin
Title:='';
HorizAxis:=aBothHorizAxis;
VertAxis:=aBothVertAxis;
SeriesColor:=clRed;
Pointer.Brush.Color:=clYellow;
Pointer.HorizSize:=4;
Pointer.VertSize:=4;
Pointer.Style:=psRectangle;
Pointer.Visible:=true;
LinePen.Color:=clBlack;
LinePen.Width:=1;
Linepen.Visible:=true;
ShowInLegend:=false;
XValues.Order:=LoNone;
end;
end;
procedure TksGraph_DataFrm.cat7AnalysisRefresh(var P:TTest_Project);
var X,Y:single;
begin
X:= some value
Y:= some value
// Plot the result.
OSC_Series.AddXY(X,Y);
showmessage(
'Count = '+inttostr(OSC_Series.Count)+#13+
'X = '+FloatToStr(X)+#13+
'Y = '+FloatToStr(Y)+#13+
'Plot-X = '+FloatToStr(OSC_Series.XValue[OSC_Series.Count-1])+#13+
'Plot-Y = '+FloatToStr(OSC_Series.YValue[OSC_Series.Count-1]));
end;
这是我用来重置系列的例程。我包含了有效和无效的代码。
procedure TksGraph_DataFrm.cat7AnalysisClear(var P:TTest_Project);
var i:integer;
begin
// This should work, but it gives me the list out of bounds error
// unless the count is 0.
OSC_Series.Clear;
// This does not work, for obvious reasons. I get a "list out of
// bounds [3] for this one.
for i:=0 to OSC_Series.Count - 1 do OSC_Series.Delete[0];
// It seems this should work, but again I get the out of bounds [0]
// error.
repeat
OSC_Series.Delete(0);
until OSC_Series.Count = 0;
// This works. Don't ask me why.
showmessage('A - '+inttostr(OSC_Series.Count));
OSC_Series.Clear;
showmessage('B - '+inttostr(OSC_Series.Count));
// This also works.
sleep(2000);
OSC_Series.Clear;
// This does not work.
sleep(1000);
OSC_Series.Clear;
end;
显然,我被难住了。
【问题讨论】:
-
请出示minimal reproducible example或做一些调试
-
你使用单线程吗?你能确定 OSC_Series 是从同一个线程操作的吗?
-
您使用的是 Delphi 6 附带的 TeeChart Standard 版本吗?我无法在 RAD XE 中重现最新版本 v2015.16 的问题。在我的测试应用程序中,我只是在一个新表单上放置了一个 TChart 和一个 TButton。我在
OnCreate创建了OSC_Series,并在我的Button1Click中调用了来自您的cat7AnalysisClear的代码。在每次“清除尝试”之前我也会打电话给OSC_Series.FillSampleValues();来检查它(我没有使用你的cat7AnalysisRefresh) -
这里不涉及线程。
-
Series.Clear 可以在其他任何地方使用,因此在 TeeChart 中不太可能出现问题。我将该系列重命名为 OCS_SeriesA,但这并没有帮助。我将其引用为 Self.OSC_Series,没有变化。我认为将系列名称与另一个系列名称混淆的问题已经解决。我尝试将代码放在 try... except 块中,EurekaLog 在我的代码之前抓取它。只有在 Series.Delete(0) 和 while 语句之间有 ShowMessage 行时,repeat..until 代码才有效。 ShowMessage 行试图告诉我一些事情。