(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イベントが発生しません。
コントロール内部でフックされて、こちらでコーディングしたプロシージャまでメッセージが届かないんですね。
ふつーに考えれば、TextBoxから、Tabキー押下時のイベントをこっち側に持ってくるような派生クラス作ってしまえばいいんですけれども。
クラスってWindows Formデザイナの管理の対象外なもんで、せっかく作っても[ツールボックス]-[マイユーザーコントロール]に表示されないんですよね。
コードでインスタンス作ってFormに割り当てて表示位置とか属性とか決めて、ってやらなきゃならないんですよ。つまり、Windows Formエディタの管理外となりますので、大変作りにくい状況になってしまぅわけです。
かといってユーザーコントロールとして作るとツールボックスには表示されるものの、Control型のオブジェクトになってしまぅので、TextBox特有のプロパティなんかを明示的に公開するよぅに作り込まなければならないのも手間ですし、デザイン時にそこだけすでに実行されているのも個人的には大変気に食いません。
もちろん高度に特殊なコントロールを作るのなら上記の手間やら動作やらもわかった上で積極的に使っていくつもりはありますが、たかがTextBoxにTabをスルーさせるためだけにユーザーコントロール、ってのもちょっとおもしろくないよぅな気がします。
てことで、[ツールボックス]に表示される派生クラスの作り方。
- 「新しい項目の追加」で「ユーザーコントロール」を追加します。
いゃいいから。「ユーザーコントロール」でいいから。
ファイル名は「U_Test.vb」とでもしてみます。
この時点で、[マイユーザーコントロール]には「U_Test」コントロールが表示されます。 - U_Test.vbのコードエディタを表示させます。
- 「Inherits System.Windows.Forms.UserControl」の「UserControl」を「TextBox」に書き換えます。
書き換えたとたんに、ソリューションエクスプローラに表示されている「U_Test.vb」のアイコンがユーザーコントロールのではなくコンポーネントクラスのになります。
でも[ツールボックス]-[マイユーザーコントロール]の中ではユーザーコントロールアイコンのまま表示されてます。
で、この時点で「U_Test.vb」の[デザイン]ウィンドウを開いていたら、フチなしFormのようなデザイン領域の表示が消えて「クラスにコンポーネント追加するには、~」といぅまか不思議な文章が表示されますが気にしないでけっこぅです。 - 今回は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 - 一度ビルドします。
ビルドしないと、作成したユーザーコントロールは使えないので。
[マイユーザーコントロール]には表示されているんだからってドラッグとかしてみると、「ユーザーコントロール'*****.U_Test'を読み込めませんでした。~」って赤バッテンMessegeBoxが表示されます。
ちなみに、こーやって作った派生クラスファイルを他のプロジェクトで使用しようとして「既存項目の追加」で読み込んでも、[ツールボックス]には表示されません。
この場合は、読み込んだU_Test.vbをコードエディタで開き、上記(3)で書き換えた 「Inherits System.Windows.Forms.TextBox」の「TextBox」を「UserControl」に書き戻して、デザイナでも開きます。
これで[ツールボックス]に表示されますので、再度「UserControl」を「TextBox」に書き戻します。
なんだか単にデザイナをだましているだけのよぅな気もしますし、2005とかで通用する手段かどぅかはわからないわけなんですが。
今んとこは割と重宝しています。