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

相关推荐
金融RPA机器人丨实在智能1 分钟前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿2 分钟前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc31 分钟前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106321 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
vistaup1 小时前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp
常利兵1 小时前
ButterKnife在Android 35 + Gradle 8.+环境下的适配困境与现代化迁移指南
android
撩得Android一次心动1 小时前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
熊猫钓鱼>_>2 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
Rainman博12 小时前
WMS-窗口relayout&FinishDrawing
android