我在Office插件(在VB.net中开发)中设置了一个计时器,我可以使用以下代码设置正常:
Public Class ThisAddIn
Friend WithEvents Timer1 As System.Timers.Timer
Private Sub ThisAddIn_Startup() Handles Me.Startup
Me.Timer1 = New System.Timers.Timer()
Me.Timer1.Interval = 500
Me.Timer1.Enabled = True
End Sub
Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
Me.Timer1.Enabled = False
MsgBox("Code Ran!")
End Sub
我想在用户更改插件功能区中的设置时调用此计时器,但我似乎无法访问该事件。如果我使用代码:
Public Class ServerRibbon
Public myCaller As ThisAddIn
private sub respondToClick()
Dim blah As System.Timers.Timer
blah = myCaller.Timer1
blah.Enabled = True
end sub
我收到'对象引用未设置为对象实例'的错误。任何人都可以解释我如何设置计时器吗?
提前致谢,
答案 0 :(得分:2)
您的代码无效,因为myCaller
未设置为ThisAddIn
的特定实例(理论上,您的内存中可能会有很多ThisAddIn
个实例)。
但是,由于您正在开发一个办公室加载项,实际上只有一个ThisAddIn实例。访问计时器的一个简单的解决方法是使Timer1成为共享变量:
Friend Shared WithEvents Timer1 As System.Timers.Timer
这将允许您以ThisAddIn.Timer1
访问计时器。
(注意,一般,公共可访问的共享字段(也称为全局变量)是一个坏主意。但是,在您的情况下,它可能只是最简单的解决方案,允许您做什么你想要。)
PS:您可能想要了解类与类实例之间的区别。
编辑:由于您有一个附加到计时器的事件处理程序,您可以
(a)需要共享事件处理程序(Private Shared Sub Timer1_Elapsed...
),其缺点是您的事件处理程序不能再访问ThisAddIn的实例变量,或
(b)通过单独的属性访问ThisAddIn
的实例,而不是让字段共享:
Public Class ThisAddIn
Friend WithEvents Timer1 As System.Timers.Timer
Private Shared _instance As ThisAddIn
Public ReadOnly Shared Property Instance() As ThisAddIn
Get
Return _instance
End Get
End Property
Private Sub ThisAddIn_Startup() Handles Me.Startup
_instance = Me
Me.Timer1 = New System.Timers.Timer()
Me.Timer1.Interval = 500
Me.Timer1.Enabled = True
End Sub
...
Public Class ServerRibbon
Private Sub respondToClick()
ThisAddIn.Instance.Timer1.Enabled = True
End Sub
End Class
答案 1 :(得分:0)
你可以让Timer本身共享,但更优雅的方法是使一个函数/ sub启动定时器成为一个公共函数并调用它
答案 2 :(得分:0)
如果这对其他人有用,您还可以通过Globals.ThisAddIn
所以,
Public Class ThisAddIn
Public N As Integer = 42
...
End Class
以及项目的其他地方:
Public Class MyClass
Private Sub DoSomething()
Dim myint= Globals.ThisAddIn.N
End Sub
End Class