为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 11.3 测试通过。

相关推荐
Dovis(誓平步青云)9 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码11 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓16 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc12316 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium