2016-08-26 5 views
-1

편집 : 내 원래 질문은 너무 혼란 스러웠습니다.AddressOf를 사용하여 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 

     '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 피연산자는 메서드의 이름이어야합니다. Delegate sub에 핸들러를 할당 할 방법이 있습니까?

+0

현재 클래스 간 의존성은 매우 복잡하다. 아마'Report'가 메인 클래스가되기를 원하지만'List (Of FileData)'를'PSPathName'에 커스터마이징 할 수있게 해주는'Report'에'PrintResults'의 인스턴스를 할당 할 수 있기를 원할 것입니다 'Report'의 메소드. 그것은 당신의 목표를 묘사 했습니까? – TnTinMn

답변

0

일부 연구에서 나는 AddressOf와 함께 델리게이트 서브를 사용할 수 없다는 것을 발견했습니다. 그래서 우리는 다른 접근 방식이 필요합니다. 이제는 New Sub에서 PrintDoc을 인스턴스화하기 만하면됩니다. 이제 AddHandler를 사용할 PrintDoc 개체가 생겼습니다.

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 

Delegates and the AddressOf Operator

AddHandler Statement

0

이벤트를 만들고 이벤트를 추가하는 것은 아마도 당신이 원하는 것입니다.

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 
+0

이것은 정확히 제가 이미하고있는 것입니다. 'rep.InitiatePrintDoc()'를 호출하여'PrintDoc'을 인스턴스화합니다. 그런 다음 새로 생성 된'PrintDoc'에 핸들러를 추가합니다. 그런 다음 인쇄합니다. 벌금! 하지만 먼저 인스턴스화하고 싶지 않습니다. 델리게이트를 할당 한 다음 "Report"클래스에서 객체를 인스턴스화하고 핸들러 자체를 추가 할 수 있다고 생각했습니다. 하지만 작동하지 않습니다. –