2

I'm trying to display the progress of various routines on a modeless form, by having those routines raise custom events detailing their progress. The form should handle those events to display appropriate information.

The problem is that although RaiseEvent is called, the event handlers don't then do anything.

The intended result of the following code is the two debug.prints would be called whenever an event is raised by triggerTest.

The only success I've had is with raising the error within the userform, by CommandButton1_Click in the following code. The form's event handler then kicks in (rather redundantly, but perhaps that means I'm on the right path).

Thanks

Event class clsChangeProgressTrigger

Option Explicit

Public Enum geProgressStatus
    geProgressStatusComplete = -1
    geProgressStatusRestart = -2
End Enum

Public Event ChangeProgress(dProgress As Double, sProcedure As String)
'

Public Sub Update(dProgress As Double, sProcedure As String)
    RaiseEvent ChangeProgress(dProgress, sProcedure)
End Sub

Public Sub Complete(sProcedure As String)
    RaiseEvent ChangeProgress(geProgressStatusComplete, sProcedure)
End Sub

Public Sub Restart(sProcedure As String)
    RaiseEvent ChangeProgress(geProgressStatusRestart, sProcedure)
End Sub

User form frmOutput

Option Explicit
Private WithEvents mProgressTrigger As clsChangeProgressTrigger
'

Private Sub CommandButton1_Click()
    Call mProgressTrigger.Update(12.34, "SomeValue")
End Sub

Private Sub CommandButton2_Click()
    Call modZTest.triggerTest
End Sub

Private Sub UserForm_Initialize()
    Set mProgressTrigger = New clsChangeProgressTrigger
End Sub

Private Sub mProgressTrigger_ChangeProgress(dProgress As Double, sProcedure As String)
    Debug.Print "Form Event Handled"
End Sub

Event test class clsEventTest

Option Explicit

Private WithEvents mProgressTrigger As clsChangeProgressTrigger
'

Private Sub mProgressTrigger_ChangeProgress(dProgress As Double, sProcedure As String)
    Debug.Print "Class Event Handled"
End Sub

Private Sub Class_Initialize()
    Set mProgressTrigger = New clsChangeProgressTrigger
End Sub

Test wrapper in public module modZTest

Public Sub triggerTest()

    Application.EnableEvents = True

    ' Instantiate Trigger class for this routine
    ' Dim cChangeProgressTrigger As clsChangeProgressTrigger
    Set gChangeProgressTrigger = New clsChangeProgressTrigger

    ' Instantiate Event Test class, which should handle raised event
    Dim cEventTest As clsEventTest
    Set cEventTest = New clsEventTest

    ' Instantiate user form, which should handle raised event
    Set gfrmOutput = New frmOutput  ' Modeless form, gfrmOutput has global scope
    gfrmOutput.Show

    Stop

    ' Raise an event
    Call gChangeProgressTrigger.Complete("SomeValue")

    ' Tidy Up
    Set gfrmOutput = Nothing
    Set gChangeProgressTrigger = Nothing
    Set cEventTest = Nothing

End Sub
Community
  • 1
  • 1
Chumble
  • 89
  • 5
  • The form needs to has a reference to the change progress trigger instance Maybe [this](http://stackoverflow.com/questions/26887919/close-userform-from-module/26894997#26894997) my answer could be of some help? – Daniel Dušek Nov 30 '15 at 16:57

1 Answers1

1

Thanks Dee, that helped me along to the solution.

With this declared as global scope:

Public gChangeProgressTrigger As clsChangeProgressTrigger

I had to change the class / form level initialisations as follows:

Private Sub UserForm_Initialize()
    ' Set mProgressTrigger = New clsChangeProgressTrigger ' Old
    Set mProgressTrigger = gChangeProgressTrigger ' New
End Sub

and

Private Sub Class_Initialize()
    ' Set mProgressTrigger = New clsChangeProgressTrigger ' Old
    Set mProgressTrigger = gChangeProgressTrigger ' New
End Sub

Then the event handlers fired as desired.

Chumble
  • 89
  • 5