vb.net将函数作为参数传递

时间:2018-07-03 08:10:14

标签: .net vb.net arguments

我有一个简单的应用程序,可以通过pads在远程桌面上运行。

该应用程序是用Visual Basic编写的,其结构如下:

  • 主要
    • Tab_01
    • Tab_02
    • 依此类推

目前,例如当我从Tab_02调用打印功能时,我会这样:

  • Main.showWaitScreen()
  • Tab_02.Print()
  • Main.dismissWaitScreen()

我要做的是调用mainShowWaitScreen()作为参数传递一个函数,该函数完成后将自动关闭等待屏幕。

我试图像这样通过ACT或FUNC传递打印功能:

Main.setWaitScreen(msg:="Printing...", action:=cr.print(printerName:=printer))

,然后在Main.setWaitScreen中:

Public Function setWaitScreen(ByVal msg As String, ByVal action As Action) As Boolean
    Try
        wait = New rrWait
        wait.setText(text:=msg)
        Me.Controls.Add(wait)
        wait.BringToFront()
        wait.Dock = DockStyle.Fill
        Me.Update()

        action()

        If Not wait Is Nothing Then
            wait.Parent = Nothing
            wait.Dispose()
            wait = Nothing
        End If

        Return True
    Catch ex As Exception
        MessageBox.Show(ex.ToString(), MethodBase.GetCurrentMethod.Name) : Return False
    End Try
End Function

问题在于函数在我声明参数时立即采取行动,而不是在Main.setWaitScreen()调用函数action()时采取行动。

错误在哪里?如何解决?

非常感谢。

里卡多

1 个答案:

答案 0 :(得分:1)

要在vb.net中将函数作为参数传递,可以使用AddressOf关键字。

Public Sub Execute(Action action)
    Console.WriteLine("Before")
    action()
    Console.WriteLine("After")
End

Public Sub MyAction()
    ' Do something
End Sub

' And call
Execute(AddressOf MyAction)

但是因为将打印机作为参数传递给以后要调用的函数,所以不能使用AddressOf

相反,使用已授予打印机的匿名操作包装您的方法

Main.setWaitScreen(msg:= "Printing...", action:= Sub() cr.print(printerName:=printer))