前回の 「クラスにイベントを実装する方法について(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 を拡張して、いろんなプロパティを持たせることで、 イベント付クラスを使用する側とのやり取りを行えます。
コメント