标题:请教TCHART绘图的问题
只看楼主
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
结帖率:94.74%
已结贴  问题点数:90 回复次数:7 
请教TCHART绘图的问题
   正在学DELPHI绘图,看了TCHART的控件属性。一头雾水,不知如何画,网上搜索了一下,原作只有一两个,并且编译不能通过,其余都是抄来转载的,连符号都错了,本站内搜索,有几个人提问,从未有人给解答。好迷茫。有谁能赐教一下?
   我现在通过运算得到了三个数组arr1[1..100],arr2[1..100],arr3[1..100] 都是DOUBLE类型的。想以此为纵坐标,1......100为横坐标,画fastline 。不知怎样将数组数据和series关联或传递过去。特此请教。只用DELPHI自带的TCHART 控件。
鱼兄,能否帮忙?等你。


[ 本帖最后由 yalewang 于 2010-7-18 13:33 编辑 ]
搜索更多相关主题的帖子: 绘图 TCHART 
2010-07-18 13:31
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
得分:0 
我在等啊,没人回答?
2010-07-19 18:54
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:90 
Number: Integer;
procedure TForm1.FormShow(Sender: TObject);
begin
  cht1.BottomAxis.Automatic:= False;     //cht1: TChart  设置属性
  cht1.BottomAxis.Maximum   :=   100;
  cht1.BottomAxis.Minimum   :=   0;
  cht1.LeftAxis.Automatic := False;
  cht1.LeftAxis.Maximum := 100.0;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
 Inc(Number);
 fstlnsrsSeries1.Add(random(100));  //fstlnsrsSeries1:TFastLineSeries 添加显示数据。现在用的随机数。
 fstlnsrsSeries2.Add(random(100));
 fstlnsrsSeries3.Add(random(100));
 if  Number > 100 then
 begin
  cht1.BottomAxis.Maximum   :=   Number;
  cht1.BottomAxis.Minimum   :=   Number - 100;
 end;
end;
end.
一个实时数采显示例子。
编译好的例子:
Project1.rar (278 KB)



[ 本帖最后由 东海一鱼 于 2010-7-19 19:02 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-19 18:56
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
得分:0 
多谢鱼兄。
fstlnsrsSeries1:TFastLineSeries;
fstlnsrsSeries2:TFastLineSeries ;
fstlnsrsSeries3:TFastLineSeries ;
TFastLineSeries在哪里声明呀?我在uses 里加了series.不管用

fstlnsrsSeries1.Add(random(100));
fstlnsrsSeries2.Add(random(100));
fstlnsrsSeries3.Add(random(100));
我的困惑是怎样将已有数据的数组arr1[1..100]、arr2[1..100]、arr3[1..100]中的数据加进去。
2010-07-20 14:35
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
TFastLineSeries是TChart对象的数据管理对象链表,它是TChart的一个属性名为:SeriesList。你可以点击这个属性进行编辑。

fstlnsrsSeries1.Add(random(100)); 就是把一个随机数加入SeriesList的数据链中。

要加入一个数组可以用fstlnsrsSeries1.AddArray(X); //X: array of double;

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-20 19:27
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
得分:0 
现在可以运行了,我又调整了一下。有几个问题想解决。
1、用random生成随机数,并且用TIMER触发执行时,下一事件过程画线时,上次画的线还存在,一会就满了,怎解决?我用refresh,没效果。
2、图表右边的序列是什麽属性,本来只添加三条线,运行时,一直自动加,为何?
   能否去掉该列?
3、能否这样理解,series1在计算上是一组数,在图表上是一条线?
谢谢

procedure TForm1.FormShow(Sender: TObject);
begin
  //cht1.BottomAxis.Automatic:= False;     
  //cht1.BottomAxis.Maximum   :=   100;
  //cht1.BottomAxis.Minimum   :=   0;
  //cht1.LeftAxis.Automatic := False;
  //cht1.LeftAxis.Maximum := 100.0;
end;

procedure TForm1.Tmr1Timer(Sender: TObject);
  var
  //fstlnsrsSeries1:TFastLineSeries;
  //fstlnsrsSeries2:TFastLineSeries;
  //fstlnsrsSeries3:TFastLineSeries;
  i:integer;
begin
//Inc(Number);
randomize;
fstlnsrsSeries1 := TFastLineSeries.Create(Cht1);
fstlnsrsSeries2 := TFastLineSeries.Create(Cht1);
fstlnsrsSeries3 := TFastLineSeries.Create(Cht1);
Cht1.AddSeries(fstlnsrsSeries1);
Cht1.AddSeries(fstlnsrsSeries2);
Cht1.AddSeries(fstlnsrsSeries3);
for i:=1 to 100 do
begin
fstlnsrsSeries1.Addxy(i,2*i,'',clred);
fstlnsrsSeries2.Addxy(random(100),random(100),'',clblack);
fstlnsrsSeries3.Addxy(i,2*i+3,'',clgreen);
end;
{if  Number > 100 then
begin
  cht1.BottomAxis.Maximum   :=   Number;
  cht1.BottomAxis.Minimum   :=   Number - 100;
end;
 }
end;
end.

[ 本帖最后由 yalewang 于 2010-7-21 01:21 编辑 ]
2010-07-21 01:19
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
得分:0 
另外,用上述方法画图,速度很慢,还不如vb自带的方法快。CPU占用率高达57%。
有没有办法解决?
2010-07-21 08:35
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
1、用random生成随机数,并且用TIMER触发执行时,下一事件过程画线时,上次画的线还存在,一会就满了,怎解决?我用refresh,没效果。   
2、图表右边的序列是什麽属性,本来只添加三条线,运行时,一直自动加,为何?
   能否去掉该列?
3、能否这样理解,series1在计算上是一组数,在图表上是一条线?
------------------------------------------------------------------------------------------------
你这三个问题是相互关联的,首先说第二个问题。图表右边的序列就是你添加的series。series就是TChart用来组织、管理显示数据的
一种链表结构(这里已经把3也回答了,是的它是绘图数据,就表示图像上的一条线)。至于为何一直添加??那是你让它添加的啊。
fstlnsrsSeries1 := TFastLineSeries.Create(Cht1);
fstlnsrsSeries2 := TFastLineSeries.Create(Cht1);
fstlnsrsSeries3 := TFastLineSeries.Create(Cht1);
Cht1.AddSeries(fstlnsrsSeries1);
Cht1.AddSeries(fstlnsrsSeries2);
Cht1.AddSeries(fstlnsrsSeries3);
你在每个时间周期内都产生新的3个series对象并加入到TChart中。这就是问题所在,series应该在窗体初始化时就根据需要添加完毕。
然后在每个时间周期内只添加数据就行了。

说到这里,你也应该明白第一个问题的原因了。就是原来的图形还没绘制完成。你又添加新的series“数据通道了”(这个名词不确切,但比较易理解)。

关于绘图效率和CPU占用问题,你运行我的编译好的例子就知道了(还是你的使用方法有问题)。


[ 本帖最后由 东海一鱼 于 2010-7-21 10:33 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-21 10:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-313322-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073941 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved