TDialogService.ShowMessage 在 Win10 上不阻塞
TDialogService.ShowMessage not blocking on Win10
在我的 Delphi 10.4 FMX 程序中,我要求用户使用以下代码输入新文件名
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 对话框在回调事件中使用时是可见的。
感谢您对此的任何帮助。
这可能不是解决我发现的错误的最佳方法,但这是我在其他人遇到此问题时所做的。
我在表单中添加了一个计时器,将间隔设置为 200 并禁用了它。
对于回调例程也调用 MessageDialog 或 ShowMessage 的任何 TDialogServices.MessageDialog 和 TDialogServices.InputQuery 回调例程,我将回调逻辑移到了新例程中。然后我更改了回调例程以设置一个表单变量来指示调用了哪个回调例程,根据需要从回调例程中保存相关信息,然后启用计时器。
在定时器事件中,我先禁用定时器,然后根据表单变量调用新例程。
这现在允许原始对话框和回调例程中所需的对话框在 Win10 上被阻止。此外,Android、OSX 和 IOS 似乎仍能正常工作,正如我在问题中所解释的那样。
在我的 Delphi 10.4 FMX 程序中,我要求用户使用以下代码输入新文件名
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 对话框在回调事件中使用时是可见的。
感谢您对此的任何帮助。
这可能不是解决我发现的错误的最佳方法,但这是我在其他人遇到此问题时所做的。
我在表单中添加了一个计时器,将间隔设置为 200 并禁用了它。
对于回调例程也调用 MessageDialog 或 ShowMessage 的任何 TDialogServices.MessageDialog 和 TDialogServices.InputQuery 回调例程,我将回调逻辑移到了新例程中。然后我更改了回调例程以设置一个表单变量来指示调用了哪个回调例程,根据需要从回调例程中保存相关信息,然后启用计时器。
在定时器事件中,我先禁用定时器,然后根据表单变量调用新例程。
这现在允许原始对话框和回调例程中所需的对话框在 Win10 上被阻止。此外,Android、OSX 和 IOS 似乎仍能正常工作,正如我在问题中所解释的那样。