2017-06-06 20 views
2

変数の変更を介してイベントがトリガされますか?例えば。イベントハンドラで変数の変更によりイベントがトリガーされる

これは、イベントをトリガーする

Dim t As Integer 
Dim Fire As Boolean 

Private Sub Test 
t = 0 
Fire = True 
IIf Fire, t=1, t=2 
End sub 

Select Case t 
    Case 0 
     'Do something 
    Case 1 
     'Do something    
    Case 2 
     'Do something 
    Case 3 
     'Do something 
    ... 

Googleはイベントハンドラを起動します、とクラスモジュールを使用したが、私はそれのまわりで私の頭をラップすることができません。

答えて

4

はいこれが可能です。ただし、オブジェクト指向のアプローチが必要です。 まず、フックするイベントを発生させるクラスを定義する必要があります。次に、通常のモジュールではイベントハンドラを使用できないため、イベントを実際に処理するクラスが必要になります。 第3に、通常のモジュールでは、これらのクラスを使用できます。

ここに簡単な例を示します。 "ClassWithEvent"という名前のクラスモジュールを作成します。次のコードを配置します。

Public Event VariableChange(value As Integer) 
Private p_int As Integer 
Public Property Get value() As Integer 
    value = p_int 
End Property 
Public Property Let value(value As Integer) 
    If p_int <> value Then RaiseEvent VariableChange(value) 'Only raise on actual change. 
    p_int = value 
End Property 

次に、このクラスによって生成されたイベントを処理できるクラスを作成します。 このクラスのモジュールには "ClassHandlesEvent"という名前を付けます。それに次のコードを配置します。

Private WithEvents SomeVar As ClassWithEvent 
Private Sub SomeVar_VariableChange(value As Integer) 'This is the event handler. 
    Select Case value 
     Case 1: 
      MsgBox "here, 1!" 
     Case 2: 
      MsgBox "here, 2!" 
     Case Default: 
      'Do Nothing 
    End Select 
End Sub 
Public Property Get EventVariable() As ClassWithEvent 
    Set EventVariable = SomeVar 
End Property 
Public Property Let EventVariable(value As ClassWithEvent) 
    Set SomeVar = value 
End Property 

次に、通常のモジュールでは、あなたのClassWithEventをインスタンス化し、それらを処理するクラスのプロパティとしてこれを渡します。

Sub test() 
    Dim var As ClassHandlesEvent 
    Dim tst As ClassWithEvent 

    Set var = New ClassHandlesEvent 
    Set tst = New ClassWithEvent 
    var.EventVariable = tst 

    tst.value = 2 'A messagebox saying "Here, 2!" will pop-up 
End Sub 
+0

拡張機能は、変数が変更された場合にのみイベントを発生させることを推奨します。現在、値を2に再度設定すると、イベントが発生します。 –

+0

あなたは@BrianMStaffordです。値が等しくないかどうかを確認するコードを修正しました。 –

+0

私の友人、私はあなたの詳細な答えと私にこれを見せる時間を取ってくれてありがとう、ありがとう。それは、ステップバイステップで何が起こっているかについて私に少しはわかります。私の言うことからあなたの答えは完璧に機能しました。 – Quint

関連する問題