Discussion:
[VBA] Default-Eigenschaft einer Klasse
(zu alt für eine Antwort)
Peter Schleif
2009-12-22 09:03:34 UTC
Permalink
Hallo.

Bei Pearson [1] habe ich gelernt, die Eigenschaft einer Klasse zur
Default-Eigenschaft zu erklären so dass beim Lesen/Schreiben dieser
Eigenschaft der eigentliche Name entfallen darf.

Nun habe ich zwei kleine Klassen geschrieben [2]

KeyCollection
KeyCollectionItem

Diese fügen den Einträgen einer VBA-Collection die fehlende Eigenschaft
.Key hinzu. (Im Prinzip reicht auch die Item-Klasse, aber durch die
Collection-Klasse kann bestehender Code unverändert bleiben – man muss
nur die Deklaration der Collection-Variable anpassen)


Der Pearson-Trick funktioniert mit der .Value-Eigenschaft der
Item-Klasse. Diese hat den Typ Variant. Es funktioniert leider nicht mit
der .Items-Eigenschaft der Collection-Klasse, die eine
Standard-Collection zurück gibt. Get .Items() als solches funktioniert
korrekt - gibt man es explizit an, so wird auch eine korrekte Collection
zurückgeliefert. Aber im Gegensatz zu .Value man kann es nicht weglassen.

Warum?
Geht das nur mit skalaren Typen?
Was mache ich falsch?

Es würde mir auch helfen, wenn jemand bestätigen könnte, das es _nicht_
geht. Dann könnte ich mir die weitere Fehlersuche sparen.


Vielen Dank im Voraus.

Peter

[1] http://www.cpearson.com/excel/DefaultMember.aspx
[2] http://home.arcor.de/peter.schleif/KeyCollection.xls
Andreas Killer
2009-12-22 12:27:36 UTC
Permalink
Post by Peter Schleif
Der Pearson-Trick funktioniert mit der .Value-Eigenschaft der
Item-Klasse. Diese hat den Typ Variant. Es funktioniert leider nicht mit
der .Items-Eigenschaft der Collection-Klasse, die eine
Standard-Collection zurück gibt. Get .Items() als solches funktioniert
korrekt - gibt man es explizit an, so wird auch eine korrekte Collection
zurückgeliefert. Aber im Gegensatz zu .Value man kann es nicht weglassen.
Warum?
Weiß ich nicht, aber ich weiß wie's geht. :-)

Also in der KeyCollectionItem hast Du diese beiden Property's mit
Attributen:

--- schnipp ---
Property Get Value() As Variant
' Attribute Value.VB_UserMemId = 0
Value = m_Value
End Property

Property Let Value(vValue As Variant)
' Attribute Value.VB_UserMemId = 0
m_Value = vValue
End Property
--- schnapp ---

Und in der KeyCollection brauchst Du diese drei Property's mit
Attributen:

--- schnipp ---
Property Get Items() As Collection
' Attribute Items.VB_UserMemId = 0
Set Items = m_Collection
End Property

Property Let Items(Value)
' Attribute Items.VB_UserMemId = 0
m_Collection.Item(Value) = Key
End Property

Property Get NewEnum() As IUnknown
' Attribute NewEnum.VB_UserMemId = -4
' Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = m_Collection.[_NewEnum]
End Property
--- schnapp ---

Das MemberFlags macht die Eigenschaft normalerweise unsichtbar, geht
aber in VBA scheinbar nicht, egal. So kannst Du jedenfalls Deine
Schleife

For Each vItem In oColl
Debug.Print vItem.Key, vItem
Next

so laufen lassen.

Andreas.
Peter Schleif
2009-12-24 08:41:13 UTC
Permalink
Post by Andreas Killer
Property Get Items() As Collection
' Attribute Items.VB_UserMemId = 0
Set Items = m_Collection
End Property
Property Let Items(Value)
' Attribute Items.VB_UserMemId = 0
m_Collection.Item(Value) = Key
End Property
Property Get NewEnum() As IUnknown
' Attribute NewEnum.VB_UserMemId = -4
' Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = m_Collection.[_NewEnum]
End Property
Super. Vielen Dank. So geht's. Habe es zwar noch nicht ganz verstanden,
ist aber erst mal egal. Muss ich mir bei Gelegenheit noch mal anschauen.
Hauptsache es läuft erst mal.

Vielen Dank. Frohes Fest.

Peter
Andreas Killer
2009-12-24 08:49:52 UTC
Permalink
Post by Peter Schleif
Super. Vielen Dank. So geht's. Habe es zwar noch nicht ganz verstanden,
ist aber erst mal egal. Muss ich mir bei Gelegenheit noch mal anschauen.
Wenn Du was rausbekommst, dann lass es mich wissen. Ich hab das auch
nur irgendwo mal gefunden und keine Ahnung wieso und warum es geht.
Post by Peter Schleif
Hauptsache es läuft erst mal.
Vielen Dank. Frohes Fest.
Danke Dir auch.

Andreas.

Lesen Sie weiter auf narkive:
Loading...