Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
フォームがエンターキーでクローズしない
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30928#CommentId86032
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2023/12/13 13:48:27
> なので、Form2 や ボタンの設定の問題ではないような気がします。
> 設定の問題ならどのキーでも終われないはずだと思えるのですが・・・・
モーダルダイアログにおいて、DialogResult プロパティは重要ですよ。
現状の実装は、本来使うべき Click イベントを使わずに
MouseUp や PreviewKeyDown だけで処理するという
かなり不自然な実装になっている点にも問題があります。
オーバーライドの不自然さも含めて、一度しっかりと見直された方が良いでしょう。
(不自然に見えるのは、説明のために処理を簡略化したせいでもあるようですが)
> ともかく[Tab]や[F12]で出来る事が
> 何故[Enter]で出来ないのか。不思議です。
ボタンにフォーカスがある状態で Enter や Space を押した場合、
標準動作としてクリックと同義になることはご存じかと思います。
しかし Tab や F12 はそうではありません。端的に言えばその差です。
Button1_PreviewKeyDown 冒頭の「MsgBox(e.KeyCode.ToString())」を削除して
Button1_Click にて「MsgBox(Me.DialogResult.ToString())」と記述してから
Space や Enter を押してみてください。 "None" と表示されますよね?
これは、モーダルフォームのボタンがクリックされた時点で、
Me.DialogResult = Button1.DialogResult
に相当する処理が行われてから、Button1_Click が実行されるためです。
これが、先の回答で
>> Form2 のデザイン画面で、そのボタンの DialogResult プロパティは何になっていますか?
と確認した理由です。デザイン時の初期値は None だからです。
まず前提知識として、モーダルダイアログについて理解しておいていただきたいことが 3 点あります。
(1) ShowDialog が呼び出された時点で、そのフォームの DialogResult は None にリセットされる仕様です。
(2) その後、そのフォームの DialogResult が None 以外に設定された場合、
次のアイドル時にそのフォームは(Close を呼んだり×を押したりせずとも)閉じられます。
そして閉じられると、その時の Me.DialogResult が、ShowDialog メソッドの戻り値になる仕様です。
(3) そのダイアログは実際には非表示になっているだけであるため、ShowDialog 後は
明示的に Dispose を呼び出す責任が生じます。これは、ダイアログが閉じられた後も、
そのダイアログが利用され続ける可能性があるため、そういう設計になっています。
(OpenFileDialog でも、ShowDialog 後に FileName プロパティを参照したりしますよね)
ここまではよろしいでしょうか?