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;
我不认为我做对了,因为我不确定是否可以在匿名方法中设置局部变量,但是仍然可以编译。
我这样称呼它:
  if GetDeleteConfirmation('Are you sure you want to delete this entry?')<>'Y' then
    exit;
当我运行它时,显示的消息对话框是这样的:
它不显示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;
题:
它不显示 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的值。