2017-03-17 25 views
4

私はFireMonkeyに移植しているVCLアプリケーションを持っています。私が遭遇したことの1つは、MessageDlg(...)がFireMonkeyでは廃止されていることです。さらに掘り下げていくと、私はFMX.DialogService.MessageDialogメソッドを使用しなければならないことを理解しています。だから私は、ダイアログを表示する機能を作成しました:Delphi - FireMonkeyでメッセージダイアログを正しく表示し、モーダル結果を返す

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つのボタンを使ってメッセージダイアログを正しく表示し、メッセージダイアログのモーダル結果を関数の結果として送り返してください。

私は事前にデルファイ10.1ベルリンの更新2.

感謝を使用しています!

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; 
+0

匿名メソッドの中からローカル変数を設定して、ビットがOKになるようにすることができます。私は残りの部分も間違っていると見ることはできません。 – Dsm

答えて

1

質問:

それは2つのボタンが表示されない(はい、キャンセル)。誰かがこの権利を得る手助けをしてくれますか?つまり、2つのボタンを使ってメッセージダイアログを正しく表示し、メッセージダイアログのモーダル結果を関数の結果として送り返してください。

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

ソースコード(Fmx.Dialogs.Win。

  • MBOK
  • MBOK、mbCancel
  • mbYes、mbNo、mbCancel
  • mbYes、mbYesToAll、mbNo、 mbNoToAll:PAS)は、これらの有効な組み合わせを(mbHelpは、すべての組み合わせに含めることができます)明らかに、mbCancel
  • mbAbort、mbRetry、mbIgnore
  • mbAbort、mbIgnore
  • mbYes、mbNo
  • mbAbort、mbCancel

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


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

+0

ありがとう、@ LURD - これを行いました - 私は正しいダイアログと正しいモーダル結果を得るようになりました!ちょうどFYI、FMX.Dialogsには、適切な選択肢mbYesNo、mbYesNoCancel、mbYesAllNoAllCancel、mbOKCancel、mbAbortRetryIgnore、mbAbortIgnoreがあります。 – Rohit

0

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

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; 

それをお楽しみください!

+0

コードをありがとう。あなたの最初の例は(概念的に)私のコードと同じです(whileループを除く)。私はそれを私のコードに組み込みましたが、私は依然として質問に概説されたメッセージボックスを見ます。私はまだ2つのボタンが表示されません。ちょうどFYI - 私はこれをWindows 10でテストしています。 – Rohit

+1

'TDialogService'の動作は[PreferredMode](http://docwiki.embarcadero.com/Libraries/en/FMX.DialogService.TDialogService.PreferredMode)に依存します。同期、非同期、またはプラットフォームに依存する可能性があります。あなたの答えは非同期モードを想定しているようですが、 'Application.ProcessMessages'を呼び出すことは間違いです。 –

+0

@LURD - もし 'PreferredMode'を指定しなければ、デフォルトで' Platform'になっていますか?私はWindows 10でこれをテストしているので、そのメソッドを 'Sync'として扱うべきです - 正しい? – Rohit

関連する問題