Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Was ist eigentlich eine Klasse
zurück: Urlaubskalender mit Anwesenheitsplanung weiter: Gibt es unterschiedlichen Klassen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Isabelle :-)
Menschin


Verfasst am:
23. Aug 2012, 22:00
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


Was ist eigentlich eine Klasse - Was ist eigentlich eine Klasse

Nach oben
       Version: Office 2k (2000)

Hallöchen,

ganz einfach, eine Klasse ist ein virtuelles Objekt. Du arbeitest die ganze Zeit schon mit Klassen, allerdings mit welchen die einem für dich realen Objekt entsprechen. Diese werden auch "integrierte Klassen" genannt. Nehmen wir als Beispiel die Range-Klasse. Diese Klasse hat verschiedene Eigenschaften wie die Value-Eigenschaft und du kannst verschiedene Methoden auf diese Klasse ausführen wie die Clear-Methode. Wir wollen nun einer eigenen Klasse die Value-Eigenschaft und die Clear-Methode geben.

Dazu brauchen wir natürlich erst mal ein entsprechendes Modul, welches wir über die Menüleiste – Einfügen – Klassenmodul erzeugen. Im Eigenschaftsfenster ändern wir den Namen von Klasse1 nach clsRange. Der Präfix cls dient zum Kennzeichnen eine Klassenmoduls, Range ist unser Name zum Spielen.

Merke: Gib einer Klasse, oder einer Prozedur nie den Namen einer Klasse die es in Excel schon gibt, also z.B. nur Range oder Workbook. Das kann zu unvorhersehbaren Fehlern führen. Benutzte immer Präfixe um solche Verwechselungen auszuschließen. Anders ist das bei den Eigenschaften oder Methoden. Wir benutzen z.B. in unserer Klasse auch eine Value-Eigenschaft. Da das aber eine Eigenschaft unserer Klasse ist können wir diesen Namen bedenkenlos benutzen.

Nun müssen wir in der Klasse die Eigenschaft Value definieren. Dazu haben wir zwei Möglichkeiten.

1. Wir deklarieren eine öffentlich Eigenschaft mit:

Code:
Option Explicit

Public Value As Variant

Meiner Meinung nach aber die unsaubere Variante denn das ist für mich keine richtig deklarierte Variable in einem Klassenmodul.

Merke: Eine öffentliche Variable in einem Klassenmodule ist keine öffentliche Variable im VBA-Projekt, sondern eine öffentliche Eigenschaft der Klasse in der sie deklariert ist.

2. Wir deklarieren eine private Variable und dazu entsprechende Eigenschaftsprozeduren:

Code:
Option Explicit

Private mvntValue As Variant

Public Property Get Value() As Variant
    Value = mvntValue
End Property

Public Property Let Value(ByVal pvvntNewValue As Variant)
    mvntValue = pvvntNewValue
End Property

Mit Property Let können wir die Value-Eigenschaft schreiben, mit Property Get die Value-Eigenschaft lesen.

Der Präfix mvnt kennzeichnet eine Klassenvariable (m) von Typ Variant (vnt). pvvnt einen Parameter (p) der als Wert (v) übergeben wird vom Typ Variant (vnt).

Wo liegt nun der Unterschied zwischen den beiden?

Wenn wir die Klasse von außen betrachten gibt es keinen Unterschied. In beiden Fällen hat sie eine Value-Eigenschaft auf die Lese- und Schreibzugriff besteht.

Zugriff ist unser Stichwort. Denn über die Property-Prozeduren können wir die Art des Zugriffs steuern. Lassen wir die Property Get – Prozedur weg, dann ist die Eigenschaft lesegeschützt, wir können sie also nur schreiben. Lassen wir die Property Let – Prozedur weg, ist die Eigenschaft schreibgeschützt, wir können sie also nur lesen.

Anstatt die entsprechenden Eigenschafts-Prozeduren ganz weg zu lassen, können wir sie aber auch als Private deklarieren. Damit ist die Eigenschaft nur noch innerhalb der Klasse selbst bekannt. Darauf werde ich in einem folgenden Tipp noch eingehen.

Ich deklariere eine Variable aus Prinzip immer mit ihrem entsprechenden Präfix und gebe dann den Eigenschafts-Prozeduren die entsprechenden Namen.

Nun brauchen wir als nächstes die Clear-Methode. Methoden in Klassen sind nichts anderes als Sub-Prozeduren oder Funktionen. Da wir von unserer Methode keinen Rückgabewert erwarten (was sollte die auch zurückgeben) legen wir also folgende Prozedur an:

Code:
Public Sub Clear()
    Value = Empty
End Sub

Wie du siehst, benutze ich hier die Variable mvntValue nicht direkt, was natürlich genauso geht, sondern auch wieder die Eigenschaftsprozedur um darauf zuzugreifen.

Wie du das machst bleibt natürlich, wie auch die Deklaration der Eigenschaft oder die Benamung der Variablen dir überlassen. Ich lege aber grundsätzlich Wert auf saubere Deklarationen und Programmierung.

