読者です 読者をやめる 読者になる 読者になる

Web・IT うんたらら

業務系とWeb系の狭間でIT業界を彷徨いながら備忘録と足跡を残していきます

【FireMonkey】Delphi XE7のMessageDlgをXE6以前の仕様で使えるようにする

Delphi XE7からMessageDlgにコールバック関数を渡し、非同期で実行できるようになりました。
参考: FMX.Dialogs.MessageDlg - RAD Studio API Documentation

それはいいんですが、何を思ったか、Androidの場合に限り、従来の同期処理でメッセージダイアログ表示ができなくなりました。
しかもコンパイル時に警告も出ず、実行時にエラーメッセージが表示されるのみ。

Embercadero......いつもながらやってくれるな (#^ω^)ビキビキ

とりあえず個別で対策

その後の処理を全部無名関数に囲んで渡してしまうか、別の関数に切り出せば、とりあえずは動きます。
修正前が以下のソースとするなら

case MessageDlg(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) of
  mrYes: ShowMessage('yes');
  mrNo: ShowMessage('no');
end;

このように修正

MessageDlg(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, 
  procedure(const AResult: TModalResult) begin
    case AResult of
      mrYes: ShowMessage('yes');
      mrNo: ShowMessage('no');
    end;
  end
)

とはいえ、従来のソースを全部このように修正するのはかなり大変です。

XE6以前と互換の関数を作って置き換える

ということで、作りました。

FireMonkey/FMX.Dialogs.Wait.pas at master · vamview/FireMonkey · GitHub

これをusesに追加し、既存のMessageDlgをMessageDlgWaitに置き換えるだけ。

case MessageDlgWait(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) of
  mrYes: ShowMessage('yes');
  mrNo: ShowMessage('no');
end;