delphi Tchart绘制实时曲线 20
我在用Tchart绘制实时曲线,将传感器采集到的数据实时显示在tchart组件上,由于要采集10000组数据,存储在数组中,所以只能显示这些数据中的一部分,100个左右,...
我在用Tchart绘制实时曲线,将传感器采集到的数据实时显示在tchart组件上,由于要采集10000组数据,存储在数组中,所以只能显示这些数据中的一部分,100个左右,只显示最新的100个数据,现在这部分我已经完成,可以实时显示,但又有新的要求,需要可以用鼠标拖动曲线,可以显示出10000组数据的任意部分,还可以放大缩小曲线,这个好像是组件自带的属性,但是对于图像的拖动该如何解决,还请各位大侠帮忙!以下是代码Time组件中的采集部分,采集的数据暂时用随机数代替:
procedure TForm1.Timer1Timer(Sender: TObject);
var
LineSeries:TLineSeries;
I,J,data1:integer;
data:real;
flag:boolean;
begin
//产生随机数
flag:=false;
Randomize; //每次随机数不同
data1:=900+(random(1090-900)); //产生930到 1060之间的随机数
data:=data1/10;
if (zone<10000) then
begin
ok[zone]:=data;
zone:=zone+1;
end
else //走到头,图像左移
begin
zone:=10000;
ok[zone]:=data;
flag:=true;
end;
//chart1.Color:=ClRed;
chart1.BevelOuter:=BvNone;
chart1.Legend.Visible:=False;
LineSeries:=TLineSeries.Create(chart1);
LineSeries.ParentChart:=chart1;
LineSeries.ShowInLegend:=False;
LineSeries.Marks.Style:=Smsvalue;
LineSeries.SeriesColor:=ClRed;
Randomize;
chart1.SeriesList.Clear;
if (d<=200) then
begin
For I:=0 To 200 Do
LineSeries.AddXY(I,ok[9800+I]);
chart1.SeriesList.Add(LineSeries);
d:=d+1;
end
else
begin
For I:=0 To 200 Do
LineSeries.AddXY(ti+I,ok[9800+I]);
chart1.SeriesList.Add(LineSeries);
ti:=ti+1;
end;
if (flag=true) then
begin
for t:=1 to 10000 do //数组中数据向前传递
begin
ok[t-1]:=ok[t];
end;
end;
// zone:=zone+1;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Timer1.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
j:integer;
begin
// 初始化数组
for j:=0 to 10000 do
ok[j]:=100;
ti:=0;
d:=0; //计数到100移动
zone:=9800;;
end;
这个是我改过的代码,显示200个数据,从tchart组件最左边开始显示,移动到最右边后,图像整体开始往左移,新数据点从最右边进入。其实,我的核心问题是,能否只显示lineseries中的一部分,比如它还有10000个数据,只显示其中的200个。 展开
procedure TForm1.Timer1Timer(Sender: TObject);
var
LineSeries:TLineSeries;
I,J,data1:integer;
data:real;
flag:boolean;
begin
//产生随机数
flag:=false;
Randomize; //每次随机数不同
data1:=900+(random(1090-900)); //产生930到 1060之间的随机数
data:=data1/10;
if (zone<10000) then
begin
ok[zone]:=data;
zone:=zone+1;
end
else //走到头,图像左移
begin
zone:=10000;
ok[zone]:=data;
flag:=true;
end;
//chart1.Color:=ClRed;
chart1.BevelOuter:=BvNone;
chart1.Legend.Visible:=False;
LineSeries:=TLineSeries.Create(chart1);
LineSeries.ParentChart:=chart1;
LineSeries.ShowInLegend:=False;
LineSeries.Marks.Style:=Smsvalue;
LineSeries.SeriesColor:=ClRed;
Randomize;
chart1.SeriesList.Clear;
if (d<=200) then
begin
For I:=0 To 200 Do
LineSeries.AddXY(I,ok[9800+I]);
chart1.SeriesList.Add(LineSeries);
d:=d+1;
end
else
begin
For I:=0 To 200 Do
LineSeries.AddXY(ti+I,ok[9800+I]);
chart1.SeriesList.Add(LineSeries);
ti:=ti+1;
end;
if (flag=true) then
begin
for t:=1 to 10000 do //数组中数据向前传递
begin
ok[t-1]:=ok[t];
end;
end;
// zone:=zone+1;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Timer1.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
j:integer;
begin
// 初始化数组
for j:=0 to 10000 do
ok[j]:=100;
ti:=0;
d:=0; //计数到100移动
zone:=9800;;
end;
这个是我改过的代码,显示200个数据,从tchart组件最左边开始显示,移动到最右边后,图像整体开始往左移,新数据点从最右边进入。其实,我的核心问题是,能否只显示lineseries中的一部分,比如它还有10000个数据,只显示其中的200个。 展开
2个回答
展开全部
设置tchart的MaxPointsPerPage属性为200
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
东莞大凡
2024-08-07 广告
2024-08-07 广告
在东莞市大凡光学科技有限公司,我们利用Halcon软件处理机器视觉项目时,会用到自定义标定板以满足特定需求。Halcon支持用户根据实际应用场景自定义标定板形状与标记点。这不仅可以灵活应对不同工作环境,还能提高标定精度。通过调整圆点数量、间...
点击进入详情页
本回答由东莞大凡提供
展开全部
请问楼主有相关的Tchart例程或学习资料吗?我也有和您很相似的需求,想自己学习一下,如果有麻烦发送到我邮箱767657686@qq.com 谢谢你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询