• ベストアンサー

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

  • witheventsについて教えてください。

    お世話になります。 vb6です。 witheventsでフォームのイベントを 処理したい。 form側 1.command1を貼り付け 2.class作成、init() ★3.コマンドをクリックしたら メッセージがでないのですが class側 private withevents cmd as commandbutton public function init() as boolean set cmd = form1.command1 end function private cmd_click() msgbox "ok" end sub 致命的に間違ってると思います。 よろしくお願いいたします。

  • 特定の文字だけ太文字にするには・・

    簡易チャット作ってます。発言者の名前の部分だけ太文字にしようとしてい ます。 テキストボックス2に文を書いてエンターを押すとテキストボックス1に書 花子:~~~  と書き込まれるようにはできました。花子の部分 だけふと文字にするには?? Private Sub Text2_KeyPress(KeyAscii As Integer) If (KeyAscii = 13) Then Text1.Text = Text1.Text + "花子:" + Text2.Text + vbCrLf Text2.Text = "" KeyAscii = 0 End If End Sub

  • VBA エンターキーでイベントに入りたい。

    テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。 これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。) <コーディング> Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Msgbox "通過" If KeyAscii = vbKeyReturn Then KeyAscii = 0 End If End Sub これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

  • 16進数

    Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii >= Asc("a") And KeyAscii <= Asc("f") Then Else KeyAscii = 0 Beep End If End Sub 上のソースだと数字が入りません。 どうすれば入力できますか。 ※zと入れると強制終了になってしまうので、上のソースを入れたんですが・・・ ※タグが崩れて見にくくてすいません

  • テキストボックス内の文字を常に1字に制限する方法を教えてください。

    例えば、Private Sub Text1_KeyPress(KeyAscii) の中で Text1.text=Right(Text1.text,1) のようにすれば、常に右端の1字だけ表示されると思うのですが、 実際にやってみると、2文字表示されてしまうことがしばしばです。

  • vb作成したらでbeep音が鳴ります。経験あるかたお願いします。

    KeyPressイベントを追加して、データ入力後にエンターキーを押すとbeep音が鳴ります。ほかではescキーも鳴りますが、その他は鳴らないで動くようです。 単純に新規作成から、Form1へtestテキストコントロールを追加して、以下の記述をしただけなのですが、どうしてなるのか原因がわかりません。 Private Sub test_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then test.text="ok" End If End Sub ←この次でbeep音! 環境はvb6.0、windows2000。 仕様なのでしょうか? ハード側の問題なのでしょうか? 経験あるかた宜しくお願い致します。

  • キー入力を制限しつつ、Ctrl+CやCtrl+Vを活かすには?

    数字とバックスペース以外入力できないテキストボックスTextBoxAを作りました。 Private Sub TextBoxA_KeyPress(KeyAscii As Integer) If KeyAscii <> vbKeyBack Then If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End If End Sub と記述しましたが、Ctrl+CやCtrl+Vが効きません。 右クリックでコピー、ペーストはできるのですが、コントロールキー によるコピペを可能にするにはどうしたらいいでしょうか? どなたかよろしくお願いします。

  • KeyPressイベントのビープ音

    VB2008です。 Text1でEnterを押すとText2にフォーカスを移す、という処理をしたいのですが、 Private Sub Text1_KeyPress(引数省略)  If e.Keychar=Chr(13) then   Text2.Focus  End If End Sub これだとビープ音が鳴ってしまいます。 鳴らないようにするには、どうしたらいいのでしょうか?

  • Back Spaceを入力可にするには?

    金額を入力して計算するルーチンを作成しています。 以下のコードで、数字以外は入力不可にしたのですが・・・・ 数値を訂正するためのBack Spaceも入力できなくて困っています。 0~9までしか受け付けないコードなのはわかっていますが、それに加えてBack Spaceも受け付けられるようにするにはどんなコードを書けばよいでしょうか。 Private Sub genkin_KeyPress(KeyAscii As Integer) If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Then Exit Sub Else KeyAscii = 0 Beep End If End Sub

  • TextをEnterKeyで選んだ後にLISTBOXを非表示

    OSはWin XP home EXCEL2002を使用しています。 ActivecellにリストボックスのデータをEnterKeyで入れた後にリストボックスの表示をFalseにしたいと思っています。以下のようにすると必ずEXCELが落ちてしまいます。 Private Sub ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = vbKeyReturn Then ActiveCell.Value = ListBox1.Text ListBox1.Visible = False End If End Sub 何がいけないのかよく分かりません。悪い部分の解説もできればお願いしたいと思います。よろしくお願いします。

専門家に質問してみよう