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

相关推荐
xiangpanf2 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx5 小时前
安卓线程相关
android
消失的旧时光-19435 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon6 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon6 小时前
VSYNC 信号完整流程2
android
dalancon6 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013847 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android8 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才8 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶9 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle