需要帮助在MSAccess VBA中连接自定义事件

时间:2016-02-18 22:43:37

标签: vba class ms-access events

我有一个带有按钮的表单,该按钮在代码模块中调用长时间运行的函数。我想在此过程中将定期状态更新消息返回到表单。我最初的想法是为函数提供一个回调方法,但我不认为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]”

哪些可能提供缺失的链接,但我不知道如何使用它?任何帮助将不胜感激。

2 个答案:

答案 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中工作。