• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サブフォームのTab移動について)

サブフォームのTab移動について

このQ&Aのポイント
  • VB2005で開発を行っております。とあるサイトでMDIとは別の方法でフォーム内にフォームを貼り付けることができることを知りました。
  • Form1とForm2があり、Tabキーによるフォーカス移動を行うと、Form1のコントロールからForm2のコントロールへの移動は行えるのですが、その後はForm2のコントロール内のみフォーカス移動が行われてしまいます。
  • Form2がGroupBoxやPanelコントロールのように動作するようにしたいのですが、どのようにすればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんなのはどうでしょう? form2に2つのtextboxを用意します。(フォーカスを持てるコントロールなら何でもいいんだけど) 名前をdummy0,dummy1とします。 見えないように、BorderStyle=none,ReadOnly=trueにします。 dummy0のtabindexを0,dummy1のtabindexをform2の最大tabindex+1にします。 これでform2の最初のtabストップがdummy0,最後がdummy1になります。 各々のgotfocusを以下にします。 以上で、たぶん希望の動きをすると思いますが・・・ Private Sub dummy0_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles dummy0.GotFocus If Control.ModifierKeys And Keys.Shift = Keys.Shift Then 'shiftキーが押されている? Me.Parent.SelectNextControl(Me, False, True, True, True) '親の前へ Else Me.SelectNextControl(Me.ActiveControl, True, True, True, True) '次へ End If End Sub Private Sub dummy1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles dummy1.GotFocus If Control.ModifierKeys And Keys.Shift = Keys.Shift Then 'shiftキーが押されている? Me.SelectNextControl(Me.ActiveControl, False, True, True, True) '前へ Else Me.Parent.SelectNextControl(Me, True, True, True, True) '親の次へ End If End Sub

TheLock
質問者

お礼

上手くいきました! 希望通りの動作をしてくれて満足しています。 ありがとうございました。 ただ、回答してくださったコードをGotFocusイベントではなく、 Enterイベントに記述しても上手くいかないのはなぜなのでしょうか? .NETからはGotFocusイベントはEnterイベントに変更されたと思い込んでいたので、 少し気になります。 (そもそもGotFocusとEnterの違いがわかっていない…)

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

>>ただ、回答してくださったコードをGotFocusイベントではなく、 >>Enterイベントに記述しても上手くいかないのはなぜなのでしょうか? >Form2のDummy1にFocusが来た場合、VBはDummy1のEnterとGotFocusの処理を行います。 >Enterの時点でForm1の方にFocusを移動しても、GotFocusの処理中にFocusが戻されるようです。 >まず、私のコードをEnterイベントに記述して、何もしないGotFocusを用意します。 >次に、Form1の選ばれるはずのControlにEnterとGotFocusを用意します。 >各々のイベントの最初にブレークポイントを設定します。 >Dummy1にFocusが移った場合、どの順番でイベントが発生するかを見ればわかると思います。 自分で書いたのですが、よく考えたら同じフォーム内ではFocusが移動するんだから・・・ やっぱりよくわかりません。

TheLock
質問者

お礼

私のほうでもいろいろ調べてみましたが、いまいちよくわかりませんでした。 できればEnterイベントで実装してみたかったのですが、 現状、希望通りの動作をしているので、回答していただいたコードを実装することにします。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.2

>.NETからはGotFocusイベントはEnterイベントに変更されたと思い込んでいたので、 >少し気になります。 知らなかった・・・ 何も考えずにやったら動いたので回答したんです、すみません。 確かに今googleしてみたら、Enterの方を使うのがいいようですね。 GotFocusは、なくなったのではなく低水準のなので使うべきではないということみたいですね。 >(そもそもGotFocusとEnterの違いがわかっていない…) 私もよくわかりませんが「ちゃんと正規のコマンドがあるのに、やたらとWindowsAPI使うな」みたいな事でしょうか。 >ただ、回答してくださったコードをGotFocusイベントではなく、 >Enterイベントに記述しても上手くいかないのはなぜなのでしょうか? Form2のDummy1にFocusが来た場合、VBはDummy1のEnterとGotFocusの処理を行います。 Enterの時点でForm1の方にFocusを移動しても、GotFocusの処理中にFocusが戻されるようです。 まず、私のコードをEnterイベントに記述して、何もしないGotFocusを用意します。 次に、Form1の選ばれるはずのControlにEnterとGotFocusを用意します。 各々のイベントの最初にブレークポイントを設定します。 Dummy1にFocusが移った場合、どの順番でイベントが発生するかを見ればわかると思います。 解決法は・・・、すみません、わからないです。

すると、全ての回答が全文表示されます。