13

Delphi のオンライン ヘルプには、メモリからフォームを削除するには Release を使用する必要があると記載されています。ただし、モーダルフォームの多くの例で、次の構成を見てきました。

MyForm := TMyForm.Create(nil);
try
  MyForm.ShowModal;
finally
  MyForm.Free;
end;

Free はモーダル フォームを破棄する安全な方法ですか? ShowModal のソースでわかるように、ModalResult が 0 でなくなるまで Application.HandleMessage が呼び出されます。これが、Free が保留中の Windows メッセージに干渉できない理由ですか?

4

3 に答える 3

18

はい、通話 Free後も安心してご利用いただけます。ShowModal

使用する必要があるReleaseのは、イベント ハンドラー (例: OnClick) の途中で、イベント後の処理でフォームにアクセスする必要がある場合です。その場合、代わりに呼び出すと、イベント ハンドラーが終了し、制御がメッセージ ポンプ ( / )に戻るまでイベントを解放しないメッセージがReleaseポストされます。 イベント ハンドラーが終了し、制御によってスタックがバックアップされるまで返されないため、その後の呼び出しは、他の方法でメッセージが処理される場所と実質的に同じ場所になります。CM_RELEASEProcessMessagesApplication.RunShowModalFreeCM_RELEASE

于 2009-05-27T18:06:22.513 に答える
7

場合によります。Freeフォームを実行しても、イベントハンドラーは呼び出されませんRelease。また、フォームに投稿されてキューに入れられた可能性のあるメッセージは処理されません。したがって、多くの場合、おそらくほとんどの場合、呼び出しFree(またはFreeAndNil)は正常に機能しますが、一見ランダムな理由で、非常に奇妙な動作を引き起こす可能性があります。

私が提案する別の方法は、OnCloseイベントで、次のようにアクションをcaFreeに設定することです。

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

次に、次のようなコードを記述できます。

TMyForm.Create(nil).ShowModal;

また、フォームが完了すると自動的に解放されるため、フォームを特別に解放する必要はありません。

于 2009-05-27T17:27:07.910 に答える
5

もちろん、FreeAndNil ルーチンも使用できます。FreeAndNil ルーチンは、オブジェクトがまだ nil でない場合にのみオブジェクトを解放し、解放後に nil に設定します。既に解放されているオブジェクトに対して free を直接呼び出すと、アクセス違反が発生します。

MyForm := TMyForm.Create(nil); 
try 
  MyForm.ShowModal; 
finally 
  FreeAndNil(MyForm); 
end;
于 2009-05-27T16:53:25.763 に答える