2

これまでのところ、私のアプリケーションでは、実行時に作成された追加のフォームはすべてモーダルにする必要があることがわかりました。したがって、新しいフォームを作成するときは、次のコード ブロックに似たものを使用します。

void __fastcall ShowForm( TComponent * Owner )
{
    TForm1 * form = new TForm1( Owner );
    form->ShowModal();

    delete form;
}

このアプローチでは、ユーザーがフォームを閉じた後、フォームのメモリは簡単に削除されます。

ただし、非モーダル ダイアログのメモリ管理を処理する方法を理解しようとすると、問題が発生します。明らかに、ShowFormフォームは作成直後に削除されるため、メソッドの最後で単純に delete を呼び出すことはできません。だから私はこのようなものを残しています:

void __fastcall ShowForm( TComponent * Owner )
{
    TForm1 * form = new TForm1( Owner );
    form->Show();
}

このドキュメントと私が作成したテスト アプリケーションに基づいて、所有者が閉じられるとポインターが削除されることがわかりましformた。ただし、それでも次のシナリオが残ります。

上記の方法と同じように、コードを使用FormAするインスタンスを作成して表示するボタンがあるとします。FormBボタンをクリックして を作成し、を3 回FormB閉じます。が閉じられるFormBまで、 の 3 つのインスタンスがメモリに残ります。 FormAFormB

フォームが閉じられるとフォームに割り当てられたメモリが削除されるように、フォーム作成用のメモリを管理するにはどうすればよいですか? これには標準的なベスト プラクティスがありますか、それとも組み込みの機能が不足していますか?

4

1 に答える 1

5

TForm::FormCloseイベントを使用して、ActionパラメータをcaFree次のように設定します。

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = TCloseAction::caFree;
}

フォームは、閉じられると解放されます。

于 2016-03-08T16:45:05.050 に答える