« 「イース」シリーズから考察する最新作「イースIV」は特別な存在 (ITmedia) | メイン | 時計館の殺人 (綾辻行人) »
2005年05月26日
Buttonコントロールの罠
C#のSystem.Windows.Forms.Buttonコントロールオブジェクトには罠がある。
このオブジェクトのDialogResultプロパティこいつが壮絶にくせ者だ。
使い方としては、みなさんご存じの「OK」「キャンセル」ボタンなど、ダイアログ・ボックスの作成を助けるためのもの。ここに設定したDialogResult値が、ボタンを押したときに返り値として適用される。
つまり、DialogResult.OKを設定しておけば、ボタンを押しただけで自動的にShowDialog()の返り値がOKになるという寸法さ。
デフォルト値はnoneになっていて、特に動作が要らないならこのままでいい。
きちんと使えば便利そうな実装。だがこいつには罠がある
そう、none以外の値が設定されており、かつフォームがShowDialog()で開かれているとき、
ボタンをクリックするとCloseが自動的に走る
つまり勝手にフォームが閉じるというわけだ。そこまで折り込み済み。
仕様と用途を考えると納得のいく実装ではあるが、知らずに設定してると面食らうに違いない。
組み方によっては、フォームが消えてプロセスだけが残るという状況に陥ることもある。
何もしていないのに勝手にフォームが閉じられるという症状が発生したときには気をつけたい。
※2005/05/28 「WindowsXP SP1では動作しないがSP2では動作する」と書きましたがこちらの確認違いでした。謹んでお詫びと訂正申し上げます
それからもうひとつ、こいつにはとんでもない罠があった。
Windowsフォームオブジェクトには、CancelButtonプロパティというものがあり、
ユーザがEscキーを押したときに作用するボタンを設定することができるのだが、
VisualStudio .Net2003からCanselButtonプロパティ変更したら
それに設定したボタンのDialogResultに
Canselが設定されてくれやがりました
そしてその後にフォームのCanselButtonプロパティを解除しても、DialogResultはそのまま変更無し。
つまり、一寸プロパティを間違えて変更してしまった場合に、
DialogResultは設定され、
なおかつそれがShowDialog()で呼ばれる類のフォームだったりすると
ボタンを押したら突然Closeという予期せぬ動作に見舞われるわけだ。
マジかよ。
実装した意図も分らなくはない。Escといったら大抵キャンセルだとは思うけど。
けれどもそれはお節介過ぎると思うし、バグを呼ぶ実装だと思うのだがどうだろうか。
投稿者 kagerou : 2005年05月26日 23:48
トラックバック
このエントリーのトラックバックURL:
http://scriptlife.hacca.jp/cgi-bin/MT/mt-tb.cgi/21