<p>楽にする方法として、フォームで共通になることをテンプレートを作成してそこに記述している。<br />
具体的には、ただのフォームの場合には画面のクローズと同時にそのインスタンスが破棄されるようにしている。<br />
ダイアログの場合には、CALL元でダイアログの内容を参照する可能性が高いから破棄はしていない。</p>
<p>フォームのテンプレートには下記のような処理を追加している。</p>
<pre class="brush: delphi;">
TXxxFrom.FormCreate(Sender: TObject);
begin
  // Delphiが生成するモード付き画面は、
  // ...Windowsとしては親子関係でないのでこれを設定する
  // ※たまにCALL元画面の裏に隠れてしまう問題を解決
  if (Owner &lt;&gt; nil) and (Owner is TForm) and (fsModal in FormState) then
    SetWindowLong(Handle, GWL_HWNDPARENT, TForm(Owner).Handle);
end;
</pre>
<pre class="brush: delphi;">
TXxxFrom.FormClose(Sender: TObject; <b>var</b> Action: TCloseAction);
begin
  // ダイアログ(モード付き)の場合には、
  // ...CALL元でダイアログ情報を参照する可能性があるので破棄しない
  if not (fsModal in FormState) then
    Action := caFree;
  // 呼出元(Owner)があれば表示する。しかし、アプリケーションの終了中は除外。
  if (not Application.Terminated) and (Owner &lt;&gt; nil) and (Owner is TForm) then
    TForm(Owner).Show;
end;
</pre>
<p>ダイアログだけはCALL元で破棄を書かないといけないのは仕方がないな。</p>
<p>蛇足：FormCreate のタイミングで、フォームの Parent プロパティにオーナーフォームへの参照を代入するとMDIみたいで面白いことに...</p>