Delphi-XE5 Android 開発。非モーダルフォームを解放する最善の方法は何ですか?
-
21-12-2019 - |
質問
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の上記です!