Ownerプロパティを使っていると孫フォームのClosingイベントが発生しない
FormにはOwnerという所有者プロパティがある。
フォームAを作るときに所有者プロパティにフォームBを設定しておくと、フォームBを閉じると自動的にフォームAも閉じてくれる。フォームBを最小化すると、フォームAも最小化される。
どういうときに使うのかといえば、メモ帳の検索ダイアログみたいなフォームを作りたいときだろうか。
いつもながら特殊な使い方をしていてはまった事例をメモする。
所有者が3代になったとき(祖父G→親P→子C)、フォームGを閉じると、フォームPもフォームCも閉じるのだけど、Form_ClosingイベントがフォームCでは発生しない。
つまり、フォームCで大事な編集をしているときに、うっかりフォームGを閉じてしまうと、何の警告も出せずにフォームCも閉じてしまう。編集中のデータは失われて悲しいことに。
以下、実験。
まず所有者を代々引き継いでいくフォームを4つ作る。横に並んでいる5つのフォームの左側4つがその一族。4番目のフォームから所有者を指定しないフォームを1つ作る。それが右端のフォーム。
ところが、フォームが閉じるというイベントは3番目と2番目のフォームだけで発生して、4番目のフォームでは起きない。
ということで、Ownerプロパティを使うときは、親を経由して孫を所有などということをすると面倒なことになるかもしれないというメモでした。
フォームAを作るときに所有者プロパティにフォームBを設定しておくと、フォームBを閉じると自動的にフォームAも閉じてくれる。フォームBを最小化すると、フォームAも最小化される。
どういうときに使うのかといえば、メモ帳の検索ダイアログみたいなフォームを作りたいときだろうか。
いつもながら特殊な使い方をしていてはまった事例をメモする。
所有者が3代になったとき(祖父G→親P→子C)、フォームGを閉じると、フォームPもフォームCも閉じるのだけど、Form_ClosingイベントがフォームCでは発生しない。
つまり、フォームCで大事な編集をしているときに、うっかりフォームGを閉じてしまうと、何の警告も出せずにフォームCも閉じてしまう。編集中のデータは失われて悲しいことに。
以下、実験。
まず所有者を代々引き継いでいくフォームを4つ作る。横に並んでいる5つのフォームの左側4つがその一族。4番目のフォームから所有者を指定しないフォームを1つ作る。それが右端のフォーム。
左から2番目のフォームを閉じると、自分が所有している3番目のフォームが閉じ、3番目のフォームが所有している4番目のフォームが閉じる。
ところが、フォームが閉じるというイベントは3番目と2番目のフォームだけで発生して、4番目のフォームでは起きない。
ということで、Ownerプロパティを使うときは、親を経由して孫を所有などということをすると面倒なことになるかもしれないというメモでした。
コメント
コメントを投稿