在我的Delphi10.4FMX程序中,我使用下面的代码要求用户输入一个新的文件名
procedure TForm6.btnBlockingClick(Sender: TObject);
begin
//In Win10, this blocks form access when ShowMessage is called
NameCallBack(mrOk, ['name']);
end;
procedure TForm6.btnNonBlockingClick(Sender: TObject);
begin
//In Win10, this does not block form access when ShowMessage is called in the NameCallBack routine.
TDialogService.InputQuery('Enter name', ['Name'], [''], NameCallBack);
end;
procedure TForm6.NameCallBack(const AResult: TModalResult; const AValues: array of string);
begin
if aResult = mrOK then
TDialogService.ShowMessage('Ok pressed')
else
TDialogService.ShowMessage('Cancel pressed');
end;
当NameCallBack被用作InputQuery的回调事件时,你知道为什么ShowMessage没有阻塞吗?在Win10中,在这种类型的回调例程中向用户显示消息的最佳方式是什么,这种回调例程可以防止用户访问底层表单,直到以某种方式关闭对话框。
仅供参考:如果在回调例程中使用MessageDialog而不是ShowMessage来允许用户交互,也会发生同样的事情。
注意:此逻辑在OSX和IOS中工作,两个对话框都被阻塞。在Android上,这两个对话框都没有阻塞,但不是问题,因为触摸任何地方,除了对话框关闭对话框,并需要第二次触摸与底层窗体再次交互。在Win10上,当在回调事件中使用ShowMessage对话框时,我可以对底层窗体做任何我想做的事情。
谢谢你在这方面的帮助。
发布于 2021-02-17 06:40:43
这可能不是解决我发现的bug的最好方法,但以下是我所做的,以防其他人遇到这个问题。
我在表单中添加了一个计时器,将时间间隔设置为200,并将其禁用。
对于任何TDialogServices.MessageDialog和TDialogServices.InputQuery回调例程,其中回调例程也调用MessageDialog或ShowMessage,我将回调逻辑移到新例程中。然后我更改了回调例程,以设置一个表单变量来指示调用了哪个回调例程,根据需要保存回调例程中的相关信息,然后启用计时器。
在计时器事件中,我首先禁用计时器,然后根据表单变量调用新的例程。
这现在允许在Win10上阻塞原始对话框和回调例程中所需的对话框。此外,Android、OSX和IOS似乎仍然可以正常工作,正如我在问题中所解释的那样。
https://stackoverflow.com/questions/66213140
复制相似问题