2011-07-28 3 views
0

私は、コードを使用してうまく行くことができるOfficeアドイン(VB.netで開発中)にタイマーを設定しました:別のクラスのThisAddInで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 

「オブジェクトのインスタンスがオブジェクトのインスタンスに設定されていません」というエラーが発生します。誰も私はタイマーを設定する方法を説明することはできますか?事前に

おかげで、

答えて

2

myCallerは(理論的には、あなたの記憶の周りに浮い多くのThisAddInの場合があるかもしれない)ThisAddInのあなたの特定のインスタンスに設定されていないので、あなたのコードは動作しません。

ただし、オフィスアドインを開発しているため、実際はThisAddInのインスタンスは1つだけです。

Friend Shared WithEvents Timer1 As System.Timers.Timer 

これは、あなたがThisAddIn.Timer1としてタイマーにアクセスできるようになる:タイマーへのアクセスを取得するための簡単な回避策は、タイマ1共有変数を作ることであろう。

(一般的に、一般に)、公開アクセス可能な共有フィールド(別名グローバル変数)は悪い考えですが、あなたの場合は、あなたが望むことを実行できる最も単純なソリューションかもしれません。

PS:あなたはクラスとクラスのインスタンスとの間の差にまで読むことをお勧めします。


EDIT:あなたはタイマーに添付イベントハンドラを持っているので、あなたのいずれか

(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

こんにちは、ありがとうございました。唯一の問題は、現在、私がタイマーにアクセスしようとすると、「共有されたWithEvents変数のイベントは、非共有メソッドでは処理できません」という新しいエラーメッセージが表示されることです。どのように私はそれを解決する任意のアイデア? – user867358

+0

@ user867358:メソッド定義にも "Shared"キーワードを追加してください: 'Private Shared Sub Timer1_Elapsed ...' – Heinzi

+0

@ user867358:第2の考えで...私の編集を参照してください。 – Heinzi

0

あなたは、あなたは、タイマー自体は共有作ることができるが、よりエレガントな方法は、関数/サブザッツはタイマー公共機能を開始し、これは他の誰にも有益である場合には、この

+0

答えに感謝 - 唯一の問題です。今私は公共のサブを持っていますが、startTimer()はこのモジュールで定義されていないので、私はstartTimer()を呼び出そうとしません。 myCaller.startTimer()は、オブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーを返します。 – user867358

0

を呼び出す作ることであろうまた、そうGlobals.ThisAddIn

を経由して、プロジェクト内の

Public Class ThisAddIn 

    Public N As Integer = 42 

    ... 

End Class 

や他の場所をインスタンス化のThisAddInオブジェクトにアクセスすることができます。

Public Class MyClass 

    Private Sub DoSomething() 
     Dim myint= Globals.ThisAddIn.N 
    End Sub 
End Class 
関連する問題