2017-06-06 2 views
2

Kann ein Ereignis über eine Änderung der Variablen ausgelöst werden? Beispielsweise.Änderung der Variablen löst ein Ereignis aus

Dies würde löst die Veranstaltung

Dim t As Integer 
Dim Fire As Boolean 

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

im Ereignishandler

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

Google Eventhandler bringt, und mit Klassenmodulen, aber ich bin nicht in der Lage, meinen Kopf zu wickeln um ihn herum.

Antwort

4

Ja, das ist möglich. Sie benötigen jedoch einen objektorientierten Ansatz. Sie müssen zuerst eine Klasse definieren, die die Ereignisse auslöst, in die Sie einhaken möchten. Zweitens benötigen Sie eine Klasse, die das Ereignis tatsächlich behandelt, da Sie Event-Handler in einem regulären Modul nicht verwenden können. Drittens können Sie in Ihrem regulären Modul nur diese Klassen verwenden.

Hier ist ein einfaches Beispiel: Erstellen Sie ein Klassenmodul namens "ClassWithEvent". Fügen Sie den folgenden Code ein:

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 

Erstellen Sie als Nächstes die Klasse, die die Ereignisse behandeln kann, die von dieser Klasse ausgelöst werden. Benennen Sie dieses Klassenmodul "ClassHandlesEvent". Platzieren Sie den folgenden Code in es:

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 

Als nächstes wird in einem regulären Modul, instanziiert Ihre ClassWithEvent und übergeben Sie diese als eine Eigenschaft der Klasse, die sie verarbeitet.

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

Eine Verbesserung könnte ich vorschlagen, das Ereignis nur zu erhöhen, wenn sich die Variable ändert. Momentan würden Sie ein Ereignis erhalten, wenn Sie den Wert erneut auf 2 setzen. –

+0

@BrianMStafford du hast Recht. Änderte den Code, um zu überprüfen, ob der Wert nicht gleich ist. –

+0

Mein Freund, ich danke Ihnen aufrichtig für Ihre ausführliche Antwort und dafür, dass Sie sich Zeit nehmen, mir das zu zeigen. Es wird ein bisschen dauern zu folgen, was Schritt für Schritt vor sich geht. Ihre Antwort funktionierte einwandfrei von dem, was ich sagen kann. – Quint

Verwandte Themen