下記のようにしてコントロール配列のイベントを受け取りたいのですが、
うまくいきません。
※コントロール配列にすると
「オブジェクトまたはクラスがこのイベントをサポートしていません」
とエラーになります。
※WithEventsでむりでしょうか?
他に方法はないのでしょうか?
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
コントロール配列のイベント処理を共通で処理したいのですが・・・。
ご教授ください。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
【フォームの処理】
Private clsTest As Class1
Private Sub Form_Load()
Set clsTest = New Class1
’ここでエラーになります。 Text1としてもダメでした。
Set clsTest.txt_Text = Text1.Item(0)
End Sub
【クラスの処理】
Public WithEvents txt_Text As TextBox
Private Sub txt_Text_GotFocus()
MsgBox "txt_Text_GotFocus"
End Sub
VB6と仮定してお答えします。
こんな感じでだめですか?
もしクラスでやる場合は、コントロール配列はだめだったような…
Private Sub Form_Load()
Dim intIndex As Integer
For intIndex = 1 To 4
Load Text1(intIndex)
With Text1(intIndex)
.Top = Text1(intIndex - 1).Top + Text1(intIndex - 1).Height + 50
.Visible = True
End With
Next intIndex
End Sub
Private Sub Text1_GotFocus(Index As Integer)
MsgBox Index & "GotFocus"
End Sub
過去ログに同じような質問がありました。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200407/04070056.txt
結論から言うとコントロール配列のイベントはWithEventsではとれません。
別の方法を考えてください。
結論から言うと『できません』。
イベント引数が違う事からもわかりますように、
「通常のTextBox」と「コントロール配列のTextBox」は、
実際には別の種類のコントロールです。
「コントロール配列のTextBox」は、「通常のTextBox」から派生しているため、
どちらも『Private X As TextBox』な変数に格納する事ができます。しかし、
WithEvents 付きの変数に格納した場合には、実行時エラーとなります。
これは、コントロール配列に限った話ではなく、自作クラスでも起きる現象です。
'===== クラスモジュール [BaseClass] (基本となるクラス)
Option Explicit
Public Event Completed()
Public Sub Finish()
End Sub
'===== クラスモジュール [DerivedClass] (派生クラス)
Option Explicit
Implements BaseClass
Public Event Completed()
Private Sub BaseClass_Finish()
RaiseEvent Completed
End Sub
'===== フォームモジュール [Form1] (呼び出し側)
Option Explicit
Private WithEvents BC As BaseClass
Private WithEvents DC As DerivedClass
Private Sub Command1_Click()
Set DC = New DerivedClass
Set BC = New BaseClass
Set BC = DC '←実行時エラー459
BC.Finish
Set BC = Nothing
Set DC = Nothing
End Sub
みなさん書込みありがとうございました。
コントロール配列(自作クラス)のWithEventsはできないようですね。
残念です。
-----------------------------------------------
okuさんの件について
-----------------------------------------------
動的にコントロール配列を作る方法ですね。
各フォーム内であれば有効だと思いますが、
全てのフォームの処理を共通処理としたいので。。。
案をありがとうございました。
※各画面ごとに、イベントで同じ処理を書いていますので
どうにかして共通化したかったもので。。。
同じイベントを全ての画面で書くのも大変でしたので。。。
イベントを共通化しようと考えました。
コントロールにしない方法でやるしかないですかね。
ありがとうございました。
処理内容が全く同じならユーザーコントロールを作るとか。
Indexで処理を分岐したい場合は、だめですけど…
ツイート | ![]() |