如何从不同的类访问ThisAddIn中的VB.net计时器

时间:2011-07-28 11:34:26

标签: vb.net vsto

我在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

我收到'对象引用未设置为对象实例'的错误。任何人都可以解释我如何设置计时器吗?

提前致谢,

3 个答案:

答案 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

访问实例化的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