как показать изображение одновременно внутри цикла - PullRequest
1 голос
/ 08 октября 2019

Я очень новичок в 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 Ответ

3 голосов
/ 08 октября 2019

правильный способ справиться с этим - использовать событие 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;

Однако этот подход, скорее всего, заставит ваш интерфейс чувствоватьвяло и быть менее отзывчивым к своим пользователям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...