现在使用TEECHART6.0画一时间/液面高度曲线.Y轴对应液面高度,X轴对应时间,已设定BottomAxis.format := 'hh:mm:ss' ;
并在设计模式将increment设为0:0:1 ;
现在通过addxy(time,level)来增加点,但是如何实现X轴自动移动啊?使用automatic好象不行.
不想使用setminmax().
有方法让控件自动调整X轴自动移动吗?
多谢.

解决方案 »

  1.   

    使用automatic,然后用代码调整使X轴移动。
    你可以参考我写的一个简单例子:
    http://www.rtgame.com/example2.rar
      

  2.   

    大致类似下面这样:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Chart1.Series[0].AddXY(Now, Random(100)+1);
      if Chart1.Series[0].Count > 6 then
        Chart1.Series[0].Delete(0);
    end;
    当X轴添加的数据多于6个时,使用Delete删除第一个,这样X轴上始终保持6个数据,看上去就是在自动移动了。
      

  3.   

    procedure TTFChart.Timer1Timer(Sender: TObject);
    var
      Amount:Double;
    begin
       self.Caption:='现在的温度是'+FloatToStr(roundto(Main.ValueT,-2))+'摄氏度';
       with Chart1 do               
       begin
       with Series[1] do
         AddY(75,'');
       with Series[0] do
       if Count>(10000/Timer1.Interval) then
       begin
         Delete(0);
         AddXY(i,Main.ValueT,'',clTeeColor);
         With Chart1.BottomAxis do
         begin
           Amount:=roundto(((Maximum-Minimum)/Count),-1);
           SetMinMax(Minimum+Amount,Maximum+Amount);
          end;
       end
       else
         AddXY(i,Main.ValueT,'',clTeeColor);
       end;
       MainForm.LedDisplay1.Number:=trunc(Main.ValueT/10);
       MainForm.LedDisplay2.Number:=trunc((Main.ValueT-trunc(Main.ValueT/10)*10));
       i := i + Timer1.Interval/1000;
    end;
      

  4.   

    谢谢二位的指点.
    叮叮当当:
    你好.试了你的这种方法,系统的资源占用率很低,但是有两个问题.
    1.当鼠标右键对曲线操作后(移动等),横轴不再自动移动;
    2.这种方式无法保留本日内所有点的信息.如10秒种采一次样,则一天有360*24个点,如果当前显示6个点,那么在这之前的所有信息全部被删除.而现在想保留,请问该如何处理.solokey(永远的菜鸟-研究TPersistent中):
    你好.看了您的程序,既然使用了DELETE(0),是不是就不用SetMinMax()了.
      

  5.   

    to xindijingying() :
    设计时,在chart-->axis-->scales--->inverted 选中即可.
      

  6.   

    to hongchao(love) ( ) :
      谢谢你~!
      不过这个复选框选中后是把Y坐标数值从升序改为降序而已;
      我是想实现当这个CHART不能容纳全部数值时,移动X轴(时间),把未显示的给显示出来。
      上面两位的解答能实现向时间轴(X轴)右移动的功能,那么向左移动的功能该如何实现?
      我自己试:
          Delete(count);
          AddXY(i,Main.ValueT,'',clTeeColor);
      但是AddXY()是在最后画的。
      

  7.   

    点已经画好了..那就设置Max Min的横坐标,就可以了...
      

  8.   

    TO: xindijingying
    hongchao(love) 说的没错,把X轴反过来应该能满足你的要求。
    你改的是Y轴,所以结果不对。
    右键点Chart1 -> Edit Chart... -> Axis -> Bottom -> Inverted至于 hongchao(love) 的问题,我还没有想出好的办法。
    其实我不常用TChart,但感觉这是一个很强大的控件,对于在动态显示当前数据的同时又要在图表上保存所有历史数据,一定是可以做到的,希望后来的高手指教。
      

  9.   

    谢谢二位如此热心.
       保存历史数据的方法,我原来采用这种方式:
    添加点:series[0].addxy(time,data) ;
    自动移动:设置一定时器,在事件中调用 chart1.bottomaxis.setminmax(time-1/100,time) ;
    这样可以实现同时保存历史数据及自动移动,但是随着时间的增加,系统资源(包括内存及CPU)大幅增加.采用叮叮当当的方法可以把系统的资源占用率降到最低,但是无法保存历史数据.
    该如何办啊.
      

  10.   

    没有人来关注?帮你顶一下。
    不知道你有没有考虑过这么办:这个TChart只显示最新采集到的数据,另弄个窗体,那里的TChart专门用来浏览历史数据。
    每次采集的数据都保存到数据库或是文件里,在浏览历史数据时取出在TChart上显示。
      

  11.   

    叮叮当当,多谢你的支持.
    你说的那种方法应当可行,但是那样的话客户觉得觉得有些麻烦.
    通过设置定时器,在定时器事件中调用 chart1.bottomaxis.setminmax(time-1/100,time) ;
    这样可以满足要求,但是长期运行后资源占用率太高.不可行.
      

  12.   

    其实偶本不想多说什么d.....
    如果你需要保存历史数据,把这些数据保存到硬盘上.可以是以Record File保存.你也可以添加文件头,比如数据的保存时间,图的精度,之类的东东.这样,以后用类似的程序,仍然可以打开.TeeChart可以分页显示的,这些需要几个底层的函数来支持,这些计算的函数,需要你自己写.根据TeeChart的MaxPointsPerPage来设置一页显示多少点.这些都需要自己来计算.也可以设置灵活点,让使用者来选择.只要改变这个属性就可以了.根据保存数据有多少个点,和一页显示多少个点,可以知道需要显示多少页,然后再根据这些数据,计算出当前页的数据区间范围,然后画点.不知道自己说清楚了没有..
      

  13.   

    我已经在TeeChart的chart--->paging--->PointsPerPage设置了600个点,
    我现在是按照叮叮当当的方法这样做的:
    Chart1.Series[0].AddXY(Now, Random(100)+1);
    if Chart1.Series[0].Count > 600 then
      Chart1.Series[0].Delete(0);
    这样可以实现系统资源占用率非常低,但是无法显示当前600个点之前的数据.
    使用setminmax()倒是可以实现保存历史数据,但是占用系统资源太大.您说的"根据保存数据有多少个点,和一页显示多少个点,可以知道需要显示多少页,然后再根据这些数据,计算出当前页的数据区间范围,然后画点.",能否说的更明白一些?
    多谢.
      

  14.   

    我已经在TeeChart的chart--->paging--->PointsPerPage设置了600个点,
    我现在是按照叮叮当当的方法这样做的:
    Chart1.Series[0].AddXY(Now, Random(100)+1);
    if Chart1.Series[0].Count > 600 then
      Chart1.Series[0].Delete(0);
    这样可以实现系统资源占用率非常低,但是无法显示当前600个点之前的数据.
    使用setminmax()倒是可以实现保存历史数据,但是占用系统资源太大.您说的"根据保存数据有多少个点,和一页显示多少个点,可以知道需要显示多少页,然后再根据这些数据,计算出当前页的数据区间范围,然后画点.",能否说的更明白一些?
    多谢.