1

私は現在、特定の時間にメイン フォーム (Form1) が別のフォーム (Form2) を表示する VB.NET のアプリケーションをサポートしています。Form2 が表示されると、Form2 から発生するイベントをキャプチャするハンドラーが追加されます。

簡単な例を次に示します。

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub

Private Sub CalibrationCheckComplete()
    MessageBox.Show("Form2 Event raised.")
End Sub
End Class

Public Class Form2
Public Event CalibrationCheckComplete()
Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    RaiseEvent CalibrationCheckComplete()
End Sub
End Class

この例では、イベントが発生したときに MessageBox を表示する Form2 のイベントにハンドラーを追加するだけです。実際のアプリケーションでは、このコールバック関数が呼び出されるときに Form1 で定義された多くの変数などを使用しています。

ここで、別のインスタンスで Form2 を表示し、同じコールバック関数を利用して、どのインスタンスがそれを呼び出したかを確認します。しかし、コールバック (AddressOf) 関数にパラメーターを渡そうとすると問題が発生します。

「'AddressOf'オペランドはメソッドの名前でなければなりません(括弧なし)」というエラーが発生した私の試みは次のとおりです。

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete(1)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete(2)
End Sub
Private Sub CalibrationCheckComplete(ByVal number As Integer)
    MessageBox.Show("Form2 Event raised. Called from number:" & number)
End Sub
End Class

Public Class Form2
Public Event CalibrationCheckComplete()
Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    RaiseEvent CalibrationCheckComplete()
End Sub
End Class

整数などのパラメータを AddressOf 関数に渡し、最初にどの関数がそれを呼び出したかを特定するにはどうすればよいですか?

4

1 に答える 1

1

それぞれが数値を処理する別の関数を作成する必要があります

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete1
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete2
End Sub

Private Sub CalibrationCheckComplete1()
    CalibrationCheckComplete(1)
End Sub

Private Sub CalibrationCheckComplete2()
    CalibrationCheckComplete(2)
End Sub

Private Sub CalibrationCheckComplete(ByVal number As Integer)
    MessageBox.Show("Form2 Event raised. Called from number:" & number)
End Sub

しかし、私はあなたが何をしているのか疑問に思います。Form2 がどのように開かれたかを知っていると良いかもしれません。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Number = 1
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Number = 2
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub

Private Sub CalibrationCheckComplete()
    MessageBox.Show("Form2 Event raised. Called from number:" & Form2.Number)
End Sub
于 2015-02-25T14:32:22.283 に答える