我有一个带有按钮的表单,该按钮在代码模块中调用长时间运行的函数。我想在此过程中将定期状态更新消息返回到表单。我最初的想法是为函数提供一个回调方法,但我不认为VBA支持这个。所以现在我正在尝试使用自定义类和事件。
我创建了一个名为“MessageHandler”的类模块,其中包含以下代码:
Public Event OnMessageReceivedEvent(message As String)
Public Sub MessageReceived(message As String)
RaiseEvent OnMessageReceivedEvent(message)
End Sub
在表格的顶部,我声明:
Dim WithEvents FormMessageHandler As MessageHandler
Private Sub FormMessageHandler_OnMessageReceived(message As String)
AppendLogMessage message
End Sub
然后在表单上的按钮后面的代码中:
Set FormMessageHandler = New MessageHandler
然后我将FormMessageHandler传递给我模块中的长时间运行函数并定期调用:
messageHandler.MessageReceived "Some progress update blah blah"
但是从不调用FormMessageHandler_OnMessageReceived,因此事件不起作用。对我而言,似乎逻辑FormMessageHandler现在已注册为OnMessageReceived事件的侦听器,但它如何知道响应事件的方法调用。似乎缺少的是一种指定类似内容的方法:
FormMessageHandler.OnMessageReceivedEvent = FormMessageHandler_OnMessageReceived
从我所做的搜索来看,它看起来像某种特殊的常量,如: FormMessageHandler.OnMessageReceived =“[Event Procedure]”
哪些可能提供缺失的链接,但我不知道如何使用它?任何帮助将不胜感激。
答案 0 :(得分:2)
好的,我已经弄明白了,感谢这里出色的指南:http://sourcedaddy.com/ms-access/creating-custom-events.html(它实际上是在第三页http://sourcedaddy.com/ms-access/exploiting-access-class-module-events.html)。
如果以某种方式命名并且我在名称末尾错过了 event 这个词,那么当自动引发事件时,将会创建接收事件的方法的链接。
Private Sub FormMessageHandler_OnMessageReceived(message As String)
应该被称为:
Private Sub FormMessageHandler_OnMessageReceivedEvent(message As String)
创建此方法的最可靠方法是执行指南建议:
WithEvents关键字几乎是神奇的。一旦你获得了资格 使用WithEvents的对象声明,对象的名称出现在 类模块顶部的下拉列表和对象的下拉列表 事件显示在右侧下拉列表中。
从下拉列表中选择FormMessageHandler对象会自动创建我需要使用该事件的方法(当我将它与我所看到的时间进行比较时,我看到了我在命名时所犯的错误。)
答案 1 :(得分:0)
此状态消息是您希望定期发送还是仅在代码中的某些位置发送?
如果是前者,您可以考虑使用OnTimer事件,它将允许您中断控制并更新状态字段。以下内容可能对您有用:
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 3000 'milliseconds
End Sub
Private Function ReallyLongFunction()
For i = 1 To 99999
'Do stuff
DoEvents
Next i
End Sub
Private Sub Form_Timer()
Me!Status = "My update status"
End Sub
如果是后者,我不确定为什么更新表单并进行刷新是行不通的。我不知道事件监听器是否真的可以在Microsoft Access中工作。