[ クラス | フォーム | 配列、動的配列 | 文字列 | Delphi の格言 | IDE の小技 | エッセンス ]

up

フォーム

フォームが破棄されたことを検知するにはどんな方法があるか

Screen 変数
Screen 変数には TForm から派生するクラスのインスタンスが Screen.Forms 配列プロパティに登録されています。フォームの数はScreen.FormCount で得られます。フォームが破棄されると、この配列から破棄されます。
Notification メソッド
フォームに限らず、コンポーネントは自分の親(Owner)に自分が追加されたこと、削除されたことをを通知します。このとき親、及びその配下の全てのコンポーネントの Notificationメソッドが呼び出されます。適当なコンポーネントのNotification メソッドを override すればコンポーネントの追加/削除を検出できます。親子関係が無い場合でも FreeNotification メソッドで自分が破棄される際に Notification を呼び出すコンポーネントを指定できます。詳細はヘルプを見てください。Notification/FreeNotification は TLabel の FocusControl プロパティのようなコンポーネント間のリンク情報を正常に保つために使われている仕掛けです。
フォームの OnDestory イベント
単純ですが、フォームが破棄されるときこのイベントが起きます。ここに通知コードを書けばフォームの破棄を知らせることが出来ます。単純です(^^;フォームのデストラクタを override して通知コードを書いても良いでしょう。厳密な破棄タイミングが欲しいときに有効なやり方です。通知先は固定で無い場合は、フォームを作るときにフォームの適当なフィールドに登録するなど処置が必要でしょう。
published フィールドを使う
フォームを作成するとき、親(Owner)コンポーネントの published フィールドにフォームの Name プロパティと同名のものがあれば、フォームのオブジェクト参照が自動的にそのフィールドに代入され、フォームが破棄されるとそのフィールドが自動的に Nil になります。これは、コンポーネントがフォームやデータモジュールにロードされるときに、published フィールドが自動的にコンポーネントを指すようにするために仕掛けで意図的に使うことも出来ます。但し、フィールドの名前、数はコンパイル時に決まるので、任意の数のフォームや同名の複数のフォームにはこの技は使えません。
オーナーの Components プロパティを使う
コンポーネントは自分をオーナにしている全てのコンポーネントを Components 配列に登録します。これを検索すればオーナに登録されているコンポーネントの有無が判ります。コンポーネントが破棄されるとコンポーネントが Components 配列から削除されます。

[delphi-ml:53185]

top

フォームの閉じるボタン( Window の右上にある×印)を押せば Form は破棄されるか

Close ボタンは Form を隠す(Hide)だけでForm のリソースを解放(Free)はしてくれません。つまり Visible := False; ということ。[delphi-ml:53185]

top

[ クラス | フォーム | 配列、動的配列 | 文字列 | Delphi の格言 | IDE の小技 | エッセンス ]


up

更新日:2005-02-12