Delphi-XE5 Android 開発。非モーダルフォームを解放する最善の方法は何ですか?

StackOverflow https://stackoverflow.com//questions/20015519

質問

Delphi for Windows では、「ShowModal」メソッドがあるため、動的に作成された閉じた二次フォームを解放(Form.free)しても問題ありません。ただし、Delphi for Android は Form.ShowModal をサポートしていないため、Show メソッドを使用する必要があります。しかし、セカンダリフォームを閉じたとき(Form.close)、それがまだメモリ内にあり、コードの Onresize イベント(???)を実行していることさえ理解しました。非モーダル呼び出しでフォームを自由にする最善の方法は何ですか?

別の言葉で言うと:フォーム上の OnClick イベント ハンドラーからフォームを閉じ、フォームのデストラクターが確実に実行されるようにするにはどうすればよいですか?

役に立ちましたか?

解決

アップデート

以下の重要な注意事項を参照してください。


Android 用 XE5 では、モーダルな結果、オーバーロードされたフォームを表示する可能性があります。 ShowModal 匿名メソッドを使用した手順:

プロシージャ ShowModal(const ResultProc:TProc);過負荷;

Marco Cantu によるこの記事で説明されています。 Delphi XE5 Anonymous ShowModal and Android.

この手順の使用例を次に示します。

var
  dlg: TForm1;
begin
  dlg := TForm1.Create(nil);
  // select current value, if avaialble in the list
  dlg.ListBox1.ItemIndex := dlg.ListBox1.Items.IndexOf(Edit1.Text);
  dlg.ShowModal(
    procedure(ModalResult: TModalResult)
    begin
      if ModalResult = mrOK then
      // if OK was pressed and an item is selected, pick it
        if dlg.ListBox1.ItemIndex >= 0 then
          edit1.Text := dlg.ListBox1.Items [dlg.ListBox1.ItemIndex];
      dlg.DisposeOf;  // Wrong !!!, see note below
    end);

注意してください。 dlg.DisposeOf; ARC の自動処理を無効にして、フォームを強制的に破棄します。

ドキュメントにも説明があります。 Using Modal Dialog Boxes in Mobile Apps そしてここ、 ShowModal Dialogs in FireMonkey Mobile Apps.


他の人が見つけたように、 http://www.malcolmgroves.com/blog/?p=1585, 、呼び出し中 DisposeOf 匿名フレームは有効なオブジェクトからの ModalResult を処理できる必要があるため、匿名メソッド内の記述は間違っています。代わりにこのパターンを使用してモーダル ダイアログを解放します。 モーダルダイアログボックスを解放する.

procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

他のヒント

ObjectInspector

に設定することを忘れないでください
ModalResult = mrOK
.

またはあなたの

procedure TForm1.ExitButtonClick(Sender: TObject);
begin
   ModalResult := mrOK;
end;
.

例のDLG.ShowModalの上記です!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top