Und nun wollen wir die Klasse mal benutzen. Da aber, anders als bei einem realen Objekt wie einem Range-Objekt, diese beim Öffnen der Mappe noch nicht existiert, müssen wir sie erst anlegen. Dazu benötigen wir eine Klassenvariable vom Typ unserer Klasse. Also in einer Prozedur:

Code:
Dim objRangeClass As clsRange

Damit haben wir aber nur eine Variable mit dem Wert Nothing denn da es ein virtuelles Objekt ist müssen wir es im Arbeitsspeicher erst anlegen. Das geschieht mit Hilfe von Set und New. Set um die Speicheradresse der mit New neu angelegten Instanz der Klasse an unsere Variable zu übergeben. Also:

Code:
Set objRangeClass = New clsRange


Merke: Set erzeugt kein Objekt oder die Kopie eines Objektes sondern einen Verweis auf ein Objekt. Ein Verweis ist nur die Speicheradresse des tatsächlichen Objektes. Das ist eine Zahl vom Typ Long.

Und schon können wir auf die Eigenschaft und Methode zugreifen (Step die Prozedur mal mit F8 durch, damit du siehst was dabei in der Klasse selbst passiert):

Code:
Option Explicit

Public Sub Test()

    Dim objRangeClass As clsRange

    Set objRangeClass = New clsRange 'Neue Instanz der Klasse erstellen

    objRangeClass.Value = 123 'Value schreibe

    MsgBox objRangeClass.Value 'Value lesen

    Call objRangeClass.Clear 'Clear anwenden

    MsgBox objRangeClass.Value 'Value lesen

    Set objRangeClass = Nothing 'Instanz der Klasse zerstören

End Sub

Am Ende der Prozedur setze ich die Klassenvariable explizit auf Nothing. Das hat folgenden Grund. Bestimmte Klassen sind speicherresistent. Sprich, auch nach dem Beenden der Prozedur durch End Sub belegt die Klasse immer noch den Speicher in dem sie angelegt wurde. Auch wenn wir nicht mehr darauf zugreifen können. Bestimmte Klassen deswegen, da es sich dabei um Klassen handelt die wiederum Klassen enthalten. Aber das behandeln wir in einem folgenden Tipp.

Die Eigenschaften und Methoden aller Klassen sehen mehr oder weniger so aus, auch die von den integrierten Klassen.

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Tipps & Tricks: Klassenprogrammierung: Klasse serialisieren 1 Isabelle :-) 331 31. März 2014, 13:20
Isabelle :-) Klassenprogrammierung: Klasse serialisieren
Keine neuen Beiträge Excel VBA (Makros): sheet.protect als Klasse oder Funktion? 2 Lionbrother 103 20. Dez 2013, 13:47
Lionbrother sheet.protect als Klasse oder Funktion?
Keine neuen Beiträge Excel VBA (Makros): Code als Funktion oder Klasse umwandeln 20 Käpsele 389 11. Feb 2013, 18:14
Käpsele Code als Funktion oder Klasse umwandeln
Keine neuen Beiträge Excel VBA (Makros): Modul oder Klasse für einen "Weiter-Button" 2 freddy123 190 22. Aug 2012, 10:28
Gast Modul oder Klasse für einen "Weiter-Button"
Keine neuen Beiträge Excel VBA (Makros): SteuerelementeFeld aus Klasse? 5 dera 190 25. Mai 2012, 19:24
Isabelle :-) SteuerelementeFeld aus Klasse?
Keine neuen Beiträge Excel VBA (Makros): Als Public definierte Variable in einer Klasse verliert Wert 6 abc123michael 291 29. Feb 2012, 13:56
Gast Als Public definierte Variable in einer Klasse verliert Wert
Keine neuen Beiträge Excel VBA (Makros): Klasse nicht registriert - Progress Bar 0 Busta 702 17. Okt 2011, 20:50
Busta Klasse nicht registriert - Progress Bar
Keine neuen Beiträge Excel Formeln: sverweis für zwischenwerte einer Klasse 3 Bamma 1232 21. Feb 2011, 19:45
Bamma sverweis für zwischenwerte einer Klasse
Keine neuen Beiträge Excel VBA (Makros): Kalender in der Klasse 7 RO_SCH 895 31. Jan 2011, 23:14
Nepumuk Kalender in der Klasse
Keine neuen Beiträge Excel VBA (Makros): Eine Default-Property in einer Klasse definieren 6 RO_SCH 718 06. Jan 2011, 11:53
Nepumuk Eine Default-Property in einer Klasse definieren
Keine neuen Beiträge Excel VBA (Makros): Function nur in Klasse verfügbar 8 aep 394 14. Apr 2010, 18:28
humanresource Function nur in Klasse verfügbar
Keine neuen Beiträge Excel Formeln: Häufigkeiten mit Elementanz. pro Klasse 3 maxseidel 501 18. Nov 2009, 10:14
E4M Häufigkeiten mit Elementanz. pro Klasse
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Dreamweaver Forum