Delphi-在FireMonkey中正确显示消息对话框并返回模态结果

Roh*_*hit 5 delphi firemonkey delphi-10.1-berlin

我有一个要移植到FireMonkey的VCL应用程序。我遇到的一件事MessageDlg(...)是FireMonkey不推荐使用。关于进一步的挖掘,我了解我必须使用该FMX.DialogService.MessageDialog方法。所以我创建了一个显示对话框的函数:

function TfMain.GetDeleteConfirmation(AMessage: String): String;
var
  lResult: String;
begin
  lResult:='';
  TDialogService.PreferredMode:=TDialogService.TPreferredMode.Platform;
  TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation,
    [ TMsgDlgBtn.mbYes, TMsgDlgBtn.mbCancel ], TMsgDlgBtn.mbCancel, 0,
    procedure(const AResult: TModalResult)
    begin
      case AResult of
        mrYes:    lResult:='Y';
        mrCancel: lResult:='C';
      end;
    end);

  Result:=lResult;
end;
Run Code Online (Sandbox Code Playgroud)

我不认为我做对了,因为我不确定是否可以在匿名方法中设置局部变量,但是仍然可以编译。

我这样称呼它:

  if GetDeleteConfirmation('Are you sure you want to delete this entry?')<>'Y' then
    exit;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,显示的消息对话框是这样的:

在此处输入图片说明

它不显示2个按钮(是,取消)。有人可以帮我解决这个问题-即用2个按钮正确显示消息对话框,并将消息对话框的模态结果作为函数的结果发送回去。

我正在使用Delphi 10.1 Berlin Update 2。

提前谢谢了!

编辑20170320:我根据下面的@LURD的正确答案更正了我的代码,为了完整性起见在这里包括了它:

function TfMain.GetDeleteConfirmation(AMessage: String): String;
var
  lResultStr: String;
begin
  lResultStr:='';
  TDialogService.PreferredMode:=TDialogService.TPreferredMode.Platform;
  TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation,
    FMX.Dialogs.mbYesNo, TMsgDlgBtn.mbNo, 0,
    procedure(const AResult: TModalResult)
    begin
      case AResult of
        mrYes: lResultStr:='Y';
        mrNo:  lResultStr:='N';
      end;
    end);

  Result:=lResultStr;
end;
Run Code Online (Sandbox Code Playgroud)

LU *_* RD 9

题:

它不显示 2 个按钮(是,取消)。有人可以帮我解决这个问题吗 - 即正确显示带有 2 个按钮的消息对话框,并将消息对话框的模式结果作为函数的结果发送回去。

Fmx.TDialogService.MessageDialog不支持对话框按钮的任意组合。

查看源代码 (Fmx.Dialogs.Win.pas) 揭示了这些有效组合(mbHelp可以包含在所有组合中):

  • 确定
  • mb确定,mb取消
  • mb是,mb否,mb取消
  • mbYes、mbYesToAll、mbNo、mbNoToAll、mbCancel
  • mbAbort、mbRetry、mbIgnore
  • mbAbort, mbIgnore
  • mb是的,mb否
  • mbAbort, mbCancel

这意味着这[mbYes,mbCancel]不是一个有效的组合,[mbOk,mbCancel]例如使用。


关于Fmx.TDialogService.MessageDialog. 它通常是桌面应用程序上的同步对话,但在移动平台上是异步的。根据这些条件,用例看起来会有所不同,因此对于多平台应用程序,请检查TDialogService.PreferredMode的值。