• 为Android做一个ShowModal窗口


    大家知道,用Delphi实现一个Form,并用ShowModal显示出来,在Android平台是非阻塞的,即执行了Form.ShowModal,代码会继续往下执行而不是等待,这跟在Windows平台是完全不一样的。如果我们需要类似阻塞的效果,该如何实现呢?

    1.先建一个Form,跟通常的情况一样。

    2.为Form实现具体的内容,这按你的需要了。

    3.在窗口的单元中实现一个方法,用来显示这个窗口:

    procedure ShowPrivacyForm(AFormResult: TProc<TModalResult>);
    implementation
    {$R *.fmx} //调用方法: // ShowPrivacyForm( // procedure(AResult: TModalResult) // begin // // end); var PrivacyForm: TPrivacyForm;//声明一个私有变量 procedure ShowPrivacyForm(AFormResult: TProc<TModalResult>); begin if not assigned(PrivacyForm) then begin PrivacyForm := TPrivacyForm.Create(Application); end; PrivacyForm.ShowModal( procedure(AResult: TModalResult) begin AFormResult(AResult);//这里执行回调 TTask.Run( procedure begin TThread.Synchronize(nil, procedure begin PrivacyForm.DisposeOf;//释放这个窗口 PrivacyForm := nil; end); end); end); end;

    4.显示这个窗口,首先引用Form所在的单元,然后调用显示窗口的方法ShowPrivacyForm:

            ShowPrivacyForm(
                            procedure(AResult: TModalResult)
                            begin
                               if AResult=mrCancel then
                               begin
                                   Close;
                               end
                               else
                               begin
                                   //用户点击了确定接钮 
                               end;
                            end);

    5.细节处理,接管Android手机的返回键,当用户按返回键,相当于点击取消操作:

    procedure TPrivacyForm.FormKeyUp(Sender: TObject; var Key: Word;
        var KeyChar: Char; Shift: TShiftState);
    begin
      if Key = vkHardwareBack then
           self.ModalResult := mrCancel;
    end;

    6.注意的一个小坑,看下面的代码:

    procedure TPrivacyForm.CCButton1Click(Sender: TObject);
    begin
      self.ModalResult := mrOk; //这句直接关闭窗口,不用再执行Close方法
    // Close;
    end;

    原来我执行了Close,发现窗口返回的值为mrCancel。在Windows平台跟踪发现原来是Close执行后的结果,把这行注释掉,执行正常,原来Self.ModalResult:=mrOK这一句会自动关闭窗口,下面的Close是多余的了。

    好了,一个完美的ShowModal窗口实现了!

    核心代码引用专家的ChinaCock组件包中的Demo,这里表示感谢!

    Delphi 10.4.2测试通过。

  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    Winform 自定义程序安装向导(可用于数据库升级等)
    Winform 数据库连接配置界面
    SQLServer禁用、启用外键约束
    sp_MSforeachtable使用方法
    【.NET】使用HtmlAgilityPack抓取网页数据
    SQL:bat批处理多个.sql文件
    C#:数据库通用访问类 SqlHelper
    C#:最简洁强大的代码生成器
    SQL 分组后拼接字符串
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/14878503.html
Copyright © 2020-2023  润新知