こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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を定義しないといけない理由がよくわからないのでお教えください。
よろしくお願いします。

投稿日時 - 2008-01-21 01:32:58

QNo.3698841

困ってます

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

 恐らく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の名前なので、単なる文字列です。

 わかりにくいですよね。

投稿日時 - 2008-01-21 13:02:23

お礼

そういうことでしたか。
本当にありがとうございます。

これを機に似たようなケースを自分で考えてみようと思います。

投稿日時 - 2008-01-21 23:16:19

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

WithEventsは入れ物を用意するだけで実体がありません
クラスで定義されたイベント用のオブジェクトが作られるだけなのです

オブジェクトの実体を設定するのがSetステートメントです
nameはTextBoxオブジェクトのプロパティです

フォームに myText1といった名前のテキストボックスがあった場合
Set Hairetu(0).MsgTextBox = myText1
といった具合にします
ここでいう『名前』はプロパティウィンドウの『オブジェクト名』に設定されているものです

投稿日時 - 2008-01-21 14:59:01

お礼

わかりやすい回答ありがとうございます。

これを機に自分でいろいろ勉強していこうと思います。

投稿日時 - 2008-01-21 23:19:06

あなたにオススメの質問