如何在循环中同时显示图像

时间:2019-10-08 18:59:45

标签: delphi

我是Delphi的新手,仍然在学习。

我有一个程序将图像作为输入,并使用循环使图像向下移动到某些像素,在此过程中,我想显示图像。 我尝试使用“ Timer.Interval”方法在两次间隔之间显示图像,但是我确定自己做错了。 有办法解决吗?如果没有,那么我对在进行某些迭代时如何同时显示图像的任何其他建议都持开放态度。

谢谢。

procedure BlockSpawn(var Image1: TImage; var Timer1: TTimer);
begin
    Timer1.Enabled := True;
    WITH Image1 do begin
         repeat
               Timer1.Interval := 600;
               Top := Top + 66;
               Image1.Show;
         until (Top = (TForm1.Bottom - Height)); {repeat}
    end; {WITH}
end; {begin}

其背后的原因是,我需要在每次迭代中多次运行此过程,并且需要用户查看同时显示给他们的图像。 就像在俄罗斯方块中一样,新块将始终从相同位置向下移动并不断重复直到发生特定事件。

1 个答案:

答案 0 :(得分:3)

处理此问题的正确方法是使用TTimer.OnTimer事件,例如:

procedure BlockSpawn(Image: TImage; Timer: TTimer);
begin
  Timer.Tag := NativeInt(Image);
  Timer.Interval := 600;
  Timer.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Image: TImage;
begin
  Image := TImage(Timer1.Tag);
  Image.Top := Image.Top + 66;
  Image.Show;
  if Image.Top >= (Bottom - Image.Height) then
    Timer1.Enabled := False;
end;

但是请注意,这种方法使BlockSpawn()异步运行 。如果您确实希望BlockSpawn()同步运行 ,请摆脱TTimer并改用Sleep()

procedure BlockSpawn(Image: TImage);
begin
  repeat
    Sleep(600);
    Image1.Top := Image1.Top + 66;
    Image1.Show;
    Form1.Update;
  until Image1.Top >= (Form1.Bottom - Image1.Height);
end;

但是,这种方法可能会使您的UI显得呆滞,并且对用户的响应较慢。