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;
実行すると、表示されるメッセージダイアログは次のとおりです。
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;
質問:
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 の値を確認してください。
こんにちは友人はこのコードを試してください:
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;
楽しめ!