• ベストアンサー

WithEventsの処理について

複数あるテキストボックス(text1、text2…)にキーボードから入力したらメッセージを出すという独自のイベント処理を 共通の関数を使用しようとした時に以下の処理が挙げられるですがこの処理について <クラスモジュール(MsgEvent)> Public WithEvents MsgTextBox As TextBox   Private Sub MsgTextBox_KeyPress(KeyAscii As Integer) MsgBox MsgTextBox.name ……(1) End Sub <フォームモジュール> Dim Hairetu(1) As New MsgEvent Private Sub Form_Load() Set Hairetu(0).MsgTextBox = Text1 ……(2) Set Hairetu(1).MsgTextBox = Text2 End Sub 上記の(1)についてnameプロパティの意味がわかりません。 調べたら値の取得とあるのですがその値とは(2)で言えば「=text1」にあたるということですか? それと(2)のSetを定義しないといけない理由がよくわからないのでお教えください。 よろしくお願いします。

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

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

 恐らくVB6をお使いと思います。  まずコードの構成ですが、<フォームモジュール>側の   Dim Hairetu(1) As New MsgEvent で、<クラスモジュール(MsgEvent)>の配列を宣言し、そのPublic変数   Public WithEvents MsgTextBox As TextBox にTextBoxであるText1,Text2をそれぞれ渡して、Hairetu(i)とText(i+1)とを接続しています。   Set Hairetu(i).MsgTextBox = Text(i+1) の部分ですが、これはMsgEvent型であるHairetu(i)のTextBox型変数MsgTextBoxに、TextBox型のText(i+1)を代入しているだけです。  TextBox型はクラスなので、そのインスタンスText(i+1)はObject型に属します。VB6では、Object型の代入を行う時には、必ずSetをつける仕様になっています(要するに決まりです)。   MsgBox MsgTextBox.name の部分は、Text(i+1)のKeyPress Eventに接続されたはずのMsgTextBox_KeyPress Eventが、本当にText(i+1)に接続されたかどうかの確認メッセージを出しているだけです。  「値の取得」となっているのは、VBコントロールでは、そのNameプロパティーと変数名は一致するという原則があるので、Nameプロパティーを調べれば、Text(i+1)で表される変数値を調べたのと同じ、という意味です。  Text(i+1).Name自体は、Text(i+1)に格納されたTextBoxの名前なので、単なる文字列です。  わかりにくいですよね。

eiki0520
質問者

お礼

そういうことでしたか。 本当にありがとうございます。 これを機に似たようなケースを自分で考えてみようと思います。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

WithEventsは入れ物を用意するだけで実体がありません クラスで定義されたイベント用のオブジェクトが作られるだけなのです オブジェクトの実体を設定するのがSetステートメントです nameはTextBoxオブジェクトのプロパティです フォームに myText1といった名前のテキストボックスがあった場合 Set Hairetu(0).MsgTextBox = myText1 といった具合にします ここでいう『名前』はプロパティウィンドウの『オブジェクト名』に設定されているものです

eiki0520
質問者

お礼

わかりやすい回答ありがとうございます。 これを機に自分でいろいろ勉強していこうと思います。

関連するQ&A

専門家に質問してみよう