Как добавить onFini sh evant в TAnimate в Firemonkey - PullRequest
1 голос
/ 26 апреля 2020

У меня есть код в Delphi 10.3.3:

 MainForm.Circle1.AnimateInt('Height', 150, 0.5, TAnimationType.InOut,
    TInterpolationType.Linear);

Как добавить для этой анимации OnFini sh событие, подобное ShowMessage ('Fini sh')

1 Ответ

4 голосов
/ 27 апреля 2020

Методы FMX.Controls.TControl Animate... устарели и не должны использоваться. Вместо этого вы должны использовать Animate... методы FMX.Ani.TAnimator , например:

FMX.Ani.TAnimator.AnimateInt(Circle1, Height, 150, 0.5, TAnimationType.InOut, TInterpolationType.Linear);

Но для добавления события OnFinish() вам нужно использовать другой подход, либо (A) объявив анимацию в конструкторе или (B) создав ее в коде.

(A) Объявление анимации в конструкторе

В этом примере мы создаем анимацию для свойства Height объекта Circle1: TCircle в нашей форме.

Выберите объект. В Object Inspector (OI) найдите свойство Height и выберите его. Обратите внимание, что в столбце значений есть символ диафильма. Это означает, что вы можете оживить это. Обратите внимание, что в поле значения есть выпадающая стрелка. Щелкните по нему и выберите Create new TFloatAnimation в раскрывающемся меню.

На панели структуры вы можете видеть, что Circle1 теперь имеет дочерний объект с именем FloatAnimation1. Он должен быть выбран, но если нет, выберите его. В OI теперь вы можете увидеть все опубликованные свойства для анимации, и если вы измените OI для отображения событий, вы найдете настройки для двух событий, OnFinish и OnProcess. Двойной щелчок создает события для вас, как обычно.

(B) Создайте анимацию в коде

  1. Объявите объект анимации в частном разделе вашего form, а также один или два обработчика событий для OnProcess и / или OnFinish. Они должны соответствовать TNotifyEvent (то есть иметь один параметр Sender: TObject)
    private
      ...
      Anim: TFloatAnimation;
      procedure AnimProcess(Sender: TObject);
      procedure AnimFinish(Sender: TObject);
В событии OnCreate формы (например, TForm1.FormCreate()) создайте объект Anim и установите его свойства по мере необходимости, например,
    Anim:= TFloatAnimation.Create(Self);
    Anim.OnProcess := AnimProcess;
    Anim.OnFinish := AnimFinish;
    Anim.Duration := 0.9;
    Anim.StartValue := 41;
    Anim.StopValue := 150;
    Anim.Parent := Circle1; // The object that the animation will affect must be the parent
    Anim.PropertyName := 'Height';

В обоих случаях запишите событие обработчики по мере необходимости, например

procedure TForm2.AnimFinish(Sender: TObject);
begin
  Memo1.Lines.Add('Animation finished');
end;
...