Vb.net 我可以使用AddressOf将委托子对象分配给AddHandler吗?
编辑:我最初的问题太令人困惑了Vb.net 我可以使用AddressOf将委托子对象分配给AddHandler吗?,vb.net,delegates,printdocument,Vb.net,Delegates,Printdocument,编辑:我最初的问题太令人困惑了 Public Class PrintResults Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String) Me.List = lis 'setup report writer Dim rep As New Helper.Report 'create report to PS
Public Class PrintResults
Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String)
Me.List = lis
'setup report writer
Dim rep As New Helper.Report
'create report to PS
rep.ToPS(PSPathName)
End Sub
Public Class Report
Public Sub New()
PrintDoc = New Printing.PrintDocument
End Sub
Public WithEvents PrintDoc As Printing.PrintDocument
Public PrintDocPrintPage As PrintDoc_PrintPage
Public Delegate Sub PrintDoc_PrintPage(ByVal sender As Object, _
ByVal e As Printing.PrintPageEventArgs) 'Handles PrintDoc.PrintPage
Public Function ToPS(ByVal PSPathName As String) As String
'fails
AddHandler Me.PrintDoc.PrintPage, AddressOf Me.PrintDocPrintPage
Me.PrintDoc.Print()
End Function
AddHandler有编译器错误:AddressOf操作数必须是方法的名称。有没有办法将处理程序分配给委托子系统?也许创建事件并向其附加函数就是您要寻找的
Sub Main()
Dim c As New TestClass
AddHandler c.OnComplete, AddressOf Test
c.Execute() ' Will print Done
Console.ReadLine()
End Sub
Sub Test()
Console.WriteLine("Done")
End Sub
Class TestClass
Public Event OnComplete()
Public Sub Execute()
RaiseEvent OnComplete()
End Sub
End Class
通过一些研究,我发现不可能使用带有AddressOf的代理sub。因此,我们需要一种不同的方法。我现在看到,我所要做的就是在新的子对象中实例化PrintDoc。现在我有了一个PrintDoc对象供AddHandler使用
Public Class Report
Public Sub New()
PrintDoc = New Printing.PrintDocument
End Sub
我们使用不带委托的常规AddHandler:
Public Class PrintResults
Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String)
Me.List = lis
'setup report writer
Dim rep As New Helper.Report
'PrintDoc is automatically instatiated so no object error
AddHandler rep.PrintDoc.PrintPage, AddressOf Me.PrintDoc_PrintPage
'create report to PS
rep.ToPS(PSPathName)
End Sub
这正是我正在做的事情。我调用
rep.InitiatePrintDoc()
来实例化PrintDoc
。然后我将处理程序添加到新创建的PrintDoc
。然后我打印。好的但我不想先实例化。我想我可以分配一个委托,然后让“Report”类实例化对象,然后添加处理程序本身。但它不起作用。您当前的类间依赖关系非常混乱。想必,您希望Report
成为主类,但您希望能够将PrintResults
的实例分配给Report
,该实例允许通过调用Report
中的方法将列表(文件数据)
自定义打印到PSPathName
。这描述了你的目标吗?