Top / クラスプログラミング / 06.イベントをフックする

VB5.0 からの機能なのですが、WithEvents キーワードでイベントをフックする部品を作ることができます。 これにより、多機能なコントロールを実現することが可能です。

たとえば、KeyPress イベントをフックして、数字しか受け付けないようなテキストボックスを作成することが出来ます。

どのようにすればよいかというと、KeyAscii をチェックして、数字以外のキーコードだったら、ゼロを代入してあげればよいわけです。

次のようなクラス、CHook を作成してみましょう。

Option Explicit

Public WithEvents txtHook As TextBox
Private Sub txtHook_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
        Case vbKeyBack, Asc("0") To Asc("9")
        Case Else
            KeyAscii = 0
    End Select
End Sub

<注意>
(1) カーソルキーや、Delete キーなどのキーを押しても、KeyPress イベントは起きませんが、 Back Space キーだけは、イベントが起きてしまいます。
KeyAscii = vbKeyBack をチェックして、なにもしないようにしてください。
(2) 貼り付けを行ったときは、KeyPress イベントは発生しません。
きちんと作るなら、サブクラス化して WM_PASTE をキャッチし、不要なキャラクタを削除しますが、ここでは説明しません。

さて、このクラス(CHook)を、どのように使うかというと、フォームにテキストボックスを一枚貼り付けて、次のようにコーディングします。

Option Explicit
Dim objHook As CHook
Private Sub Form_Load()
    Set objHook = New CHook
    Set objHook.txtHook = Text1
End Sub

これで、Text1 は、数字しか受け付けなくなるはずです。
複数のテキストボックスが対象なら、オブジェクト変数を複数作れば良いだけですね。

でも、ちょっと困ったことがあるのです。

それは、WithEvents キーワードを指定したオブジェクト変数には、配列コントロールへの参照が Set できない事です。

たとえば、上の例でいうと

Set objHook.txtHook = Text1(0)

とやると、

実行時エラー'459':
オブジェクトまたはクラスがこのイベントセットをサポートしていません。

と、VB が、お怒りになられます。

こういう時は、テキストボックスを配列にしないで、オブジェクト変数を配列にしてやりましょう。

Dim objHook(2) As CHook
Set objHook(0).txtHook = Text1
Set objHook(1).txtHook = Text2
Set objHook(2).txtHook = Text3

という具合です。

配列としてテキストボックスのプロパティを使いたいときは

Public txtHook As TextBox

で公開しているプロパティを使えば、配列として使えます。

For i = 0 To 2
   strHOGE(i) = objHook(i).txtHook.Text
Next

コントロール配列は、一次元配列にしかなりませんが、この方法だと、2次元、3次元の配列として使うこともできます。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-10-27 (火) 02:41:17 (2850d)