Property-Prozeduren ◦ Zusammenfassung ◦ ?

Die Eigenschaften eines Objekts werden in VBA im Wesentlichen durch öffentliche Variablen in einem Klassenmodul beschrieben. Werden Eigenschaften durch öffentliche Variablen beschrieben, so erhält jeder Benutzer, in dem Rahmen, den der Datentyp festlegt, uneingeschränkte Zugriffsrechte. Anwendungsentwickler wünschen sich jedoch oft, auf Zugriffe reagieren oder sie sogar verhindern zu können. Eine Lösung des Problems besteht darin, mit Hilfe von Prozeduren den Zugriff auf eine Variable einzuschränken. Leider ist dadurch der Zugriff auf die Eigenschaft nach gewohnter Syntax nicht mehr möglich.

Einen Ausweg aus dem Dilemma bieten Property-Prozeduren. Eine Property-Prozedur ist eine Prozedur für das Erstellen benutzerdefinierter Eigenschaften mit individuellen Schreib- und Leserechten. Man arbeitet damit nach dem im Thema Eigenschaften beschrieben Prinzip: Die Eigenschaftswerte werden in privaten Instanzvariablen gespeichert. Der Zugriff auf die Werte erfolgt über ein öffentliches Prozeduren-Paar: eine Schreib- und eine Lese-Property. Im Gegensatz zum oben beschrieben Ansatz erscheinen Eigenschaften, die mit Property-Prozeduren definiert wurden, wie öffentliche Variablen. Wertzuweisungen erfolgen also über den '='-Operator.

Die folgende Tabelle gibt eine Übersicht über die drei Property-Prozeduren, die VBA anbietet. Sie werden paarweise verwendet. Den Zugriff auf Eigenschaften, die durch 'normale' Variablen repräsentiert werden können, definiert man über die Properties Get und Let. Bei Eigenschaften, die durch Objektvariablen repräsentiert werden müssen, verwendet man das Paar Get und Set. Get ist in beiden Fällen für den Lesezugriff zuständig, Let bzw. Set für den Schreibzugriff.

Property Prozedur | Zugriff | Variablenart
Property Get | lesen | 'normale' und Objektvariablen
Property Let | schreiben | 'normale' Variablen
Property Set | schreiben | Objektvariablen

Eigenschaften mit systemdefinierten Datentypen, wie Integer oder String, werden über die Properties Get und Let definiert. Die Eigenschaftsvariable selbst vereinbart man als privat. Get hat dieselbe Syntax wie eine Function-Prozedur, mit einem Rückgabewert vom Datentyp der Eigenschaftsvariablen. Let hat dieselbe Syntax wie eine Sub-Prozedur, mit einem Argument vom Datentyp der Eigenschaftsvariablen. Die beiden Prozeduren haben denselben Prozedurnamen. Die Eigenschaftsvariable muss dagegen anders benannt werden.

    Private Eigenschaftsvariable As Typ

    Public Property Get Eigenschaft() As Typ
      [Anweisungen]
      [Eigenschaft = Eigenschaftsvariable]
    End Property

    Public Property Let Eigenschaft(neuerWert As Typ)
      [Anweisungen]
      [Eigenschaftsvariable = neuerWert]
    End Property

Der Zugriff auf die Eigenschaft erfolgt wie der Zugriff auf eine 'normale' Variable mit dem '='-Operator:

    Variable = Objekt.Eigenschaft    'ruft Property Get auf
    Objekt.Eigenschaft = Ausdruck    'ruft Property Let auf

Get und Let müssen nicht unbedingt beide definiert werden. Fehlt die Get-Property, so ist die Eigenschaft lesegeschützt. Fehlt die Let-Property, so ist sie schreibgeschützt.

Es muss auch nicht unbedingt jeder Eigenschaft eine eigene Eigenschaftsvariable zugeordnet sein. Gerade schreibgeschützte Eigenschaften berechnen oft den Eigenschaftswert bei Bedarf. Die schreibgeschützte Count-Eigenschaft der Collection-Objekte könnte beispielsweise die Anzahl Elemente jedes Mal zählen, anstatt einen gespeicherten Wert abzufragen.

Bei Eigenschaften mit Objekttypen tritt anstelle der Let- die Set-Property. Ansonsten definiert man solche Eigenschaften analog zu vorhin.

    Private Eigenschaftsvariable As Objekttyp

    Public Property Get Eigenschaft() As Objekttyp
      [Anweisungen]
      [Set Eigenschaft = Eigenschaftsvariable]
    End Property

    Public Property Set Eigenschaft(neuerWert As Objekttyp)
      [Anweisungen]
      [Set Eigenschaftsvariable = neuerWert]
    End Property

Der Zugriff auf die Eigenschaft erfolgt wie der Zugriff auf eine Objektvariable mit der Set-Anweisung und dem Zuweisungsoperator '=':

    Set Variable = Objekt.Eigenschaft    'ruft Property Get auf
    Set Objekt.Eigenschaft = Ausdruck    'ruft Property Set auf

©abo