Freigeben über


Herabsetzen von Anmut in Abwesenheit einer Schnittstelle

Da ein Steuerelement möglicherweise keine andere Schnittstelle als IUnknown unterstützt, muss ein Container ordnungsgemäß herabgestuft werden, wenn keine bestimmte Schnittstelle vorhanden ist.

Man könnte die Nützlichkeit eines Steuerelements mit nichts mehr als IUnknown in Frage stellen. Berücksichtigen Sie jedoch die Vorteile, die ein Steuerelement von der visuellen Programmierumgebung eines Containers (z. B. VB) erhält, wenn der Container das Objekt als Steuerelement erkennt:

  • Eine Schaltfläche für das Objekt wird in einer Toolbox angezeigt.
  • Sie können ein Objekt erstellen, indem Sie es aus der Toolbox auf ein Formular ziehen.
  • Man kann dem Objekt einen Namen geben, der in der visuellen Programmierumgebung erkannt wird.
  • Derselbe Name in (3) oben kann sofort verwendet werden, um jeden anderen Code für Steuerelemente für dasselbe Formular (oder sogar ein anderes Formular) zu schreiben.
  • Der Container kann automatisch Codeeingabepunkte für alle Ereignisse bereitstellen, die von diesem Objekt aus verfügbar sind.
  • Der Container stellt eine eigene Eigenschaftennavigationsbenutzeroberfläche für alle verfügbaren Eigenschaften bereit.

Wenn ein Objekt nicht als Steuerelement erkannt wird, verliert es möglicherweise alle diese sehr leistungsfähigen und vorteilhaften Integrationsfeatures. Beispielsweise ist es in Visual Basic 4.0 sehr schwierig, ein zufälliges Objekt wirklich zu integrieren, das kein Steuerelement im vollständigen Sinne ist, aber möglicherweise noch Eigenschaften und Ereignisse aufweist. Da die Vorstellung eines Steuerelements in Visual Basic 4 sehr restriktiv ist, erhält das Objekt keine der oben genannten Integrationsfeatures. Aber auch ein Steuerelement mit IUnknown, bei dem die bloße Lebensdauer des Steuerelements die Existenz einer Ressource bestimmt, sollte in der Lage sein, die oben beschriebenen Integrationsfunktionen zu erlangen.

Da aktuelle Tools einen großen Satz von Steuerungsschnittstellen erfordern, um einen Vorteil zu erzielen, werden Steuerelemente in der Regel zu einer Überimplementierung geführt, sodass sie mehr Code enthalten, als sie wirklich benötigen. Steuerelemente, die 7K sein könnten, können am Ende 25K sein, was in Bereichen wie dem Internet ein großes Leistungsproblem darstellt. Dies hat auch zu der Wahrnehmung geführt, dass man ein Steuerelement aufgrund der Komplexität der Implementierung aller Schnittstellen nur mit einem Tool wie dem CDK implementieren kann, und dies hat Auswirkungen, wenn eine große DLL wie OC30.DLL für ein solches Steuerelement erforderlich ist, was den Arbeitssatz erhöht. Wenn nicht alle Schnittstellen erforderlich sind, können viele Entwickler sehr kleine und leichte Steuerelemente mit geradem OLE oder auch mit anderen Tools schreiben, um den Mehraufwand für jedes Steuerelement zu minimieren.

Aus diesem Grund erkennt dieser Anhang ein Steuerelement als jedes Objekt mit einer CLSID und einer IUnknown-Schnittstelle . Selbst wenn nichts anderes als IUnknown vorhanden ist, sollte ein Container mit einer Programmierumgebung in der Lage sein, mindestens die Features #3 und ) Registrierungseintrag bereitzustellen, erhält er die Namen #1 und 2. Wenn das Objekt IConnectionPointContainer (und IProvideClassInfo allgemein) für einen Ereignissatz bereitstellt, erhält es #5, und wenn es IDispatch für Eigenschaften und Methoden unterstützt, erhält es #6 sowie eine bessere Codeintegration im Container.

Kurz gesagt, ein Objekt sollte in der Lage sein, so wenig wie IDispatch und einen Ereignissatz zu implementieren, der über IConnectionPointContainer verfügbar gemacht wird, um alle oben genannten visuellen Features zu erhalten.

Vor diesem Hintergrund wird in der folgenden Tabelle beschrieben, was ein Container tun könnte, wenn keine mögliche Schnittstelle vorhanden ist. Beachten Sie, dass nur die Schnittstellen aufgeführt sind, die der Container direkt über QueryInterface erhält. Andere Schnittstellen, wie IOleInPlaceActiveObject, werden über andere Mittel abgerufen.

