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
No.1ベストアンサー
- 回答日時:
残念ながら、VB9.0(VB2008)ではラムダ式の=は代入ではなく比較演算子になります。
VB10(VB2010)では
Label1.Invoke(Sub() Label1.Text = msg)
のようにして実現可能です。
(ちなみに、displayMessageDelegateなどはActionなどのジェネリックなデリゲートを使えば楽ですね、余計なことかもしれませんが)
さっそくVB2010 Expressを入手して試しましたところ、
教えていただいた記述でうまくいきました!
あと追加で教えていただいたActionは調べてみたところ、
Label1.Invoke(New Action(Of String)(AddressOf Me.DisplayMessage), msg)
てなかんじで書けるわけですね。もういちいちデリゲートを宣言する必要が
ないですね!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
EXCEL/VBA 変数の値をクリップ...
-
java final
-
jsp~jspにhiddenを使って変数...
-
[VBS]変数を定数に変換する方法...
-
変数にオフセットが付いている...
-
VBAでコマンドプロンプトの結果...
-
StringReaderのサンプルプログ...
-
processing エラーで、 "cannot...
-
vba 最大値 条件分岐
-
DataTableの値を変数に代入したい
-
i++と++i ってどう違うのですか?
-
数値計算??
-
インクリメント演算子の前置(+...
-
var aaa=bbb?cccl:ddd; の意味...
-
C# String str ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
EXCEL/VBA 変数の値をクリップ...
-
整数xxxが大き過ぎますというエ...
-
テキストボックスの値を変数に...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
jsp~jspにhiddenを使って変数...
-
processing エラーで、 "cannot...
-
python の 連鎖代入の文法
-
i++と++i ってどう違うのですか?
-
プログラミングで変数と関数の...
-
C言語 アロー演算子について質...
-
「%」を使って、偶数か奇数かを...
-
JavaScriptをURLから直接実行し...
-
VBA 1行で複数の代入を行った...
-
ExcelのVBAでをA列に第0〜19項...
-
コマンドプロンプト バッチ|結...
-
無名関数のメリットがよくわか...
おすすめ情報