卒論の関係で、Visual Basic 2005 Express Editionを使用して、システムを構築しています。
スレッドまたはフォームが複数あるため、デリゲートを使用することになったのですが、invokeの対象であるメソッドで引数を使用することはできるのでしょうか?
引数なしの場合、現時点では次のように記述しています。
A.show()
A.Invoke(New MethodInvoker(AddressOf A.Status_Timer))
Public Sub Status_Timer()
処理
End Sub
MethodInvokerは、デリゲート宣言なしでinvokeを使えることができ、本来?のデリゲート宣言して、invokeを使う場合は以下のようになります。
A.show()
A.Invoke(New SetFocusDelegate(AddressOf A.Status_Timer))
Delegate Sub SetFocusDelegate()
Public Sub Status_Timer()
処理
End Sub
ここで、Status_Timer()に引数を指定して、たとえば、
Public Sub Status_Timer(ByVal data As integer)
処理
End Sub
とした場合、invokeでの記述がうまくいきません。
もともと、invokeではそんなことはできないかもしれませんが、何か方法ありますでしょうか?現時点では、引数を使用することができないので、スレッドまたはフォーム間で、プロパティを使用して、情報を渡しています。以下のような形です。できれば、プロパティを使用したくないのですが・・・
Public Property test() As state
Get
Return _test
End Get
Set(ByVal value As state)
_test = value
End Set
End Property
回答ありがとうございます。
デリゲートにも同じように引数を取るようにするとできました。以下、修正した記述。
Me.Invoke(New SetFocusDelegate(AddressOf Me.Status_Timer), 10, 100)
Delegate Sub SetFocusDelegate(ByVal a As Integer, ByVal b As Integer)
Sub Status_Timer(ByVal a As Integer, ByVal b As Integer)
Debug.Print(a.ToString + "," + b.ToString)
End Sub
MethodInvokerの方が、なぜかうまくいかないです。省略しているデリゲートにも対応するのかと思ったのですが、うーむ。もう少しがんばってみます。
お礼
つまり、MethodInvokerでは、デリゲートは引数なしで宣言されているってことですね。度々、回答ありがとうございました。