Как я могу получить доступ к таймеру VB.net в ThisAddIn из другого класса - PullRequest
0 голосов
/ 28 июля 2011

Я установил таймер в надстройке 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 ]

2 голосов
/ 28 июля 2011

Ваш код не работает, потому что 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
0 голосов
/ 22 мая 2013

В случае, если это полезно для кого-то еще, вы также можете получить доступ к созданному объекту ThisAddIn через 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
0 голосов
/ 28 июля 2011

Вы можете сделать сам таймер общим, но более элегантным способом было бы сделать функцию / подпрограмму, которая запускает таймер публичной функцией, и вызвать ее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...