Delphi XE7 Android 中的 Messagedlg

3

我只是想执行Delphi xe7安装过程中提供的样例,它是针对安卓平台的MessageAlerts,但不幸的是它无法工作,会出现以下错误信息:

此平台未实现阻止对话框

procedure TMessageAlertsForm.btnMultiButtonAlertClick(Sender: TObject);
begin
  { Show a multiple-button alert that triggers different code blocks according to
    your input }
  case MessageDlg('Choose a button:', System.UITypes.TMsgDlgType.mtInformation,
    [
      System.UITypes.TMsgDlgBtn.mbYes,
      System.UITypes.TMsgDlgBtn.mbNo,
      System.UITypes.TMsgDlgBtn.mbCancel
    ], 0) of
    { Detect which button was pushed and show a different message }
    mrYES:
      ShowMessage('You chose Yes');
    mrNo:
      ShowMessage('You chose No');
    mrCancel:
      ShowMessage('You chose Cancel');
  end;
end;

有什么想法如何解决它?

2
你应该始终将通用的 [tag:delphi] 标签添加到与 Delphi 相关的问题中,以获得正确的语法高亮和更多的关注。 - Sir Rufo
1个回答

21

这在XE7发行说明中有解释:

对话框方法支持匿名方法处理它们的关闭

在XE6中,对话框方法(InputBox、InputQuery、MessageDlg、ShowMessage)的调用始终是阻塞的。在这些方法的调用后面的任何代码在对话框关闭之前都不会执行。Android不允许阻塞式对话框,因此您不能在Android上使用这些方法。

在XE7中,InputBox、InputQuery和MessageDlg支持一个新的可选参数ACloseDialogProc。包含此新参数的调用在所有平台上都能够工作,包括Android。此新可选参数使您能够提供一个匿名方法,在对话框关闭时调用。当您使用这个新参数调用这些方法时,在桌面平台上呼叫是阻塞的,在移动平台上则是非阻塞的。如果您需要在对话框关闭后执行代码,请使用这个新参数来确保您的应用程序在所有支持的平台上按预期工作。

...

ShowMessage也在XE7中支持Android,并且在桌面平台上是阻塞的,在移动平台上是非阻塞的。然而,ShowMessage没有提供任何新的参数来处理它的关闭。如果您需要在ShowMessage显示的对话框关闭后执行代码,请使用MessageDlg。

例如:

procedure TMessageAlertsForm.btnMultiButtonAlertClick(Sender: TObject);
begin
  MessageDlg('Choose a button:', System.UITypes.TMsgDlgType.mtInformation,
    [
      System.UITypes.TMsgDlgBtn.mbYes,
      System.UITypes.TMsgDlgBtn.mbNo,
      System.UITypes.TMsgDlgBtn.mbCancel
    ], 0,
    procedure(const AResult: System.UITypes.TModalResult)
    begin
      case AResult of
        mrYES:
          ShowMessage('You chose Yes');
        mrNo:
          ShowMessage('You chose No');
        mrCancel:
          ShowMessage('You chose Cancel');
      end;
    end);
  end;
end;

有没有办法将 System.UITypes.TMsgDlgBtn.mbYes 替换为自定义字符串?这是一个不错的解决方案,但在处理非英语应用程序时会失败。 - Machado
@Holmes:mb*mr*的值都是常量ID号,而不是字符串。这段代码中没有任何依赖于字符串本地化的内容,因此它应该在所有平台和配置上都能够正常工作。 - Remy Lebeau
如果您需要将“Yes”和“No”设置为本地语言,您该怎么办呢?例如,德语中的“Ja”-“Nein”。难道我们不能做些什么吗? - Machado
@Holmes:这就是资源字符串的用途。将代码更改为将自定义的resourcestring值传递给ShowMessage(),然后根据需要对resourcestring值进行本地化。这与MessageDlg对话框本身无关(它已经在其用户界面中内部使用本地化的资源字符串)。 - Remy Lebeau
@RemyLebeau 这个在安卓上怎么能做到模态,直到点击按钮才关闭?现在在安卓上,如果我点击屏幕的其他地方,对话框就会消失!! - peiman F.
1
@peimanF。它根本不是模态的。它是异步的,通常显示一个窗体窗口,然后在窗口关闭时调用匿名过程。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接