MDI子フォームでショートカットキーが効かなくなる(VB2005)

解決


あじ  2005-01-27 19:23:50  No: 119223

VisualBasic2005 Express Edition Betaを使用して
MDIフォームのWindowsアプリケーションをテスト作成しています。

親フォームにMenuStripコントロールを貼り付け、
それにMenuItemを一つ作り、
これをクリックすると子フォームを開くようにしました。
親フォームのソースには以下のものがあるくらいです。
 Private Sub TestToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestToolStripMenuItem.Click
  FormChild.MdiParent = Me
        FormChild.Show()
 End Sub

子フォームにMenuStripコントロールを貼り付け、
それにMenuItemを一つ作り、
これをクリックすると子フォームを閉じるようにしました。
そのMenuItemのShortcutKeysプロパティにF1キーを設定しました。
子フォームのソースには以下のものがあるくらいです。
 Private Sub F1ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles F1ToolStripMenuItem.Click
        Me.Close()
 End Sub

実際に実行してみると、
親フォームから子フォームを開き
子フォームでF1キーを押すとちゃんと子フォームを閉じます。
しかし、再度親フォームから子フォームを開き
子フォームでF1キーを押すと何も反応せず子フォームは閉じられません。

この原因と対策をどなたかご存知でしょうか。

ちなみに親フォームのMenuItemのShortcutKeysプロパティには何も設定していません。
またF1キー以外にもAlt+F1などのキーに変えて試しましたが同じ結果でした。

宜しくお願いいたします。


特攻隊長まるるう  2005-01-27 20:40:57  No: 119224

>親フォームのソースには以下のものがあるくらいです。
> Private Sub TestToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestToolStripMenuItem.Click
>    FormChild.MdiParent = Me
>        FormChild.Show()
> End Sub
VisualBasic2005 Express Edition Beta でもフォームの New は必要だと
思うんだけど、
http://msdn2.microsoft.com/library/5ezhe7zw.aspx
そのあたりのコードは?

あとは子フォームで KeyPress とか KeyDown のイベントは取れないんですか?
取れるなら結果は?


あじ  2005-01-27 21:02:20  No: 119225

特攻隊長まるるう様、レスありがとうございます。

以下のように変えてみましたが結果は同じでした。
    Private Sub TestToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestToolStripMenuItem.Click
        Dim frm As New FormChild
        frm.MdiParent = Me
        frm.Show()
    End Sub

また、おっしゃるように子フォームのForm側のイベントで拾えば問題はないと思います。
一応それは最終手段で「せっかくShortcutKeysプロパティがあるのならそちらを使ってみよう」という考えです。

ところで、
試しに子フォームのイベントを以下のように変えてみて、
前回と同じように実行したところ
1度目は「メッセージを表示し、画面も閉じる」のですが
2度目以降は「メッセージは表示するが、画面は閉じない」というようになりました。
なぜMe.Close()だけできなくなるのでしょう?

Private Sub F1ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles F1ToolStripMenuItem.Click
        MessageBox.Show("子フォームを閉じます。")
  Me.Close()
End Sub

引き続き宜しくお願いいたします。


特攻隊長まるるう  2005-01-27 21:14:51  No: 119226

>以下のように変えてみましたが結果は同じでした。
そんなレベルの話をしている訳ではありません。オブジェクトの
生成と開放について正しく学んでおられないのではないですか?
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200410/04100060.txt

>また、おっしゃるように子フォームのForm側のイベントで拾えば問題はないと思います。
>一応それは最終手段で「せっかくShortcutKeysプロパティがあるのならそちらを使ってみよう」という考えです。
そんな話もしてません。ショートカットを使うにも、キーが拾えて
なければ意味がありません。キーは拾えてショートカットのみ効かなく
なっているのか?原因を特定する為にちゃんとデバッグして下さい
と言っているのです。


あじ  2005-01-27 21:29:33  No: 119227

学んでいるかどうかなど余計なお世話です。

キーが拾えているからMessageBox.Showが作用しているのではないですか?

Me.Close()だけ作用しないことが不可解だと申し上げています。


厨房が多いな  2005-01-27 21:47:59  No: 119228

> 学んでいるかどうかなど余計なお世話です。

世話を焼かれたくないなら、自分で解決することですね。
要するに「初心者の内容」は「超初心者」には理解できないのです。


あじ  2005-01-27 22:04:38  No: 119229

追記です。

ショートカットキーではなく子フォームのMenuItemをクリックした場合は
2度目以降であっても
メッセージの表示→画面を閉じる
という手順で正しく動作します。
ショートカットキーを使用し、かつ、
子フォームを閉じる場合にこのような現象が起きるようです。

引き続き宜しくお願いいたします。


特攻隊長まるるう  2005-01-27 22:16:19  No: 119230

原因を特定するに十分な情報が得られませんでした。
現段階でボクが想像する一番の原因は
・オブジェクトを正しく開放していないから
です。
>学んでいるかどうかなど余計なお世話です。
そこが原因かもしれないんですが、触れられたく
無い部分のようなのでボクが解決する手段が閉ざ
されました。ボクの力では解決は不可能ですので
このスレッドにボクが書き込むのは最後にします。
他にも優秀な方がたくさんおられますのでお任せ
したいと思います。

>Me.Close()だけ作用しないことが不可解だと申し上げています。
ボクの想像通りならフォームに関するほとんどの
事ができなくなってる可能性はあります。


L/D  2005-01-27 22:35:18  No: 119231

自分で問題点を見つけられないようなら、βなんぞ利用すべきではない。


あじ  2005-01-27 23:04:54  No: 119232

解決しました


初心者  2005-01-27 23:25:43  No: 119233

○ 自分で問題点を見つけられないようなら、βなんぞ利用すべきではない。
◎ オブジェクトが何たるかをわかっていない人は、OOP を利用すべきではない。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加