大家知道,用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 测试通过。