プロが教える店舗&オフィスのセキュリティ対策術

VB2008でデリゲートの代わりにラムダ式が使えるというので、試してみたのですが、うまくいきません。

試したコードは下記です。WindowsFormアプリで、Form1にButton1とLabel1を貼りつけております。
Button1を押すとLabel1に"はじめました"と表示し、2秒待ってから"おわりました"と表示するつもりです。
デリゲートを使った(2)は意図した動作をしますが、ラムダ式を使った(1)はLabel1に何も表示しません。
このようなことはできないのでしょうか?


Public Class Form1

Private Delegate Sub longTaskDelegate()


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = ""
Dim dlg As New longTaskDelegate(AddressOf LongTask)
dlg.BeginInvoke(AddressOf longTaskCallback, dlg)
End Sub

Private Sub longTaskCallback(ByVal ar As IAsyncResult)
Dim dlg As longTaskDelegate = DirectCast(ar.AsyncState, longTaskDelegate)
dlg.EndInvoke(ar)
End Sub

Private Delegate Sub displayMessageDelegate(ByVal msg As String)

Private Sub DisplayMessage(ByVal msg As String)
If Label1.InvokeRequired Then
Label1.Invoke(Function() Label1.Text = msg) ' --- (1)
'Label1.Invoke(New displayMessageDelegate(AddressOf Me.DisplayMessage), msg) ' --- (2)
Else
Label1.Text = msg
End If
End Sub

Private Sub LongTask()
DisplayMessage("はじめました")

System.Threading.Thread.Sleep(2000)

DisplayMessage("おわりました")
End Sub

End Class

A 回答 (1件)

残念ながら、VB9.0(VB2008)ではラムダ式の=は代入ではなく比較演算子になります。



VB10(VB2010)では
Label1.Invoke(Sub() Label1.Text = msg)
のようにして実現可能です。

(ちなみに、displayMessageDelegateなどはActionなどのジェネリックなデリゲートを使えば楽ですね、余計なことかもしれませんが)
    • good
    • 0
この回答へのお礼

さっそくVB2010 Expressを入手して試しましたところ、
教えていただいた記述でうまくいきました!

あと追加で教えていただいたActionは調べてみたところ、
Label1.Invoke(New Action(Of String)(AddressOf Me.DisplayMessage), msg)
てなかんじで書けるわけですね。もういちいちデリゲートを宣言する必要が
ないですね!

ありがとうございました。

お礼日時:2010/08/24 11:17

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