2013-10-10 110 views
0

如果我有這樣的一個事件:關於處理自定義事件

' <summary> 
' Event raised when conversion progress changes. 
' </summary> 
Public Shared Event PercentDone(ByVal percent As Integer) 

Sub(...) 
    CoreConverter.StartInfo.FileName = CoreConverter_Location 
    CoreConverter.Start() 

    While Not CoreConverter.HasExited 

     If ChrW(CoreConverter.StandardOutput.Read) = "*" Then 
      progress += 1 
      RaiseEvent PercentDone(progress) 
     End If 

    End While 

    CoreConverter.Close() 
    RaiseEvent Exited() 

End sub 

我怎麼能寫在其他類(例如,在默認Form1類)的事件處理程序,因爲這:

Sub Converter_Progress(Progress As Integer) Handles CoreConverter.PercentDone 
    ' Some code... 
End Sub 

...而不是手動添加處理類似這樣的東西:

AddHandler CoreConverter.PercentDone, AddressOf Converter_Progress 

回答

1

爲了使用Handles關鍵字,你需要聲明的變量作爲一個字段在你的類(類級別,不是本地的任何方法),併爲此使用WithEvents關鍵字。例如:

Public Class Test 
    Private WithEvents Converter As New CoreConverter() 

    Sub Converter_Progress(Progress As Integer) Handles Converter.PercentDone 
     ' Some code... 
    End Sub  
End Class 

不過,我要指出的是,即使對於自定義事件,建議您遵循事件處理程序委託,那裏總是有兩個參數的.NET約定:發件人和事件參數。做到這一點的最簡單方法是使用通用EventHandler(Of T)委託,例如:

Public Class PercentDoneEventArgs 
    Inherits EventArgs 

    Public Property Progress As Integer 
End Class 

Public Class CoreConverter 
    Public Event PercentDone As EventHandler(Of PercentDone) 

    ' ... 
End Class 

然後,你的事件處理方法是這樣的:

Sub Converter_Progress(sender As Object, e As PercentDoneEventArgs) Handles Converter.PercentDone 
    ' ... 
End Sub 
+0

三江源,但後來就沒有辦法做沒有實例化類,我的類沒有IDisposable,我知道如何創建一個Dispose過程,但我不知道的是,如果在這種情況下是必要的,因爲我需要實例化類來處理事件,因爲我想。和其他問題,如果我沒有問太多,我已經遵循了關於事件創建的指示,但是「Nothing」的值對於「e」變量是正確的,只是我沒有更多的要通過比進度值,所以...我在這裏提出了一個「沒有」:RaiseEvent PercentDone(progress,Nothing) – ElektroStudios

+0

你不需要立即實例化一個對象作爲聲明的一部分。你可以簡單地聲明變量'WithEvents',最初將它設置爲'Nothing',然後你可以將它設置爲在以後引用任何你想要的對象。您可以隨時更改其引用的對象,但顯然它一次只能引用一個對象。 –

1

我認爲你將不得不繼承具有EV基類那麼你可以覆蓋事件,然後你的新類獲取事件,而你的新類將事件重定向到基類。還是你需要別的東西?

1

當聲明你的類級別的實例時(你的情況是「CoreConverter」),你必須使用「WithEvents」。例如:

Private WithEvents CoreConverter As MyConverterType