Also, ich mache es jetzt mal kurz. Dein Collection-Interface muss das Windows-Interface
IEnumVariant unterstützen. Im Type-Library Editor musst Du für das Collection-Interface folgende Read-Only-Properties hinzfügen:
- _NewEnum (beachte den führenden Underscore), ID auf -4, Type auf IUnknown *
- Items (wird die Standard-Eigenschaft); ID auf 0; Type auf entweder IDispatch oder den Typen des Collection-Items
- Count; ID ist egal; Type auf long
So, soviel zu den Vorbereitungen.
Die Interface-Klasse der Collection-List muss erweitert werden. Im gelieferten Beispiel wird aus
TCollectionList = class(TASPMTSObject, ICollectionList)
einfach
TCollectionList = class(TBaseCollectionList, ICollectionList, IEnumVariant)
TBaseCollectionList kommt aus der mitgelieferten
Unit uBaseCollection.
Das Interface des Collection-Item wird in der Type-Library um die Eigenschaft
Key erweitert, Type BSTR (WideString), ID auf 0 (Standardeigenschaft; ist optional, aber sinnvoll).
Die Interface-Klasse des Collection-Item muss auch erweitert werden. Im gelieferten Beispiel wird aus
TCollectionItem = class(TASPMTSObject, ICollectionItem)
einfach
TCollectionItem = class(TASPMTSObject, ICollectionItem, IBaseCollectionItem)
Das Interface
IBaseCollectionItem kommt auch aus der mitgelieferten
Unit uBaseCollection.
Die Klasse TBaseCollectionList
In dieser Klasse geschieht das eigentliche der Collection-Arbeit. Die eigentlichen Funktionen des Interfaces
IEnumVariant werden hier gefüllt. Collections müssen, wenn diese durchlaufen werden sich selbst klonen, aber mit dem gleichen Daten wie das Original arbeiten. Dadurch werden diese thread-safe. Die mitgelieferte Basisklasse
TBaseCollectionList tut genau das. Ich setze die
Unit (unter steten Erweiterungen) seit Feb. 2000 ein. Inzwischen ist die
Unit mehrere hundert Male erfolgreich implementiert. Ich hoffe es funktioniert auch bei Dir ohne Probleme. Einfach anschauen und testen.
Eine kleine Bitte
Wenn jemand Verbesserungen oder Vorschläge hat, sendet diese bitte an mich.
Jetzt das Beispiel und viel Erfolg
Bedenke, daß das Beispiel mit Delphi 7 erstellt ist und daher die
Unit Variants benötigt. Wenn Dein Compiler älter ist (ich glaube bis v5) einfach die
Unit aus der Uses-Klausel entfernen, die wurde erst später durch Borland eingeführt.
...
...