PDA

Vollständige Version anzeigen : Klassenmodul


GoofyUlm
26.04.2001, 00:46
Was ist ein Klassenmodul, was habe ich darunter zu verstehen..??

Manuela Kulpa
26.04.2001, 06:51
Hallo Goofy!

Eine Klasse ist eine Definition für ein Objekt. Sie enthält Informationen dazu, wie sich ein Objekt verhalten sollte, einschließlich des Namens, der Methode, Eigenschaften und Ereignisse. Sie ist eigentlich nicht selbst ein Objekt, da sie nicht im Speicher vorhanden ist. Wenn Codeanweisungen durchgeführt werden, die sich auf eine Klasse beziehen, wird eine neue Instanz der Klasse, ein Objekt, im Speicher erstellt. Obwohl es nur eine Klasse gibt, können mehrere Objekte desselben Typs durch diese Klasse im Speicher erstellt werden.

Du kannst dir eine Klasse wie ein Objekt auf dem Papier vorstellen, d.h. es liefert die Blaupause für ein Objekt, ist allerdings im Speicher selbst nicht vorhanden. Du kannst mit dieser Blaupause beliebig viele Objekte erstellen. Eine hilfreiche Analogie besteht vielleicht darin, eine Klasse mit einer Ausstechform und die Objekte mit Keksen zu vergleichen. Jeder Keks kann geringfügig abweichende Merkmale haben, aber für alle wurde dieselbe Ausstechform verwendet. Ähnlich wird auch jedes Objekt aus einer Klasse erstellt, die dieselben Elemente aufweist: Eigenschaften, Methoden und Ereignisse. Aber jedes Objekt verhält sich wie eine eigenständige Einheit. Die Eigenschaften eines Objektes können z.B. auf andere Werte festgelegt sein als die eines anderen Objekts vom selben Typ.

Ein VBA-Projekt kann zwei verschiedene Arten von Klassenmodule enthalten: Basisklassenmodule, denen keine Benutzeroberfläche zugeordnet sind, und Klassenmodule, die zu einem Formular oder einer anderen Komponente gehören. Klassenmodule, die z.B. einem Formular zugeordnet sind, das einem Basisklassenmodul entspricht, setzten voraus, dass sie nur dann im Speicher existieren, wenn auch das Formular im Speicher vorhanden ist. Beispiele für Objekte, die Klassenmodulen zugeordnet sind, sind Access-Formular und Berichte.

Ein kleines Beispiel:

<FONT SIZE=1 FACE=Courier New><FONT COLOR=#008000>' Beispiel: MeineKlasse.cls</FONT>

<FONT COLOR=#008000>' MeineEigenschaft ist für Werte geeignet</FONT>
<FONT COLOR=#000080>Private</FONT> Eigenschaft

<FONT COLOR=#008000>' Eigenschaft lesen</FONT>
<FONT COLOR=#808080><HR></FONT>
Property Get MeineEigenschaft()

MeineEigenschaft = Eigenschaft

<FONT COLOR=#000080>End</FONT> Property
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#008000>' Eigenschaft verändern</FONT>
Property Let MeineEigenschaft(Einstellung)

Eigenschaft = Einstellung

<FONT COLOR=#000080>End</FONT> Property
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#008000>' ShowCopyright-Methode</FONT>
<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Sub</FONT> ShowCopyright()

<FONT COLOR=#000080>Dim</FONT> s <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>String</FONT>
s = "Beispielklasse: MeineKlasse" & Chr$(13) _
& "Copyright Susi Mustermann 2001"
MsgBox s, vbInformation, "Info"

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#008000>' Modul basTestKlasse</FONT>
<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Sub</FONT> TestEigenschaft()

<FONT COLOR=#008000>' MeineKlasse initialisieren</FONT>
<FONT COLOR=#000080>Dim</FONT> c <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>New</FONT> MeineKlasse

<FONT COLOR=#008000>' Aufruf von Let MeineEigenschaft</FONT>
c.MeineEigenschaft = 3
<FONT COLOR=#008000>' Aufruf von Get MeineEigenschaft</FONT>
MsgBox "Du hast folgendes angegeben: " & c.MeineEigenschaft
<FONT COLOR=#008000>' Aufruf ShowCopyright-Methode</FONT>
c.ShowCopyright

<FONT COLOR=#008000>' MeineKlasse zerstören</FONT>
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> c Is <FONT COLOR=#000080>Nothing</FONT> <FONT COLOR=#000080>Then</FONT> <FONT COLOR=#000080>Set</FONT> c = <FONT COLOR=#000080>Nothing</FONT>

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>
<FONT COLOR=#808080><HR></FONT>

</FONT>
Gruss

Stefan Kulpa
26.04.2001, 07:01
Hallo GoofyUlm,

ein Klassenmodul ist einem "normalem" Modul recht ähnlich. Der größte Unterschied (zumindest in VBA) ist der Umstand, dass auf die Methoden und Eigenschaften einer Klasse erst dann zugegriffen werden kann, wenn eine entsprechende Klassenvariable deklariert und initialisiert wurde.

Beispiel:
<FONT SIZE=1 FACE=Courier New><FONT COLOR=#008000>'============================================================</FONT>
<FONT COLOR=#008000>'Klasse: cMyClass</FONT>
<FONT COLOR=#008000>'============================================================</FONT>

<FONT COLOR=#000080>Dim</FONT> m_sDateToday <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>String</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Sub</FONT> Class_Initialize()

<FONT COLOR=#000080>Dim</FONT> sDate <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>String</FONT>
sDate = "Heute ist " & Format(Now, "Long Date") & _
", es ist " & Format(Now, "Short Time") & " Uhr!"
Today = sDate

<FONT COLOR=#808080><HR></FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

<FONT COLOR=#000080>Public</FONT> Property Get Today() <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>String</FONT>

Today = m_sDateToday

<FONT COLOR=#808080><HR></FONT>
<FONT COLOR=#000080>End</FONT> Property

<FONT COLOR=#000080>Public</FONT> Property Let Today(<FONT COLOR=#000080>ByVal</FONT> sNewValue <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>String</FONT>)

m_sDateToday = sNewValue

<FONT COLOR=#808080><HR></FONT>
<FONT COLOR=#000080>End</FONT> Property

<FONT COLOR=#008000>'============================================================</FONT>
<FONT COLOR=#008000>'Standardmodul: Modul1</FONT>
<FONT COLOR=#008000>'============================================================</FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Sub</FONT> Test()

<FONT COLOR=#000080>Dim</FONT> cTest <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>New</FONT> cMyClass
MsgBox cTest.Today

<FONT COLOR=#808080><HR></FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

</FONT>


Ok, das Beispiel ist nicht unbedingt sehr anspruchsvoll - es zeigt aber eines der Grundprinzipien einer Klasse, die Nutzung von Eigenschaften (Properties).
Ein weiterer Unterschied zu normalen Modulen sind die Eigenschaften

Private Sub Class_Initialize() und
Private Sub Class_Terminate()

Sobald eine Klassenvariable initialisiert wird, erfolgt automatisch der Aufruf von Class_Initialize. Wird diese Referenz wieder "zerstört" (z.B. durch Set cTest = Nothing), erfolgt automatisch der Aufruf von Class_Terminate.

Es gibt sicherlich Unmengen von Beispielen zu diesem Thema - ich empfehle daher einen Blick in die Online-Hilfe bzw. in die MSDN.

Gruß,

Manuela Kulpa
26.04.2001, 07:10
@Stefan
LOL, eine Familie – ein Gedanke – und das fast zeitgleich!

@Goofy
Doppel beantwortet hält besser *g*!

Gruss