我在一个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;这样可以吗?
我用timer1(100ms)定时在image1上画出曲线,用timer2(600ms)定时控制image1向左移。
当image1画布用完以后,我动态生成新的画布image2,将曲线在image2 上接着画。我应该写什么样的代码实现画布的切换呢?
我的画图函数是DrawCurve(num:integer,aimage:Timage);
画布是image1时写为DrawCurve(count,image1);
那么经过一段时间image1用完后产生image2,我写image1:=image2;这样可以吗?
这个我可以用另一个image来代替,改成interiamge:=image2;能不能告诉我interimage:=image2实现的是什么?是把所有image2中画出的曲线都给了interimage吗?我左移image2也就相当于左移interimage吗?
现实的是将Image2指向的内存块的地址传给interimage,这样做可不好,因为,interimage原来类得不到释放。
应该是
InterImage.Picture.bitmap.assign(Imgae2.picture.bitmap);
Image2和interimage必须都是创建了的
你可以这样,先创建两个IMAGE,两个IMAGE都是宽度500,然后把IMAGE1,IMAGE2左右连续排列,并不停的向左走,当IMAGE1完全超出PANEL的范围了,把他上面的曲线去掉,放在IMAGE2的右边,接着IMAGE2排列,然后继续,等IMAGE2完全超出范围后,在把他上的曲线去掉,放在IMAGE1的又边,连续排列,依次类推。这只是思路,具体方法自己实现。如果有困难,指出在解决。
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时间设置的过长或者过短。
To:capoatguitar
我是要做一个负载率分析曲线,数据是随机的,不知道有多少,所以画布也要动态产生。
我的思路是当当前画布currentimage用完时,即counter=110,在它的后面产生一个新画布nextimage,然后将currentimage变成previewimage,nextimage变成currentimage,这样DrawCurve中的画布就可以保持为当前要画曲线的画布。
timer2控制previewimage和crrentimage不断向左移。也就实现曲线向左移。
曲线我想可以用滚动条,根据当前的位置往前看到一部分,不需要看到全部。
你把画曲线的函数和移动的函数都放在TIMER2里。
不知道有没有TIMER2.ENABLED:=FALSE的字样?
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,这样你的曲线也能从右向左移动。