objMyField hat den Datentyp clsDataRecField (es wird deklariert), welcher eine Klasse ist, also der "Bauplan" des Objektes. Erst wenn man die Variable mit New initialisiert, wird mit dem Bauplan das Objekt erstellt ("gebaut"). Das ist in jeder Hochsprache so.
Wichtig ist zu wissen: VB/VBA kennt nur den Default-Konstruktor, mehr gibt es nicht - keine weiteren "Spielereien" (außer die mit Interfaces) sind möglich.
Wenn man also ein Objekt in Kurzform initialisieren will, dann macht man es mit einer Funktion:
' in einem Modul, d.h. nicht im Klassenmodul!
Public Function CreateInstance(sType As String, _
sName As String, _
bNecessary As Boolean, _
vContent As Variant) As clsDataRecField
Dim objNewField As clsDataRecField '... As New clsDataRecField 'gewöhn dir das gar nicht erst an
Set objNewField = New clsDataRecField
with objNewField
.FieldType = sType ' erfordert eine entspr. 'Property Let FieldType' in der Klasse 'clsDataRecField'
.Name = sName ' ...
.Necessary = bNecessary ' ...
.Contents = vContent ' ...
end with
Set CreateInstance = objNewField ' Objektvariablen immer mit Set zuweisen!
Set objNewField = Nothing ' geschieht idR. autom. nach Verlassen, es ist jedoch nie verkehrt selbst 'aktiv' daran zu denken
End Function
PS: ByVal solltest du nur dann verwenden, wenn du an den Parametern intern etwas änderst und nicht willst das es Auswirkungen auf deren Argumente außerhalb hat. ByVal kostet dich jedesmal Geschwindigkeit, da Daten 1:1 kopiert werden (außer Objekte, darauf hat ByVal keinen Einfluss, die werden trotzdem ByRef übergeben).
In deiner Herangehensweise würden die Daten zweimal kopiert werden - 1.: Argument -> Parameter; 2.: Parameter -> Membervariable
In obigen Beispiel findet das Kopieren nur einmal statt (Parameter -> Membervariable).
Gruß
|