Thema: Delphi Collections mit COM

Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Collections mit COM

  Alt 13. Jul 2003, 21:12
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.

......
Angehängte Dateien
Dateityp: zip collection_sample.zip (6,6 KB, 23x aufgerufen)
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat