|
Wünschen Sie sich auch manchmal, dass Variablen von alleine melden könnten, wenn ihr Wert irgendwo in den Tiefen Ihrer Anwendung geändert wird? In konsequent objektorientierten Programmier-Umgebungen sind auch einfache Datentypen Objekte, die sich (meistens über Ableitung oder Vererbung) um eine solche Funktionalität erweitern lassen. In Visual Basic sind Variablen jedoch keine Objekte. Sie können allerdings Klassen erstellen, die sich wie Variablen nutzen lassen. Und eine Klasse mit der gewünschten Funktionalität zu versehen, ist schließlich kein Problem mehr.
Die Klasse, die einen "variablen" Wert repräsentieren soll, braucht nur über eine Eigenschaft des betreffenden Datentyps zu verfügen. In der Property Let-Prozedur (bzw. entsprechend in der Property Set-Prozedur bei Objekt-Datentypen) kann wie gewünscht auf die Änderung des Wertes reagiert werden - etwa durch Auslösen eines Ereignisses.
Für den Datentyp Long könnte eine solche Klasse (z.B. clsLong) so aussehen:
Public Event Change(ByVal Value As Long)
Private pValue As Long
Public Property Get Value() As Long
Value = pValue
End Property
Public Property Let Value(New_Value As Long)
If pValue <> New_Value Then
pValue = New_Value
RaiseEvent Change(pValue)
End If
End Property
Um die Verwendung zu vereinfachen, sollte die Eigenschaft Value als Standard-Eigenschaft der Klasse deklariert werden.
Jetzt können Sie die Objekt-Variable, die die Instanz einer solchen Variablen-Klasse aufnimmt, wie eine gewöhnliche Variable verwenden - ohne explizite Angabe der Value-Eigenschaft:
Dim n As clsLong
Set n = New clsLong
' ...
n = 99
' ...
Debug.Print n
Wenn Sie nun noch an beliebiger Stelle eine Ereignisempfänger-Variable des Objekt-Typs dieser Klasse deklarieren und ihr eine Referenz auf die erzeugte Instanz zuweisen, können Sie dort auf jede Änderung des Werts reagieren. Ein kleines Beispiel:
Private WithEvents N As clsLong
Private Sub Command1_Click()
N = N + 1
End Sub
Private Sub Form_Load()
Set N = New clsLong
N = 1
End Sub
Private Sub N_Change(ByVal Value As Long)
lblN.Caption = Value
End Sub
Für die meisten VB-Standard-Datentypen (Byte, Boolean, Date, Double, Integer, Long, Single, und String) lassen sich Klassen exakt nach dem oben stehenden Muster erstellen - lediglich zu ändern ist die entsprechende Deklaration des Datentyps für Value. Eine Klasse für den Datentyp Object weicht davon ein wenig ab, da hier die Property Set-Prozedur hinzukommt und intern Zuweisungen und Vergleich angepasst werden müssen. Natürlich können Sie diesem Muster wieder entsprechend Objekt-Klassen jeden Objekt-Typs erstellen.
Public Event Change(ByVal Value As Object)
Private pValue As Object
Public Property Get Value() As Object
Set Value = pValue
End Property
Public Property Let Value(New_Value As Object)
zSetValue New_Value
End Property
Public Property Set Value(New_Value As Object)
zSetValue New_Value
End Property
Private Sub zSetValue(New_Value As Object)
If Not (pValue Is New_Value) Then
Set pValue = New_Value
RaiseEvent Change(pValue)
End If
End Sub
Eine Klasse für den Datentyp Variant wird etwas komplexer. Da nicht nur Standard-Datentypen, sondern auch Objekte zugewiesen werden könnten, müssen die internen Zuweisungen und Vergleiche noch weiter differenziert und modifiziert werden:
Public Event Change(ByVal Value As Variant)
Private pValue As Variant
Public Property Get Value() As Variant
If IsObject(pValue) Then
Set Value = pValue
Else
Value = pValue
End If
End Property
Public Property Let Value(New_Value As Variant)
zSetValue New_Value
End Property
Public Property Set Value(New_Value As Variant)
zSetValue New_Value
End Property
Private Sub zSetValue(New_Value As Variant)
If IsObject(New_Value) Then
If IsObject(pValue) Then
If Not (pValue Is New_Value) Then
Set pValue = New_Value
RaiseEvent Change(pValue)
End If
Else
Set pValue = New_Value
RaiseEvent Change(pValue)
End If
Else
If IsObject(pValue) Then
Set pValue = New_Value
RaiseEvent Change(pValue)
ElseIf pValue <> New_Value Then
pValue = New_Value
RaiseEvent Change(pValue)
End If
End If
End Sub
Bei der Objekt-Klasse entfällt allerdings die Möglichkeit der direkten Zuweisung unter Ausnutzung der Standard-Eigenschaft, wie auch bei der Variant-Klasse, falls dieser Objekte zugewiesen werden können.
|