Top > Programmingとか > VB / VB.NET > 泥Tips

(17) VB2003:Tabキーを拾えるTextBoxコントロールを作ってみる

検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004

前提として。

  • TextBoxコントロールのデフォルトでは、Tabキーは次のTabIndexを持つコントロールへのフォーカスの移動。

  • 旧VBではKeyDownイベントプロシージャが優先して評価され、これを抜けてからデフォルトの動作となっていました。
    つまりデフォルトの動作をツブして独自の動作をさせることができたわけです。

  • VB.NETではTabキーや矢印キーの押下ではKeyDownイベントが発生しません。
    コントロール内部でフックされて、こちらでコーディングしたプロシージャまでメッセージが届かないんですね。
って状況下で、Tabキー押下時のアクションを自前で用意したい場合。

ふつーに考えれば、TextBoxから、Tabキー押下時のイベントをこっち側に持ってくるような派生クラス作ってしまえばいいんですけれども。

クラスってWindows Formデザイナの管理の対象外なもんで、せっかく作っても[ツールボックス]-[マイユーザーコントロール]に表示されないんですよね。
コードでインスタンス作ってFormに割り当てて表示位置とか属性とか決めて、ってやらなきゃならないんですよ。つまり、Windows Formエディタの管理外となりますので、大変作りにくい状況になってしまぅわけです。

かといってユーザーコントロールとして作るとツールボックスには表示されるものの、Control型のオブジェクトになってしまぅので、TextBox特有のプロパティなんかを明示的に公開するよぅに作り込まなければならないのも手間ですし、デザイン時にそこだけすでに実行されているのも個人的には大変気に食いません。

もちろん高度に特殊なコントロールを作るのなら上記の手間やら動作やらもわかった上で積極的に使っていくつもりはありますが、たかがTextBoxにTabをスルーさせるためだけにユーザーコントロール、ってのもちょっとおもしろくないよぅな気がします。

てことで、[ツールボックス]に表示される派生クラスの作り方。

  1. 「新しい項目の追加」で「ユーザーコントロール」を追加します。

    いゃいいから。「ユーザーコントロール」でいいから。
    ファイル名は「U_Test.vb」とでもしてみます。
    この時点で、[マイユーザーコントロール]には「U_Test」コントロールが表示されます。

  2. U_Test.vbのコードエディタを表示させます。

  3. 「Inherits System.Windows.Forms.UserControl」の「UserControl」を「TextBox」に書き換えます。

    書き換えたとたんに、ソリューションエクスプローラに表示されている「U_Test.vb」のアイコンがユーザーコントロールのではなくコンポーネントクラスのになります。

    でも[ツールボックス]-[マイユーザーコントロール]の中ではユーザーコントロールアイコンのまま表示されてます。

    で、この時点で「U_Test.vb」の[デザイン]ウィンドウを開いていたら、フチなしFormのようなデザイン領域の表示が消えて「クラスにコンポーネント追加するには、~」といぅまか不思議な文章が表示されますが気にしないでけっこぅです。

  4. 今回はTabキーをKeyDownイベントで取り扱えるよぅにしたいわけですから、IsInputKeyメソッドをオーバーライドするコードを書いてしまいます。

    書く位置はU_Testクラスの内側、「Windowsフォームデザイナで生成されたコード」の下。
    Protected Overrides Function IsInputKey( _
    ByVal keyData As System.Windows.Forms.Keys) As Boolean
    If (keyData = Keys.Tab + Keys.Shift) _
    Or (keyData = Keys.Tab) Then
    Return True
    Else
    Return MyBase.IsInputKey(keyData)
    End If
    End Function
    こんな感じで。

  5. 一度ビルドします。

    ビルドしないと、作成したユーザーコントロールは使えないので。
    [マイユーザーコントロール]には表示されているんだからってドラッグとかしてみると、「ユーザーコントロール'*****.U_Test'を読み込めませんでした。~」って赤バッテンMessegeBoxが表示されます。
以上で、ユーザーコントロールと同様に[ツールボックス]からドラッグできる派生クラスのできあがりです。

ちなみに、こーやって作った派生クラスファイルを他のプロジェクトで使用しようとして「既存項目の追加」で読み込んでも、[ツールボックス]には表示されません。

この場合は、読み込んだU_Test.vbをコードエディタで開き、上記(3)で書き換えた 「Inherits System.Windows.Forms.TextBox」の「TextBox」を「UserControl」に書き戻して、デザイナでも開きます。

これで[ツールボックス]に表示されますので、再度「UserControl」を「TextBox」に書き戻します。

なんだか単にデザイナをだましているだけのよぅな気もしますし、2005とかで通用する手段かどぅかはわからないわけなんですが。
今んとこは割と重宝しています。

トラックバック

このエントリーのトラックバックURL:
http://salv.miscnotes.com/mt/mt-tb.cgi/427

コメントを投稿