忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

クラスにイベントを実装する方法について・その2(イベントデータクラスの拡張)

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

関連する記事

クラスにイベントを実装する方法について(Event, RaiseEvent, WithEvents)












PR

コメント

コメントを書く