2013-09-05 4 views
1

내 문제는 간단하지만 내 코드에 무엇이 잘못된 것인지 알 수 없습니다. 나는이 Head C# book을 가지고 있으며 VB.NET에서 코드를 변환했다. 내 양식에서 버튼을 클릭하면 catches 서브 루틴 Pitcher 클래스가 호출 될 것으로 예상됩니다. 그러나 아무 일도 일어나지 않습니다.내가 뭘 잘못 했니? Visual Basic 이벤트

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim myBall As New Ball 
     Dim pitcher As New Pitcher 
     myBall.OnBallInPlay(New BallEventArgs(10, 20)) 
    End Sub 
End Class 

Public Class Ball 
    Public Event BallInPlay(ByVal sender As Object, ByVal e As BallEventArgs) 
    Public Sub OnBallInPlay(ByVal e As BallEventArgs) 
     RaiseEvent BallInPlay(Me, e) 
    End Sub 
End Class 

Public Class BallEventArgs 
    Inherits EventArgs 
    Dim trajectory As Integer 
    Dim distance As Integer 
    Public Sub New(ByVal trajectory As Integer, ByVal distance As Integer) 
     Me.trajectory = trajectory 
     Me.distance = distance 
    End Sub 
End Class 

Public Class Pitcher 
    Public WithEvents mySender As Ball 

    Public Sub catches(ByVal sender As Object, ByVal e As EventArgs) Handles mySender.BallInPlay 
     MessageBox.Show("Pitcher: ""I catched the ball!""") 
    End Sub 
End Class 

Ball.OnBallInPlay를 호출 한 후, Pitcher.catches 듣고된다. 그렇지 않습니까? 아니면 분명하고 중요한 것을 빠뜨린 것입니까?

답변

2

에 다른 참조를 참조하십시오. 메서드에서 Myball이 선언되었으므로 WithEvents 키워드를 사용할 수 없습니다.

런타임에 처리기를 연결하려면 AddHandler을 사용하십시오.

Dim myBall As New Ball 
Dim pitcher As New Pitcher 
AddHandler myBall.BallInPlay, AddressOf pitcher.catches 
myBall.OnBallInPlay(New BallEventArgs(10, 20)) 

처리기를 분리하려면 RemoveHandler을 사용하십시오.

RemoveHandler myBall.BallInPlay, AddressOf pitcher.catches 

편집

난 그냥 문제/누락 된 부분을 이해했다. 당신은 정의 할 필요가 Pitcher.MySender 이후 :

  • WithEvents 키워드
  • 로 선언하고 이미 Handles mySender.BallInPlay

    Dim myBall As New Ball 
    Dim pitcher As New Pitcher 
    pitcher.mySender = myBall 
    myBall.OnBallInPlay(New BallEventArgs(10, 20)) 
    
+0

AddHandler를 사용하여 WithEvents 및 Handles 키워드가 더 이상 필요 없다는 것을 알았습니다. 권리? 차이점은 후자가 런타임에 대한 것인가? – Arman

+0

그것은 나에게 힌트를 줬다. Public 클래스 투수 희미한 myBall으로 새로운 볼 하위 새로운 (볼로 ByVal의 공) myBall = 볼 AddHandler에 myBall.BallInPlay, AddressOf를 Me.catches 최종 하위 공공 하위 어획량 (개체로 ByVal의 보낸 사람, EventArgs입니다으로 ByVal의 전자) MessageBox.Show ("투수 :" "나는 공을 잡았습니다." ") End Sub End Class – Arman

+2

죄송합니다. 읽을 수 없습니다.문제는 'myBall'을 투수 오브젝트로 참조하는 것입니다 (Alex가 지적한대로). 둘 다 감사합니다. – Arman

1

당신은 pitcher 정의하지만 당신은 그것을 사용하지 않을 :

Dim pitcher As New Pitcher 

는 따라서 어획량 서브 루틴은 볼의 인스턴스가 없기 때문에 호출되지 않을 수 있습니다, 아무것도하지 않습니다.

또한, mySender는 인스턴스화되지 않습니다 및 mySendermyBall 당신은 pitcher.catches 방법에 MyBall 이벤트를 연결할 필요가 Ball

+0

그러나 방법을 통해 catches 메소드를 호출? 나는 투수 물체가 내 개입없이 어쨌든 들어 줄 것이라고 생각했다. – Arman

+0

이벤트를 발생 시키려면'mySender.ballInPlay'를 호출해야합니다. (이것은'myBall.ballInPlay'를 호출하는 것과 다릅니다) –

+0

죄송합니다, 정말로 그것을 얻을 수는 없습니다. 어디에서 'mySender.ballInPlay'를 호출해야합니까? '캐치'서브 루틴에서? – Arman

관련 문제