Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Klassenprogrammierung: Konstruktor überladen
zurück: Notiz in Kommentar weiter: Klassenprogrammierung: Singleton-Klasse 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:
10. Sep 2013, 17:12
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


Klassenprogrammierung: Konstruktor überladen - Klassenprogrammierung: Konstruktor überladen

Nach oben
       Version: Office 2k (2000)

Hallöchen,

„Konstruktor überladen“ was soll das bitte sein?

Eigentlich ganz einfach, du erstellst eine Instanz deiner Klasse mit:

Code:
Set MeineKlassenVariable = New MeineKlasse

Jetzt würdest du schon beim initialisieren der Klasse einen oder mehrere Parameter mitgeben. Also so:

Code:
Set MeineKlassenVariable = New MeineKlasse(Variable1, Variable2)

Das geht in VBA aber nicht, da das Initialize-Event der Klasse keine Parameter hat:

Code:
Private Sub Class_Initialize()

und, weil uns VBA gar keine Möglichkeit gibt einen eigenen Konstruktor zu definieren.

Was können wir da machen.

Jetzt wird es etwas kompliziert:

Jede Klasse hat verschiedene interne Eigenschaften. Die einzige Eigenschaft die du ändern kannst ist die „Instancing-Eigenschaft“. Die kannst du von 1 – Private auf 2 – PublicNotCreatable ändern. Diese Eigenschaft wird z.B. in folgendem Tipp geändert:

http://www.office-loesung.de/ftopic251939_0_0_asc.php

damit die Klasse in allen Projekten sichtbar wird.

Aber eine Klasse hat noch andere, normalerweise in VBA unsichtbare Eigenschaften. Sehen kannst du diese, wenn du die Klasse exportierst und mit dem Texteditor öffnest:

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "Klasse1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False

Uns interessiert hier mal die Eigenschaft „VB_PredeclaredId“. Diese ist standardmäßig auf False gesetzt. Das zwingt uns in VBA die Klasse immer mit New als eine Instanz zu erstellen.

Wenn wir diese Eigenschaft auf True setzen, können wir die Klasse wie eine Variable benutzen.

Füge einfach mal ein neues Klassenmodul ein, darin folgender Code:

Code:
Option Explicit

Public Function GetKlasse() As Klasse1
    Set GetKlasse = Me
End Function

und versuche in einem Standardmodul folgendes:

Code:
Option Explicit

Public Sub Test()
    Dim objKlasse1 As Klasse1
    Set objKlasse1 = Klasse1.GetKlasse
End Sub

Was passiert, du bekommst einen Kompilierfehler – Variable nicht deklariert in dieser Zeile:

Set objKlasse1 = Klasse1.GetKlasse

Rechtsklick auf das Klassenmodul – Entfernen von Klasse1. Die Frage „Möchten Sie Klasse1 vor dem Entfernen exportieren?“ mit Ja beantworten und das Klassenmodul z.B. auf dem Desktop speichern. Jetzt die Klasse1.cls mit dem Texteditor öffnen und das Attribut „VB_PredeclaredId“ auf True setzen, die Datei speichern und schließen. Nun die Klasse wieder Importieren.
Wenn du jetzt auf Kompilieren klickst wird die angeblich nicht deklarierte Variable nicht mehr angemeckert, und wenn wir die Testprozedur starten, läuft sie tatsächlich ohne Fehler durch. Wir haben also Zugriff auf die Klasse.

Jetzt wollten wir es aber eigentlich so machen:

Code:
Set objKlasse1 = New Klasse1(Variable1, Variable2)

Ok, das New benötigen wir schon nicht mehr:

Code:
Set objKlasse1 = Klasse1(Variable1, Variable2)

Aber die Klasse erkennt das nicht. Warum, ganz einfach sie hat keine Standard-Methode. Also machen wir die GetKlasse-Funktion dazu. Füge dazu als Zeilen nach „Public Function GetKlasse() As Klasse1“ diese ein:

Attribute GetKlasse.VB_UserMemId = 0

Das Spielchen wieder mit Klasse entfernen – Exportieren Ja – Importieren.

Und nun ändern wir die Testprozedur so:

Code:
Public Sub Test()
    Dim objKlasse1 As Klasse1
    Set objKlasse1 = Klasse1
End Sub

Heureka, die Prozedur läuft sauber durch.

Jetzt nur noch die Parameter hinzufügen, fertig wäre unsere Klasse. Aber Achtung, jeder Änderung in der Standardprozedur zerstört das Attribut. Du musst also nach einer Änderung dieser Prozedur immer das Spielchen mit Klasse entfernen – Exportieren Ja – Importieren machen. Andere Änderungen in der Klasse haben darauf keine Auswirkung.


Hier mal ein einfacher Beispielcode:
In einem Klassenmodul mit dem Namen „clsConstructor“:

Code:
'Attribute VB_PredeclaredId = True
Option Explicit

Private mstrValue1 As String
Private mstrValue2 As String
Private mstrValue3 As String

Public Function Constructor( _
    Optional ByVal opvstrValue1 As String, _
    Optional ByVal opvstrValue2 As String, _
    Optional ByVal opvstrValue3 As String) As clsConstructor
'Attribute Constructor.VB_UserMemId = 0

    Set Constructor = Me

    Value1 = opvstrValue1
    Value2 = opvstrValue2
    Value3 = opvstrValue3

End Function

Friend Property Get Value1() As String
    Value1 = mstrValue1
End Property

Friend Property Let Value1(ByVal pvstrValue1 As String)
    mstrValue1 = pvstrValue1
End Property

Friend Property Get Value2() As String
    Value2 = mstrValue2
End Property

Friend Property Let Value2(ByVal pvstrValue2 As String)
    mstrValue2 = pvstrValue2
End Property

Friend Property Get Value3() As String
    Value3 = mstrValue3
End Property

Friend Property Let Value3(ByVal pvstrValue3 As String)
    mstrValue3 = pvstrValue3
End Property

In einem Standardmodul:

Code:
Option Explicit

Public Sub Test()

    Dim objConstructorClass As clsConstructor

    Set objConstructorClass = clsConstructor("Hallo", "Office", "Lösung")

    With objConstructorClass
        Debug.Print .Value1, .Value2, .Value3
    End With

    Set objConstructorClass = Nothing

End Sub

Ich hänge noch eine Mustermappe an damit du siehst dass es funktioniert. Wenn nicht, dann hast du etwas falsch gemacht.

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%



Constructor_ueberladen.xls
 Beschreibung:

Download
 Dateiname:  Constructor_ueberladen.xls
 Dateigröße:  20.5 KB
 Heruntergeladen:  37 mal

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 VBA (Makros): RoundDown klappt nicht - Palette dadurch überladen! 2 Mungo der Dritte 85 12. Feb 2013, 13:58
Mungo der Dritte RoundDown klappt nicht  -  Palette dadurch überladen!
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Word Serienbriefe