首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Win10上的TDialogService.ShowMessage不阻塞

Win10上的TDialogService.ShowMessage不阻塞
EN

Stack Overflow用户
提问于 2021-02-16 02:03:29
回答 1查看 143关注 0票数 2

在我的Delphi10.4FMX程序中,我使用下面的代码要求用户输入一个新的文件名

代码语言:javascript
运行
复制
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对话框时,我可以对底层窗体做任何我想做的事情。

谢谢你在这方面的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 06:40:43

这可能不是解决我发现的bug的最好方法,但以下是我所做的,以防其他人遇到这个问题。

我在表单中添加了一个计时器,将时间间隔设置为200,并将其禁用。

对于任何TDialogServices.MessageDialog和TDialogServices.InputQuery回调例程,其中回调例程也调用MessageDialog或ShowMessage,我将回调逻辑移到新例程中。然后我更改了回调例程,以设置一个表单变量来指示调用了哪个回调例程,根据需要保存回调例程中的相关信息,然后启用计时器。

在计时器事件中,我首先禁用计时器,然后根据表单变量调用新的例程。

这现在允许在Win10上阻塞原始对话框和回调例程中所需的对话框。此外,Android、OSX和IOS似乎仍然可以正常工作,正如我在问题中所解释的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66213140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档