■91957 / inTopicNo.2) |
Re[1]: ContextMenuStripで引数を渡す方法 |
□投稿者/ Hongliang (860回)-(2019/08/14(Wed) 22:57:41)
|
まず、New EventHandlerに渡すメソッドは、
Sub Method(ByVal sender As Object, ByVal e As EventArgs)
という形でなければなりません(メソッド名や引数名は任意です)。
参考:
https://docs.microsoft.com/ja-jp/dotnet/api/system.eventhandler?view=netframework-4.8
VBの場合、異なる引数を持つメソッドをもとにEventHandlerをNewしてもコンパイルできたりすることもありますが、
実行時例外になったりすることもあるのでできるかぎり上記ルールを守るべきです。
なので素朴には引数ごとにメソッドを書くことになるわけですが。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me.ContextMenuStrip1.Items.Add("Test1", Nothing, New EventHandler(AddressOf test1))
Me.ContextMenuStrip1.Items.Add("Test2", Nothing, AddressOf test2) ' New EventHandlerは省略可
End Sub
Sub Test1(ByVal sender As Object, ByVal e As EventArgs)
Test(1)
End Sub
Sub Test2(ByVal sender As Object, ByVal e As EventArgs)
Test(2)
End Sub
Sub Test(ByVal x As Integer)
End Sub
VB10(Visual Studio 2010に搭載されたVB)で、ラムダ式というのを使うことができるようになりました。
// 厳密には、ラムダ式はVB9(VS2008)で使えるようになり、VB10でSubをラムダ式で使えるようになりました。
ラムダ式を使うと、以下のように記述できるようになります。
Me.ContextMenuStrip1.Items.Add("Test1", Nothing, Sub(sender, e) test(1))
Sub部分を省略なく記述すると、以下のようになります。
New EventHandler(Sub(ByVal sender As Object, ByVal e As EventArgs)
test(1)
End Sub)
処理を1行で記述できる場合、Sub(...)に続けて記述することでEnd Subを省略できます。
New EventHandler(Sub(ByVal sender As Object, ByVal e As EventArgs) test(1))
EventHandlerは Sub(Object, EventArgs) を要求するので、第1引数はObject型、第2引数はEventArgsであるのが自明です。
そのため、
New EventHandler(Sub(ByVal sender, ByVal e) test(1))
と記述すればコンパイラはsenderがObject、eがEventArgsであると推論してくれます(型推論)。
New EventHandlerを省略できるのも、.Items.Addの第3引数がEventHandlerであるから、
第3引数に渡されたデリゲート(AddressOfとか、ラムダ式とか)がEventHandlerであると型推論してくれるからです。
Sub(ByVal sender, ByVal e) test(1)
最後に、ByValは既定の呼び出しなので省略でき、最終的にこうなります。
Sub(sender, e) test(1)
|
|