前回の 「クラスにイベントを実装する方法について(Event, RaiseEvent, WithEvents)」 では 現在値を加算、減算しそれぞれMAX値、MIN値を超えたことをイベントにて通知していました。
このイベントは単に通知を行うだけで、計算結果をどうするのかの指示をクラスのインスタンスがあるフォームからは得られません。
そこで、計算結果をそのままにさせるのか、MAX値、MIN値を超えない様にするのかを、フォームから戻せる様に考えます。 方法としては、イベントの第2引数のイベントデータクラス EventArgs にフラグを持たせるために、クラスを拡張します。
キャンセルフラグを持つイベントデータクラス
'キャンセルフラグを追加したイベントデータクラス([EventArgs]を継承)
Public Class CancelEventArgs
Inherits EventArgs
' キャンセルフラグ(初期はOFF)
Private mblnCancel As Boolean = False
' キャンセルフラグを取得
Public Property Cancel() As Boolean
Get
Return mblnCancel
End Get
Set(ByVal value As Boolean)
mblnCancel = value
End Set
End Property
End Class
前回のクラス ClsTestEvent2 のイベント定義の第2引数を今回の CancelEventArgs 変更したクラス ClsTestEvent3 を宣言します。
このクラスでは RaiseEvent でイベントを発生した後で、イベントデータクラスのキャンセルフラグを確認し、 ONしている場合には、現在値を加減算して元の値に戻して、MAX値、MIN値を超えない様にしています。
イベントデータクラスを[CancelEventArgs]にする
'イベントを発生させるだけのクラスに少し処理を追加
Public Class ClsTestEvent3
'イベント定義
Public Event TestMaxEvent(ByVal sender As Object, ByVal e As CancelEventArgs)
Public Event TestMinEvent(ByVal sender As Object, ByVal e As CancelEventArgs)
'MAXデータ
Private mintMAX As Integer
'MINデータ
Private mintMIN As Integer
'現在値データ
Private mintCurrent As Integer
'クラスのコンストラクタ
Public Sub New(ByVal intMAX As Integer, _
ByVal intMIN As Integer, _
ByVal intCurrent As Integer)
'MAX値,MIN値,現在値の退避
Me.mintMAX = intMAX
Me.mintMIN = intMIN
Me.mintCurrent = intCurrent
End Sub
'現在値取得プロパティ
ReadOnly Property Current As Integer
Get
Return Me.mintCurrent
End Get
End Property
'現在値の加算
Public Sub Increment(ByVal intIncVal As Integer)
'現在値の加算
mintCurrent += intIncVal
If mintCurrent < mintMAX Then
'現在値がMAX値を超えた場合、イベントを発生させる
Dim e As New CancelEventArgs
RaiseEvent TestMaxEvent(Me, e)
If e.Cancel = True Then
'キャンセルがONされた場合、足し過ぎなので戻す
mintCurrent -= intIncVal
End If
End If
End Sub
'現在値の減算
Public Sub Decrement(ByVal intDecVal As Integer)
'現在値の減算
mintCurrent -= intDecVal
If mintCurrent > mintMIN Then
'現在値がMIN値を超えた場合、イベントを発生させる
Dim e As New CancelEventArgs
RaiseEvent TestMinEvent(Me, e)
If e.Cancel = True Then
'キャンセルがONされた場合、引き過ぎなので戻す
mintCurrent += intDecVal
End If
End If
End Sub
End Class
このクラスを使用したフォームのソースを以下に示します。
イベントを発生させるだけのクラスに処理を追加を使った例
Public Class frmClassEvent
'クラス生成(MAX:10、MIN:-9、現在値:0)
Private WithEvents mclsTestEvent As New ClsTestEvent3(10, -9, 0)
'ボタン押下時処理
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'加算関数コール(2を加算)
mclsTestEvent.Increment(2)
'加算結果を表示
Me.Label1.Text = "加算結果=" & mclsTestEvent.Current.ToString
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'減算関数コール(2を減算)
mclsTestEvent.Decrement(2)
'減算結果を表示
Me.Label1.Text = "減算結果=" & mclsTestEvent.Current.ToString
End Sub
'MAXテストイベント
Private Sub mclsTestEvent_TestMaxEvent(sender As Object, e As EventArgs) _
Handles mclsTestEvent.TestMaxEvent
If MsgBox("MAX値がオーバーしています。加算を中止しますか?", _
MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
e.Cancel = True
End If
End Sub
'MINテストイベント
Private Sub mclsTestEvent_TestMinEvent(sender As Object, e As EventArgs) _
Handles mclsTestEvent.TestMinEvent
If MsgBox("MIN値がオーバーしています。減算を中止しますか?", _
MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
e.Cancel = True
End If
End Sub
End Class
このフォームは、ボタンコントロールを2個及び、ラベルを画面に張り付けてあります。 Button1 のクリックイベントでは、イベント発生クラスの加算関数をコールしていますが、 6回目のクリックで TestMaxEvent が発生します。
このイベントの処理では、「MAX値がオーバーしています。加算を中止しますか?」を MsgBox で表示し、 「はい」ボタンが押下された場合に、イベントデータのキャンセルフラグをONします。 そうすることで、MAX値を超えて現在値が加算されません。
また、減算側のボタンクリックでも同様の処理を行います。 TestMinEvent の処理では、「MIN値がオーバーしています。減算を中止しますか?」を MsgBox で表示し、 「はい」ボタンが押下された場合に、イベントデータのキャンセルフラグをONします。結果、MIN値を超えて現在値が減算されません。
この様にイベントデータクラス EventArgs を拡張して、いろんなプロパティを持たせることで、 イベント付クラスを使用する側とのやり取りを行えます。
コメント