[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/05/21(Mon) 15:53
投稿者名:こう
Eメール:
URL :
タイトル:
モジュール
いくつかフォームがあり、その中でテキストボックスを使用しています。
テキストボックスは、文字数制限以外同じコードになっているものが多く、クラスモジュールを使い
コードをすっきりさせようと思いました。
クラスモジュールに共通コードを書いてそれぞれに認識させようと思ったのですがうまくいきません。
どこがよくないのでしょうか?

クラスモジュール
Option Explicit

Public WithEvents SlaveTextBox As TextBox
Private Sub SlaveTextBox_KeyPress(KeyAscii As Integer)
'テキストに入力可能な文字設定
If KeyAscii <> vbKeyBack Then
    If KeyAscii = 3 Or KeyAscii = 22 Or _
        KeyAscii = 24 Or KeyAscii = 26 Then Exit Sub
        If Not Chr(KeyAscii) Like "[a-zA-Z0-9]" Then
            KeyAscii = 0
        End If
    End If
    
End Sub

フォーム側
    Dim Class1(2) As New Class1
    Set Class1(0).SlaveTextBox = Text1
    Set Class1(1).SlaveTextBox = Text2
    Set Class1(2).SlaveTextBox = Text3

投稿時間:2007/05/21(Mon) 16:50
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: モジュール
> コードをすっきりさせようと思いました。
その手法の場合、「コントロール配列」が使用できなくなるという縛りがあるので、ご注意あれ。


> どこがよくないのでしょうか?
変数の有効期間の問題ですね。

Class1 オブジェクトが、プロシージャ内で宣言された「ローカル変数」であるため、
プロシージャ終了と同時に、クラスのインスタンスが破棄されてしまうためです。

クラス側に下記のようなコードを書いておくと、問題点が見えてくるでしょう。

 Private Sub Class_Initialize()
  Debug.Print "==>作成:"; ObjPtr(Me)
 End Sub
 Private Sub Class_Terminate()
  Debug.Print "<==破棄:"; ObjPtr(Me)
 End Sub



この場合は、変数宣言をフォームの宣言セクションに移し、
モジュール レベルの変数としてみてください。それで解決できるかと思います。

投稿時間:2007/05/21(Mon) 17:08
投稿者名:こう
Eメール:
URL :
タイトル:
Re^2: モジュール
魔界の仮面弁士さんのご指摘通りでした。
>この場合は、変数宣言をフォームの宣言セクションに移し、
>モジュール レベルの変数としてみてください。それで解決できるかと思います。
変数宣言をOption Explicitのところにもっていくことにより解決しました。
ありがとうございました。