Mika
Mika

Reputation: 15

How can I pass a parameter in an AddressOf?

I have RichTextBox1 and RichTextBox2 which call a function when user clicks the mouse

Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
        RTBCheckText(RichTextBox1, e)
End Sub


Private Sub RichTextBox2_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox2.MouseDown
        RTBCheckText(RichTextBox2, e)
End Sub

In the function RTBCheckText I have to create a context menu in the corresponding richtextbox

Private Sub RTBCheckText(ByRef RTB As RichTextBox, e As MouseEventArgs)
    Dim text As String = RTB.Text

    Do something...

    Dim item As New ToolStripMenuItem("item1")
    AddHandler item.Click, AddressOf RTB_MenuItem_Click
    menu.Items.Add(item)

    Do something...

    menu.Show(RTB, e.Location)
End Sub

And in the function RTB_MenuItem_Click I need the previously passed parameter RTB in order to replace some text

Private Sub RTB_MenuItem_Click(sender As Object, e As EventArgs)
    Do something with RTB
End Sub

To do that, I tried to replace

AddHandler item.Click, AddressOf RTB_MenuItem_Click

with

AddHandler item.Click, Function(sender, e) RTB_MenuItem_Click(RTB)

Private Sub RTB_MenuItem_Click(ByVal RTB As RichTextBox)
    Dim menuItem As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
    Dim Text As String = RTB.SelectedText

    Do something with RTB...

End Sub

but it does not work. It tells me Expression does not produce a value. How can I solve this ?

Upvotes: 0

Views: 111

Answers (1)

Mika
Mika

Reputation: 15

As jmcilhinney suggested, Function had to be replaced with Sub.

This code did the trick :

Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
        RTBCheckText(RichTextBox1, e)
End Sub

Private Sub RichTextBox2_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox2.MouseDown
        RTBCheckText(RichTextBox2, e)
End Sub


Private Sub RTBCheckText(RTB As RichTextBox, e As MouseEventArgs)
    Dim item As New ToolStripMenuItem("item1")
    AddHandler item.Click, Sub() RTB_MenuItem_Click(item, RTB)
    menu.Items.Add(item)

    Do something...

    menu.Show(RTB, e.Location)
End Sub


Private Sub RTB_MenuItem_Click(sender As Object, ByVal RTB As RichTextBox)
    Dim menuItem As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
    Dim Text As String = RTB.SelectedText

    Do something with RTB...
End Sub

It works fine ! In each RichTextBox, I can display a context menu using the same code for all.

Upvotes: 0

Related Questions