【发布时间】:2018-09-03 07:50:30
【问题描述】:
我已经研究并阅读了我能找到的所有内容。我很可能已经看到了我的问题的解决方案,但没有认识到它。森林对我来说似乎太厚了。
我在 vb.net - VS2010 中编写了一个 dll。在 vb.net 项目中使用时,它可以完美运行。我已启用 COM 等以使其与 VB6 一起使用。
在我需要这些事件之前,它会按照 VB6 中的计划工作。但是现在试图让 WithEvents 部分工作是我完全迷失的地方!
一旦时间比较函数变为真(或相等),我的 VB.Net dll 就会引发一个事件。它还返回事件的实际时间。
在我的 VB6 项目中,使用 WithEvents 函数要求声明位于类模块中。我无法理解这将/应该如何工作。 正如我之前所说,我读过的许多帖子都指出它必须在一个类模块中,但没有一个确切地说明如何以一种干净直接的方法来完成这一点。好吧,至少在我看来是直截了当的。
以下代码是我在添加事件之前如何使用 dll。所有属性和操作等都可以正常工作。它位于 .bas 模块中。
Public PT As New PrecisionTimer.PrecisionTimer
这是如何在表单上使用它的示例:
Private Sub Command3_Click()
Dim aa As Integer
aa = PT.SetTimerEvent(Val(Text6.Text))
Select Case aa
Case -1
OkToInitiate = True
Case False
OkToInitiate = False
End Select
End Sub
但现在我需要对 dll 中的事件做出反应。 这是引发事件的 VB.Net dll 中的行:
RaiseEvent OTE(ActualTriggeredTime.ToString())
那么,谁能帮助我,我真的很难弄清楚如何完成这个。
谢谢!
更多信息:
@TnTinMn,在某种程度上你是对的,CM 从来都不是我的强项。这是 MyClass 中的代码:
Option Explicit
Public WithEvents PTM As PrecisionTimer.PrecisionTimer
Private Sub PTM_OTE(ByVal ActualTriggeredTime As Variant)
Dim aa As Integer
aa = 1
End Sub
现在可以删除PTM_OTE sub,自动出现一个新的,当然不用aa = 1代码。
在我的 Module1.bas 中:
Option Explicit
Public PT As New MyClass.PTM
Public OkToInitiate As Boolean
您在我的代码中看到错误了吗?
在对象浏览器中,我确实看到了 OTE 事件。在这一点上,我想我应该能够在左上角的代码编辑器下拉菜单中看到 PT,但我没有?!?!
更多信息:
我在 VB.Net dll 中的事件例程中添加了一个附加函数 - TriggeredFlag。
Public Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
'Other code including basic error handling
RaiseEvent OTE(ActualTriggeredTime.ToString())
TriggeredFlag = True
End Sub
现在当我在我的 vb6 项目中使用 dll 时,我可以监控 TriggeredFlag。它确实按预期发生了变化。然而,似乎没有收到事件。我相信问题出在 VB6 代码中 - 类模块中的 WithEvents 语句(可能)。这是我的整个班级模块:
Option Explicit
Public WithEvents PTM As PrecisionTimer.PrecisionTimer
Public Sub Class_Initialize()
Set PTM = New PrecisionTimer.PrecisionTimer
End Sub
Private Sub PTM_OTE(ByVal ActualTriggeredTime As String)
Dim aa As Integer
aa = 1
End Sub
最终附加信息:
感谢所有帮助解决此问题的人! 这是我的 Module1.Bas 的最终结果:
Option Explicit
Public PT As New PrecisionTimer.PrecisionTimer
Public DT As New DTParams
Public OkToInitiate As Boolean
在表格的常规部分:
Option Explicit
Public WithEvents TimerEvents As PrecisionTimer.PrecisionTimer
Form_load 例程包括:
Set TimerEvents = PT
这是 TimerEvents_OTE 例程:
Private Sub TimerEvents_OTE(ByVal ActualTriggeredTime As String)
'Fires when the "Timer Done" event fires
Call SetTimerText(ActualTriggeredTime)
End Sub
最后,没有使用任何类模块。
再次感谢大家!
【问题讨论】:
-
您在 VB6 中没有显式订阅事件,约定是给事件处理程序正确的名称。应该类似于带有这些 sn-ps 的 Sub PT_OTE(time As String),假设 PT 是声明 WithEvents 的变量,OTE 是事件的名称。否则与 Command3_Click 相同的想法,处理名为 Command3 的对象的 Click 事件。
-
@Hans,是的,你是对的 - PT 是用 WithEvents 声明的变量,而 OTE 是事件的名称。 1.我不清楚事件处理程序驻留在哪里。 2.intellesense不应该显示PT Sub吗?
-
由于您没有向我们展示 VB.Net 代码以及如何将其暴露给 COM,我将引导您阅读文章:Walkthrough: Creating COM Objects with Visual Basic。这使它非常轻松。
-
@TnTinMn 是的,这是我最初使用的方法。我也刚刚重新验证了我的代码是这样的。
-
@TnTinMn,在某种程度上你是对的,CM 从来都不是我的强项,但是......这是 MyClass 中的代码: Option Explicit Public WithEvents PTM As PrecisionTimer.PrecisionTimer Private Sub PTM_OTE( ByVal ActualTriggeredTime As Variant) Dim aa As Integer aa = 1 End Sub