我在一个panel中放了一个image1,panel的长度为500,image1的长度1000
我用timer1(100ms)定时在image1上画出曲线,用timer2(600ms)定时控制image1向左移。
当image1画布用完以后,我动态生成新的画布image2,将曲线在image2 上接着画。我应该写什么样的代码实现画布的切换呢?
我的画图函数是DrawCurve(num:integer,aimage:Timage);
画布是image1时写为DrawCurve(count,image1);
那么经过一段时间image1用完后产生image2,我写image1:=image2;这样可以吗? 

解决方案 »

  1.   

    你既然要动态生成,那Image1用完之后就应该要销毁,你又不销毁就直接image1:=image2,这个看起来是不太负责任的
      

  2.   

    我的image1用完以后当它左移超出panel看不到后才能销毁。
    这个我可以用另一个image来代替,改成interiamge:=image2;能不能告诉我interimage:=image2实现的是什么?是把所有image2中画出的曲线都给了interimage吗?我左移image2也就相当于左移interimage吗?
      

  3.   

    能不能告诉我interimage:=image2实现的是什么?
    现实的是将Image2指向的内存块的地址传给interimage,这样做可不好,因为,interimage原来类得不到释放。
    应该是
    InterImage.Picture.bitmap.assign(Imgae2.picture.bitmap);
    Image2和interimage必须都是创建了的
      

  4.   

    不知道是什么目的,是做心电图?呵呵。
    你可以这样,先创建两个IMAGE,两个IMAGE都是宽度500,然后把IMAGE1,IMAGE2左右连续排列,并不停的向左走,当IMAGE1完全超出PANEL的范围了,把他上面的曲线去掉,放在IMAGE2的右边,接着IMAGE2排列,然后继续,等IMAGE2完全超出范围后,在把他上的曲线去掉,放在IMAGE1的又边,连续排列,依次类推。这只是思路,具体方法自己实现。如果有困难,指出在解决。
      

  5.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      counter:=counter+1;
      a:=a+1;
    if a=55 then        
    begin
       timer2.Enabled:=true;  //此时启动定时器2曲线开始左移
    end;
    if counter=110 then     //旧画布用完
    begin
      counter:=0;          //counter重新计数 
     //产生新画布 
      nextimage:=Timage.Create(nil);
      nextimage.Parent:=Panel2;
      nextimage.Width:=1100;
      nextimage.Height:=200;
      nextimage.Left:=currentimage.Left+currentimage.Width;
      //将已画完的旧画布给previewimage
      previewimage:=currentimage;
      previewimage.Width:= currentimage.Width ;
      previewimage.Left:=currentimage.Left;
      previewimage.Height:=currentimage.Height;
      //将新产生的画布给currentimage
      currentimage:=nextimage;
      currentimage.Width:= nextimage.Width;
      currentimage.Left:=nextimage.Left;
      currentimage.Height:=nextimage.Height;
      DrawCurve(counter,currentimage);     //画曲线的函数
    end;
    //定时器2
    procedure TForm1.Timer2Timer(Sender: TObject);
    begin
       previewimage.Left:=previewimage.Left-50;
       currentimage.Left:=currentimage.Left-50;
    end;
    能帮我看一看这些代码吗,我想用它们实现画布相接,但是当定时器设置比例不好时,就会出问题,比方说timer2时间设置的过长或者过短。
      

  6.   

    谢谢大家!
    To:capoatguitar
    我是要做一个负载率分析曲线,数据是随机的,不知道有多少,所以画布也要动态产生。
    我的思路是当当前画布currentimage用完时,即counter=110,在它的后面产生一个新画布nextimage,然后将currentimage变成previewimage,nextimage变成currentimage,这样DrawCurve中的画布就可以保持为当前要画曲线的画布。
    timer2控制previewimage和crrentimage不断向左移。也就实现曲线向左移。
      

  7.   

    假如你的分析曲线画完了,还要把整章IMAGE拿出来看吗??
      

  8.   

    现在就是用我上面的代码将timer1时间设为100ms,timer2设为600ms时曲线没有问题,可是如果我把timer2设成800ms那么曲线在移动时就有一段时间停下来了,不知道什么原因。
    曲线我想可以用滚动条,根据当前的位置往前看到一部分,不需要看到全部。
      

  9.   

    我总觉得,你这样画,超出屏幕的部分的曲线就再也看不见了,等于白画。
    你把画曲线的函数和移动的函数都放在TIMER2里。
    不知道有没有TIMER2.ENABLED:=FALSE的字样?
      

  10.   

    那怎么样才能够可以看到以前的曲线呢?我现在想是不是要先在一个隐形画布里画,然后复制到image上?都在一个定时器里又画曲线又移动的话,这样我的思路感觉很乱,还请高手指教啊
      

  11.   

    我觉得你用两个,就是希望曲线能从右向左移动,新的曲线出现在右边。比如说你有一个数据
    DataArray[0..9],记录的你曲线的Y轴值。1、从DataArray[0] 画到 DataArray[9],
    2、接收到一个新的数据,赋值给 newData 
    3、你把先画的曲线擦掉
    4、然后把数组的值移动一次,即
      for i:=1 to 8
        DataArray[0] := DataArray[i];
      接着把得到的新数据赋给DataArray[9],即 DataArray[9] :=newDat重复1-4,这样你的曲线也能从右向左移动。