« 「イース」シリーズから考察する最新作「イース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

Twitter

この記事をTwitterでつぶやく

トラックバック

このエントリーのトラックバックURL:
http://scriptlife.hacca.jp/cgi-bin/MT/mt-tb.cgi/21

コメント

コメントしてください




保存しますか?