VBA Klasse erstellen mit anderen Klassen als Member

tecla

Erfahrenes Mitglied
Hallo zusammen

Ich bin ein VBA-Newbee und versuche auch in VBA Klassen zuerstellen.

Ich habe eine Klasse MyClass, die soll als Member ein Objekt vom Typ MemberClass haben. In MemberClass hat es ein paar String-Member drin:


Code:
'******   Die MemberClass **************

Option Explicit

Dim mName As String
Dim mKurz As String
Dim mDBTest As String
    
Private Sub Class_Initialize()
    mName = ""
    mKurz = ""
    mDBTest = ""
End Sub
    
Public Property Let Name(sName As String)
    mName = sName
End Property

Public Property Get Name() As String
    Name = mName
End Property

Public Property Let Kurz(sKurz As String)
    mKurz = sKurz
End Property

Public Property Get Kurz() As String
    Kurz = mKurz
End Property

Public Property Let DBTest(sDBTest As String)
    mDBTest = sDBTest
End Property

Public Property Get DBTest() As String
    DBTest = mDBTest
End Property





'******   Die MyClass**************

Option Explicit
Dim mMemberClass  As New MemberClass 

    
Public Property Let MemberClass (ByVal oMemberClass  As MemberClass )
    mMemberClass  = oMemberClass 
End Property
    
Public Property Get MemberClass () As MemberClass 
    MemberClass = mMemberClass 
End Property


Private Sub Class_Initialize()
    Set mMemberClass = New MemberClass 
    mMemberClass.Name = "Hinz"
    mMemberClass.Kurz = "HZ"
    mMemberClass.DBTest = "ja"
End Sub



Nun versuche ich die Klasse als globales Object zu befüllen und zu verwenden:

Code:
Option Explicit
Public oMyClass As New MyClass

Set oMyClass = New MyClass
MsgBox oMyClass.MemberClass.Name & " " & oMyClass.MemberClass.Kurz & " " & oMyClass.MemberClass.DBTest

Und erhalte die Fehlermeldung, dass die Objekt-Variable nicht festgelegt sei. Ich kann auf die MemberClass vom Objekt oMyClass nicht zugreifen. Dabei wird ja die MemberClass im Konstruktor der MyClass neu instanziert und ihre Member mit Daten gefüllt....


Nun habe ich schon alle möglichen Varianten ausprobiert, findet jemand das Problem?

Vielen Dank! Tecla
 

Zvoni

Erfahrenes Mitglied
Zeile 55.

Objekt-Zuweisung muss per Set erfolgen

Visual Basic:
Set MemberClass = mMemberClass

Ich würde mir aber an deiner Stelle Gedanken über eine Durchdelegierung machen
 

tecla

Erfahrenes Mitglied
Vielen Dank, das hat geholfen.
Ganz verstehe ichs aber immer noch nicht. Wieso muss ich denn in der Zeile 51 kein Set verwenden? Da wird ja auch einem Objekt ein anderes zugewiesen...

Und was meinst du mit Durchdelegierung?
 

Yaslaw

n/a
Moderator
Auch auf Zeile 51 brauchst du ein Set.
Immer wenn du ein Objekt einer Objektvariablen zuordnest, brauchst du dafür Set.

Die Frage die sich stellt: Willst du jedesmal eine Kopie des Objektes oder eine Referenz?
Meistens macht man eine Referenz. Diese bewirkt jedoch, dass Änderungen auch ausserhalb der Klasse ihre Gültigkeit haben. Dafür ist aber weniger Speicherbedarf etc. als Vorteil.

Visual Basic:
Private mObj AS MyClass

Public Property Let obj(ByRef iObj AS MyClass)
    Set mObj = iObj
End Property
 

Zvoni

Erfahrenes Mitglied
Durchdelegieren: Für jede Eigenschaft der MemberClass eine passende Eigenschaft in MyClass.
Die Kommunkation intern läuft zwischen den zwei Klassen, von Aussen wird nur auf Eigenschaften von MyClass zugegriffen. Ist aber Geschmackssache.

Ich persönlich kenne nur eine Situation, wo ich auf interne Klassen von Aussen zugreifen möchte, und das sind Auflistungsklassen.
 

Yaslaw

n/a
Moderator
Das Durchdeligieren ist mMn nur sehr selten Sinnvoll.

Meistens hat man die andere Richtung. Ein Objekt wird von Aussen als Parameter übergeben..
 

Zvoni

Erfahrenes Mitglied
Das Durchdeligieren ist mMn nur sehr selten Sinnvoll.

Meistens hat man die andere Richtung. Ein Objekt wird von Aussen als Parameter übergeben..

Yo, ist auch ne Variante. Sofern das übergebene Objekt nur Eigenschaften hat.
Sobald jedoch Klassenmethoden ins Spiel kommen kann es haarig werden. Da delegiere ich lieber durch.
Wenn die Klassen homogen untereinander sind, ist Interface/Polymorphie jedoch auch ne Möglichkeit.
 

tecla

Erfahrenes Mitglied
Vielen Dank euch beiden! Das war sehr aufschlussreich und ich glaube, dass ich nun einigermassen durchblicke:)
 

Neue Beiträge