2017-08-23 10 views
2

10.1ベルリンでうまくいきましたが、デルファイ10.2.1東京での作業をやめたアンドロイドのモーダルメッセージを表示するためのDelphiコードがあります。この手順でAndroidアプリがハングアップするようになりました。Delphi 10.2.1東京を使用したモーダルアンドロイドダイアログ

procedure customShowMessage(AMessage: string); 
//good idea to have our own procedure that we can tweak, as even for VCL and windows, we have done show message differently over the years due to all sorts of funny problems 
var 
    LModalWindowOpen: boolean; 
begin 
    LModalWindowOpen := true; 

    TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0, 
     procedure(const AResult: TModalResult) 
     begin 
      LModalWindowOpen := false; 
     end); 

    while LModalWindowOpen do 
    begin 
     Application.ProcessMessages; //since 10.2 Tokyo, popup never shows and this loops forever 
    end; 
end; 

メインスレッドでのアプリの動作については、東京の変更と関係している可能性があります。 Application.ProcessMessagesを何に置き換えることができるかわからないので、ユーザーが何かをクリックできるようにダイアログが表示されます。

私はこれが使用されている場所が多いので、コールバックを使用して作業するように変更すると、多くの作業と再構築が行われます。

+1

東京でAndroid上で 'Application.ProcessMessages()'が壊れています(他にも多くのアップデートがありますが、最新のアップデートがインストールされていますか?)。しかも、モーダルダイアログはAndroidではサポートされていません。 Embarcaderoのドキュメントには多くのことが書かれています。 FMXはこれに対処するためにXE5以降の非同期ダイアログをサポートしています。非同期で動作するようにこのコードを書き直す必要があります。 'ProcessMessages'ループを取り除き、ダイアログが閉じられたときにそれを通知させます。ダイアログが閉じるのを待っている呼び出しスレッドをブロックしないでください。これを適切に処理する方法です。あなたはこれを無視してはいけません。 –

+0

ありがとうございます、私は更新を再度確認しました。現在利用可能な修正プログラムはTokyo 10.2用です。私は東京10.2アップデートの最新インストーラを使用しました。長期的な解決策は、コールバックを使用するように変更するように見えます。 – Maya

答えて

0

私は、次のコードは動作するはずだと思う:

function ShowMessageOKCancel(AMessage: String): String; 
var 
    lResultStr: String; 
begin 
    lResultStr:=''; 
    TDialogService.PreferredMode:=TDialogService.TPreferredMode.Platform; 
    TDialogService.MessageDialog(AMessage, TMsgDlgType.mtConfirmation, 
    FMX.Dialogs.mbOKCancel, TMsgDlgBtn.mbOK, 0, 
    procedure(const AResult: TModalResult) 
    begin 
     case AResult of 
     mrOK: lResultStr:='O'; 
     mrCancel: lResultStr:='C'; 
     end; 
    end); 

    Result:=lResultStr; 
end; 

この関数を呼び出すと、それはOK、あなたのメッセージを含むダイアログと2つのボタンを表示し、キャンセルする必要があります。戻り値は、クリックされたボタンを示します。

+1

いいえ、それは動作しません。ダイアログは非同期なので、 "'Result:= lResultStr;"ダイアログが表示される前に呼び出されます。また、その関数の外側のコードはすべて実行され、すべてが実行されたら最後にダイアログを表示するだけです。 – Maya

+0

「TDialogService.PreferredMode:=」は「同期」に設定できますが、Android以外のOSであれば動作します。 – Maya

0

Androidには非同期のダイアログボックスしかありません。モーダルダイアログボックスとして機能させたい場合は、自分でやる必要があります。

ProcessMessageループのソリューションは考えですが、私はそれが最良のアプローチだとは思わないのです。

ダイアログボックスを表示する前にフォームに透明(または不透明)なレイアウト(または矩形)を追加し、答えがある場合はブロックレイアウトを削除できます。

また、TFrameをダイアログボックスとして使用する方法を提案するAndrea Magni(GetItから直接ダウンロード可能)のTFrameStandを使用することもできます。

関連する問題