web-dev-qa-db-ja.com

Delphi-FireMonkeyでメッセージダイアログを正しく表示し、モーダル結果を返す

FireMonkeyに移植しているVCLアプリケーションがあります。私が遭遇したことの1つは、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;

実行すると、表示されるメッセージダイアログは次のとおりです。

enter image description here

2つのボタンは表示されません(はい、キャンセル)。誰かが私がこれを正しくするのを手伝ってくれませんか?つまり、2つのボタンでメッセージダイアログを正しく表示し、メッセージダイアログのモーダル結果を関数の結果として送り返します。

Delphi 10.1 Berlin Update2を使用しています。

よろしくお願いします!

EDIT 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;
6
Rohit

質問:

2つのボタンは表示されません(はい、キャンセル)。誰かが私がこれを正しくするのを手伝ってくれませんか?つまり、2つのボタンでメッセージダイアログを正しく表示し、メッセージダイアログのモーダル結果を関数の結果として送り返します。

Fmx.TDialogService.MessageDialogは、ダイアログボタンの任意の組み合わせをサポートしていません。

ソースコード(Fmx.Dialogs.Win.pas)を調べると、これらの有効な組み合わせがわかります(mbHelpはすべての組み合わせに含めることができます)。

  • mbOk
  • mbOk、mbCancel
  • mbYes、mbNo、mbCancel
  • mbYes、mbYesToAll、mbNo、mbNoToAll、mbCancel
  • mbAbort、mbRetry、mbIgnore
  • mbAbort、mbIgnore
  • mbYes、mbNo
  • mbAbort、mbCancel

これは、[mbYes,mbCancel]が有効な組み合わせではないことを意味します。たとえば、代わりに[mbOk,mbCancel]を使用してください。


Fmx.TDialogService.MessageDialogに関する最後の注意。通常、デスクトップアプリケーションでは同期ダイアログですが、モバイルプラットフォームでは非同期です。ユースケースはこれらの条件によって少し異なるように見えるため、マルチプラットフォームアプリケーションの場合は、 TDialogService.PreferredMode の値を確認してください。

6
LU RD

こんにちは友人はこのコードを試してください:

function myMessageDialog(const AMessage: string; const ADialogType: TMsgDlgType;
  const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn): Integer;
var
  mr: TModalResult;
begin
  mr:=mrNone;
  // standart call with callback anonimous method
  TDialogService.MessageDialog(AMessage, ADialogType, AButtons,
    ADefaultButton, 0,
    procedure (const AResult: TModalResult) 
    begin 
      mr:=AResult 
    end);

  while mr = mrNone do // wait for modal result
    Application.ProcessMessages;
  Result:=mr;
end;

またはこれ:

function MsgBox(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons;
    const ADefaultButton: TMsgDlgBtn ): Integer;
var
    myAns: Integer;
    IsDisplayed: Boolean;
begin
    myAns := -1;
    IsDisplayed := False;

While myAns = -1 do
Begin
    if IsDisplayed = False then
    TDialogService.MessageDialog(AMessage, ADialogType, AButtons, ADefaultButton, 0,
            procedure (const AResult: TModalResult)
            begin
                myAns := AResult;
                IsDisplayed := True;
            end);

    IsDisplayed := True;
    Application.ProcessMessages;
End;

Result := myAns;

end;

楽しめ!

2
Vlad Ivchenko