Forums Neueste Beiträge
 

[VBA] Default-Eigenschaft einer Klasse

22/12/2009 - 10:03 von Peter Schleif | Report spam
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/...ection.xls
 

Lesen sie die antworten

#1 Andreas Killer
22/12/2009 - 13:27 | Warnen spam
On 22 Dez., 10:03, Peter Schleif wrote:

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.

Ähnliche fragen