有时候,我们需要接收到窗体中的事件,然后使用此事件作为触发器来改变其他的窗体控件。
下面,以文本框为例来介绍这个技巧。如下图1所示,用户窗体中有3个用于输入的文本框,最底部是一个名为Label1的标签,用来实时显示文本框中输入的文字数。 图1
目的 当用户在任一文本框中输入文本时,底部的Label1标签中将实时显示该文本框中输入的文本长度以及文本内容。
程序代码 在VBE中,插入一个名为clsDelegate的类模块,输入下面的代码: PublicEvent txtBoxChanged(txtBox As MSForms.TextBox)
PublicSub PassControl(txtBox As MSForms.TextBox) RaiseEventtxtBoxChanged(txtBox) EndSub
接着插入一个名为clsEvents的类模块,输入下面的代码: PublicWithEventstxtBox As MSForms.TextBox Privatem_cDelegate As clsDelegate
PublicProperty Set cDelegate(value As clsDelegate) Set m_cDelegate = value EndProperty
PrivateSub txtBox_Change() m_cDelegate.PassControltxtBox EndSub
在用户窗体的代码为: PrivatecEvents As clsEvents PublicWithEventscDelegateAsclsDelegate PubliccollControls As Collection
PrivateSub UserForm_Activate() Dim ctl As MSForms.Control
Set cDelegate = New clsDelegate Set collControls = New Collection ForEach ctl In Me.Controls If TypeOfctlIsMSForms.TextBox Then Set cEvents = New clsEvents Set cEvents.cDelegate = cDelegate Set cEvents.txtBox = ctl collControls.Add cEvents End If Next ctl EndSub
PrivateSub cDelegate_txtBoxChanged(txtBox As MSForms.TextBox) Me.Label1.Caption = txtBox.Name& '文本长度是' _ &Len(txtBox.Text)& '. 文本内容是: ' &txtBox.Text EndSub
最终的结果 运行后的结果如图2所示。 图2
小结 本示例展示了如何通过使用一个委托类将每一个WithEvents控件与RaiseEvent相连接并接收用户窗体中的事件的技巧。例如,本示例中修改任意一个文本框内容触发另一个窗体控件(标签控件)作出相应的变化。
|
|