红鱼儿

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

为TAnimation增加回调支持

TAnimation有一个动画结束事件,当动画完成后触发这个事件,但是没有提供回调支持,就是在Start一个动画时,就指定动画完成后调用的方法,以取代OnFinish事件。查看QC,有人早在10.2.3就提到了这个需求:

https://quality.embarcadero.com/browse/RSP-20802

遗憾的是,直到现在的Delphi 11.1版本也没有实现,也许是官方觉得不重要吧,不得矣,自己加了一下。

如果你有QC账号,一起去投个票,督促官方解决。

//为TAnimation重载一个Start方法:

//++++++++++ by 红鱼儿
procedure Start(AFinishCallback:TFinishCallback);overload;
//++++++++++ by 红鱼儿

代码实现:

//++++++++++ by 红鱼儿
procedure TAnimation.Start(AFinishCallback: TFinishCallback);
begin
  FFinishCallback:=AFinishCallback;
  Start;
end;
//++++++++++ by 红鱼儿

再修改DoFinish方法:

复制代码
procedure TAnimation.DoFinish;
begin
 //++++++++++ by 红鱼儿
  if Assigned(FFinishCallback) then
     FFinishCallback(Self)
  else
 //++++++++++ by 红鱼儿
  if Assigned(FOnFinish) then
    FOnFinish(Self);
end;
复制代码

OK,现在调用一下:

复制代码
procedure TCameraForm.PlayFormAnimationOut;
var
  fa: TFloatAnimation;
begin
  fa := Self.FindComponent('FloatAnimation2_') as TFloatAnimation;
  if fa <> nil then
  begin
    fa.Start(procedure(Sender:TObject)//使用回调函数来处理动画完成后的动作
             begin
                 Close;
             end);
  end
end;
复制代码

上面这段代码,fa.Start启动动画时就指定了完成需要执行的动作,这样,我就不用去用事件来处理了。

万事大吉!

需要代码的同学可以联系我,免得自己再改了。

后记:

盒子上的emailx45告诉我更好的方法,不用修改源码,通过继承实现的方案,直接上代码,测试通过。

复制代码
  TFloatAnimation = class(FMX.Ani.TFloatAnimation)
  private type
    TFinishCallback = TProc<TObject>;
  private
    FFinishCallback:TFinishCallback;
  protected
    procedure DoFinish; override;
  public
    procedure Start(FinishCallback:TFinishCallback=nil);reintroduce;
  end;

{ TFloatAnimation }

procedure TFloatAnimation.DoFinish;
begin
  inherited;

  if Assigned(FFinishCallback) then
     FFinishCallback(Self);

end;

procedure TFloatAnimation.Start(FinishCallback: TFinishCallback);
begin

  FFinishCallback:=FinishCallback;
  inherited Start;

end;
复制代码

 

posted on   红鱼儿  阅读(224)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-04-27 从http header中取得签名参数
点击右上角即可分享
微信分享提示