如何从其他类访问此插件中的VB.net计时器
我已在Office插件(在VB.net中开发)中设置了计时器,可以使用以下代码将其设置为正常运行:如何从其他类访问此插件中的VB.net计时器,vb.net,vsto,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
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
当用户更改加载项功能区中的设置时,我想调用此计时器,但我似乎无法访问该事件。如果我使用代码:
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
我得到一个错误“对象引用未设置为对象的实例”。有人能解释一下我如何设置计时器吗
提前感谢,您的代码无法工作,因为
myCaller
未设置为您的ThisAddIn
的特定实例(理论上,可能有许多ThisAddIn
实例在内存中浮动)
但是,由于您正在开发office加载项,因此实际上只有一个ThisAddIn实例。访问计时器的一个简单解决方法是将Timer1设置为共享变量:
Friend Shared WithEvents Timer1 As System.Timers.Timer
这将允许您以ThisAddIn.Timer1
的身份访问计时器
(请注意,一般来说,可公开访问的共享字段(也称为全局变量)是一个坏主意。但是,在您的情况下,它可能只是允许您执行所需操作的最简单解决方案。)
PS:您可能想了解类和类实例之间的区别
编辑:由于计时器附带了一个事件处理程序,因此 (a) 还需要共享事件处理程序(
Private shared Sub Timer1\u expressed…
),这有一个缺点,即事件处理程序无法再访问此插件的实例变量,或者
(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
您可以使计时器本身共享,但更优雅的方法是将启动计时器的函数/子函数设置为公共函数,并将其称为如果这对其他任何人都有用,您还可以通过
Globals访问实例化的ThisAddIn对象。ThisAddIn
所以
在项目的其他地方:
Public Class MyClass
Private Sub DoSomething()
Dim myint= Globals.ThisAddIn.N
End Sub
End Class
谢谢你的回答-只有一个问题;现在我有了public sub,但当我尝试调用它时,startTimer()不起作用,因为它没有在这个模块中定义。myCaller.startTimer()给出了一个错误,即对象引用未设置为对象的实例…您好,谢谢您的建议。现在唯一的问题是,当我尝试访问计时器时,我收到一条新的错误消息“shared WithEvents变量的事件不能由非共享方法处理”。知道如何解决它吗?@user867358:添加“共享”方法定义的关键字:
Private Shared Sub Timer1\u appeased…
Hi Heinzi-如果不使用实例位,它可以工作!me需要替换为ThisAddIn,但它无法识别实例方式。。。