2017-08-23 28 views
2

我有以下的Delphi代码来显示Android上的模式消息,它在10.1柏林工作正常,但停止在Delphi 10.2.1东京工作。此过程现在挂起Android应用程序。使用Delphi 10.2.1的Modal Android对话框东京

procedure customShowMessage(AMessage: string); 
//good idea to have our own procedure that we can tweak, as even for VCL and windows, we have done show message differently over the years due to all sorts of funny problems 
var 
    LModalWindowOpen: boolean; 
begin 
    LModalWindowOpen := true; 

    TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0, 
     procedure(const AResult: TModalResult) 
     begin 
      LModalWindowOpen := false; 
     end); 

    while LModalWindowOpen do 
    begin 
     Application.ProcessMessages; //since 10.2 Tokyo, popup never shows and this loops forever 
    end; 
end; 

我怀疑它可能与东京的变化有关,应用程序如何在主线程中运行。不知道我可以用什么替换Application.ProcessMessages,让对话框显示,以便用户可以点击某些东西。

我有很多地方这是使用,所以改变它使用回调工作将是很多工作,并重组。

+1

'Application.ProcessMessages()'在Android上在东京被打破了(还有很多其他的事情 - 你是否安装了最新的Update?)。此外,Android上不支持模式对话框。英巴卡迪诺的文件说的很多。自XE5以来FMX已经支持异步对话框来解决这个问题。您需要重写此代码以异步工作。摆脱'ProcessMessages'循环,让对话在关闭时通知你。不要阻止调用线程等待对话框关闭。这是处理这个问题的正确方法。你不应该在你的设计中忽略这个。 –

+0

谢谢雷米,我仔细检查了更新。目前可用的修补程序适用于东京10.2。我使用了东京10.2更新的最新安装程序。看起来像长期的解决方案将改为使用回调。 – Maya

回答

0

我认为下面的代码应该工作:

function ShowMessageOKCancel(AMessage: String): String; 
var 
    lResultStr: String; 
begin 
    lResultStr:=''; 
    TDialogService.PreferredMode:=TDialogService.TPreferredMode.Platform; 
    TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation, 
    FMX.Dialogs.mbOKCancel, TMsgDlgBtn.mbOK, 0, 
    procedure(const AResult: TModalResult) 
    begin 
     case AResult of 
     mrOK: lResultStr:='O'; 
     mrCancel: lResultStr:='C'; 
     end; 
    end); 

    Result:=lResultStr; 
end; 

当你调用这个函数,它应该表现出你的消息的对话框和两个按钮确定和取消。返回值将指示哪个按钮被点击。

+1

不,那不行。该对话框是异步的,所以“'Result:= lResultStr;”在对话框显示之前被调用。此外,该函数之外的任何后续代码都会继续执行,只有在所有内容都执行完毕后才在对话框右侧显示对话框。 – Maya

+0

“TDialogService.PreferredMode:=”可以设置为“同步”,但适用于Android以外的任何其他操作系统。 – Maya

0

在Android上,我们只有异步对话框。如果我们想要它们作为模态对话框,我们必须自己做。

ProcessMessage循环的解决方案是一个想法,但我不认为这是最好的方法。

另一种方法是在显示对话框之前在窗体上添加一个透明(或不透明)的布局(或矩形),然后在您有答案时,可以删除封锁布局。

您也可以使用Andrea Magni的TFrameStand(可直接从GetIt下载)如何建议使用TFrame作为对话框。 https://github.com/andrea-magni/TFrameStand