【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;