Schnittstelle Bedeutung des Schnittstellenausfalls
IViewObject2
Das Steuerelement verfügt über keine Visuellen, die es selbst zeichnet, und hat daher keine bestimmten Ausdehnungen bereitzustellen. In der Laufzeit versucht der Container einfach nicht, etwas zu zeichnen, wenn diese Schnittstelle fehlt. In der Entwurfszeit muss der Container mindestens eine Art Standardrechteck mit einem Namen für ein solches Steuerelement zeichnen, damit ein Benutzer in einer visuellen Programmierumgebung das Objekt auswählen und die vorhandenen Eigenschaften, Methoden und Ereignisse auschecken kann. Die Behandlung des Fehlens von IViewObject2 ist für eine gute unterstützung der visuellen Programmierung von entscheidender Bedeutung.
IOleObject
Das Steuerelement benötigt weder die Website noch nimmt es an einer Aushandlung des Layouts eingebetteter Objekte teil. Alle Informationen (z. B. Steuerungsausdehnungen), die ein Container von dieser Schnittstelle erwarten kann, sollten mit den vom Container bereitgestellten Standardwerten ausgefüllt werden.
IOleInPlaceObject
Das Steuerelement wird nicht aktiv (wie eine Bezeichnung) und versucht daher nie, diese Art zu aktivieren. Die einzige Aktivierung können die Eigenschaftenseiten sein.
IOleControl
Das Steuerelement verfügt über keine Mnemonics und keine Verwendung von Umgebungseigenschaften, und es ist egal, ob der Container Ereignisse ignoriert. Wenn diese Schnittstelle fehlt, ruft der Container seine Methoden einfach nicht auf.
Idataobject
Das Steuerelement stellt keine Eigenschaftensätze oder visuelle Renderings bereit, die zwischengespeichert werden könnten, sodass der Container sich entscheiden würde, eine Standardpräsentation zwischenzuspeichern, wenn diese Schnittstelle nicht vorhanden ist (unterstützung für CF_METAFILEPICT, insbesondere) und alle eigenschaftensatzbezogenen Funktionen deaktivieren würde.
IDispatch
Das Steuerelement verfügt über keine benutzerdefinierten Eigenschaften oder Methoden. Der Container muss in diesem Fall nicht versuchen, Steuerelementeigenschaften anzuzeigen, und sollte alle benutzerdefinierten Methodenaufrufe nicht zulassen, die der Container nicht als Zugehörigkeit zu seinen eigenen erweiterten Steuerelementen erkennt (die Möglicherweise Methoden und Eigenschaften unterstützen). Da erweiterte Steuerelemente im Allgemeinen bestimmte IDispatch-Aufrufe an das Steuerelement delegieren, sollte ein erweitertes Steuerelement nicht davon ausgehen, dass das Steuerelement überhaupt über IDispatch verfügt.
IConnectionPointContainer
Das Steuerelement weist keine Ereignisse auf, sodass der Container nicht über die Behandlung von nachdenken muss.
IProvideClassInfo
IProvideClassInfo2
Das Steuerelement verfügt entweder über keine Typinformationen oder Ereignisse, oder der Container muss über die Registrierungseinträge des Steuerelements in die Typinformationen des Steuerelements wechseln. Das Vorhandensein dieser Schnittstelle ist eine Optimierung.
Ispecifypropertypages
Das Steuerelement verfügt über keine Eigenschaftenseiten. Wenn der Container also über eine Benutzeroberfläche verfügt, die sie aufrufen würde, sollte der Container diese Benutzeroberfläche deaktivieren.
IPerPropertyBrowsing
Das Steuerelement verfügt über keinen Anzeigenamen selbst, keine vordefinierten Zeichenfolgen und Werte und keine Eigenschaft zur Seitenzuordnung. Diese Schnittstelle wird fast immer zum Generieren der Containerbenutzeroberfläche verwendet, sodass solche UI-Elemente deaktiviert wären, wenn diese Schnittstelle fehlt.
IPersist*
Das Steuerelement weist keinen persistenten Zustand auf, sodass sich der Container keine Gedanken über das Speichern steuerelementspezifischer Daten machen muss. Der Container speichert natürlich seine eigenen Informationen über das Steuerelement in seinem eigenen Formular oder Dokument, aber das Steuerelement selbst hat nichts zu diesen Informationen beizutragen.
IOleCache
IOleCache2
Das -Objekt unterstützt die Zwischenspeicherung nicht. Ein Container kann weiterhin das Zwischenspeichern unterstützen, indem er einfach einen Datencache selbst mit CreateDataCache erstellt.

Container