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
4

3 に答える 3

1

イベントを持つ基本クラスを継承する必要があると思います。その後、イベントを上書きして、新しいクラスがイベントを取得し、新しいクラスがイベントを基本クラスにリダイレクトします。それとも他に何か必要ですか?

于 2013-10-10T17:55:56.780 に答える
1

クラスレベルのインスタンス(あなたの場合は「CoreConverter」)を宣言するときは、「WithEvents」を使用する必要があります。例えば:

Private WithEvents CoreConverter As MyConverterType
于 2013-10-10T17:56:11.580 に答える
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 規則に従うことをお勧めします。この規則には、常に 2 つの引数 (sender と event args) があります。これを行う最も簡単な方法は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
于 2013-10-10T17:59:29.413 に答える