1

我有一个用户窗体(frmProgress),它应该用标签显示进程的进度。在一个类模块 (clsProgressForm) 中,我创建了 UserForm,如下所示:

Option Explicit

Public Event UpdateProgress(ByVal str As String)

Private Sub Class_Initialize()
    Dim frm As frmProgress
    Set frm = New frmProgress
    Load frm 
    frm.Show vbModeless

    RaiseEvent UpdateProgress("test")
End Sub

用户窗体包含以下代码:

Option Explicit

Private WithEvents frm As MSForms.UserForm

Private Sub frm_UpdateProgress(ByVal str As String)
    lblUpdate.Caption = str
End Sub

然而,用户窗体上的 frm_UpdateProgress 事件永远不会被调用。如何使用事件更新用户窗体?

4

1 回答 1

1

如果您希望此特定示例按照您的想法工作,则需要更改几件事:

进度:

Option Explicit

Public WithEvents oProgressFormClassInstance As clsProgressForm
'The WithEvents here implies that whenever the specific object referenced by this variable
'throws an event, it will trigger the event handler for that event in this class (form)

Private Sub oProgressFormClassInstance_UpdateProgress(ByVal str As String)
    lblUpdate.Caption = str
End Sub

clsProgressForm:

Option Explicit

Public Event UpdateProgress(ByVal str As String)

Private Sub Class_Initialize()
    Dim frm As frmProgress
    Set frm = New frmProgress

    Set frm.oProgressFormClassInstance = Me

    Load frm
    frm.Show vbModeless

    RaiseEvent UpdateProgress("test")
End Sub

一个测试模块 mdlTest:

Public Sub Test()
    Dim oProgressForm As clsProgressForm
    Set oProgressForm = New clsProgressForm
End Sub

运行该Test函数以查看正在运行的表单和类。如果您仍然不确定事件是如何运作的,请告诉我,我可以扩展答案。

于 2013-11-08T19:47:45.957 回答