アプリ版:「スタンプのみでお礼する」機能のリリースについて

卒論の関係で、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

A 回答 (2件)

MSDN の MethodInvoker デリゲートの説明にもありますが



http://msdn.microsoft.com/ja-jp/library/system.w …

-- 引用 --

void として宣言された、パラメータをとらない任意のメソッドを、マネージ コード内で実行できるデリゲートを表します。

-- 引用終わり --

ということなので、MethodInvoker はパラメータを取らないメソッド専用です。

本来は Delegate を自分で宣言するものなのですが、パラメータを取らないメソッドを使って Invoke を実行する機会は多いと思われるので、いちいち Delegate を宣言しなくても呼び出せるようにするために、フレームワーク側で用意されているのが、MethodInvoker です。
    • good
    • 1
この回答へのお礼

つまり、MethodInvokerでは、デリゲートは引数なしで宣言されているってことですね。度々、回答ありがとうございました。

お礼日時:2008/12/04 16:48

Control.Invoke はオーバーロードされていて、object の配列を取るバージョンがあります。

それはまさに、引数を渡すためにあります。

http://msdn.microsoft.com/ja-jp/library/system.w …

Delegate の宣言側も同じ Integer 型の引数を取るように修正して、Invoke の第2引数以降にパラメータを書けばよいはずです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
デリゲートにも同じように引数を取るようにするとできました。以下、修正した記述。

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の方が、なぜかうまくいかないです。省略しているデリゲートにも対応するのかと思ったのですが、うーむ。もう少しがんばってみます。

お礼日時:2008/12/04 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!