Sdílet prostřednictvím


Degradace s grácií v nepřítomnosti rozhraní

Protože ovládací prvek nemusí podporovat žádné jiné rozhraní než IUnknown, kontejner musí degradovat elegantně, když dojde k nepřítomnosti jakéhokoli konkrétního rozhraní.

Někdo by se mohl ptát na užitečnost ovládacího prvku s ničím víc než IUnknown. Zvažte ale výhody, které ovládací prvek přijímá z vizuálního programovacího prostředí kontejneru (například VB), když kontejner rozpozná objekt jako ovládací prvek:

  • Tlačítko pro objekt se zobrazí v sadě nástrojů.
  • Objekt lze vytvořit přetažením z panelu nástrojů do formuláře.
  • Objektu může dát název rozpoznaný ve vizuálním programovacím prostředí.
  • Stejný název v (3) výše lze použít okamžitě při psaní jakéhokoli jiného kódu pro ovládací prvky ve stejném formuláři (nebo dokonce jiném formuláři).
  • Kontejner může automaticky poskytovat vstupní body kódu pro všechny události, které jsou z tohoto objektu k dispozici.
  • Kontejner poskytuje vlastní uživatelské rozhraní procházení vlastností pro všechny dostupné vlastnosti.

Pokud objekt není rozpoznán jako ovládací prvek, může dojít ke ztrátě všech těchto velmi výkonných a výhodných integračních funkcí. Například v jazyce Visual Basic 4.0 je velmi obtížné skutečně integrovat nějaký náhodný objekt, který není ovládací prvek v úplném smyslu, ale může mít vlastnosti a události. Vzhledem k tomu, že myšlenka ovládacího prvku jazyka Visual Basic 4 je velmi omezující, objekt nezíská žádné funkce integrace výše. Ale i ovládací prvek s IUnknown, kde pouhá životnost ovládacího prvku určuje existenci některých prostředků, by měl být schopen získat možnosti integrace popsané výše.

Vzhledem k tomu, že aktuální nástroje vyžadují k získání jakékoli výhody velkou sadu řídicích rozhraní, ovládací prvky jsou obecně vedeny k nadměrné implementaci, aby obsahovaly více kódu, než skutečně potřebují. Ovládací prvky, které by mohly být 7 tisíc, možná nakonec budou 25 tisíc, což je velký problém s výkonem v oblastech, jako je internet. To také vedlo k vnímání, že lze ovládací prvek implementovat pouze s jedním nástrojem, jako je CDK, kvůli složitosti implementace všech rozhraní. To má dopady, když je pro takový ovládací prvek vyžadována velká knihovna DLL, jako OC30.DLL, což zvyšuje pracovní sadu. Pokud nejsou požadována všechna rozhraní, poskytne se mnoha vývojářům možnost psát velmi malé a lehké ovládací prvky pomocí přímého OLE nebo s využitím jiných nástrojů, což minimalizuje režii pro každý ovládací prvek.

Proto tento dodatek rozpozná ovládací prvek jako jakýkoli objekt s CLSID a IUnknown rozhraní. I když není nic víc než IUnknown, kontejner s programovacím prostředím by měl být schopný poskytnout alespoň funkce #3 a pokud má položku registru, získá #1 a #2. Pokud objekt poskytuje IConnectionPointContainer (a IProvideClassInfo obecně) pro určitou sadu událostí, získá #5 a pokud podporuje IDispatch pro vlastnosti a metody, získá #6 a také lepší integraci kódu v kontejneru.

Stručně řečeno, objekt by měl být schopen implementovat IDispatch a jednu sadu událostí vystavenou prostřednictvím IConnectionPointContainer, aby získal všechny výše zmíněné vizuální funkce.

S ohledem na to následující tabulka popisuje, co kontejner může dělat v případě absence jakéhokoli možného rozhraní. Všimněte si, že jsou uvedena pouze ta rozhraní, která kontejner bude přímo získávat prostřednictvím QueryInterface. Jiná rozhraní, jako je IOleInPlaceActiveObject, jsou získána jinými prostředky.

Rozhraní Význam absence rozhraní
IViewObject2
Ovládací prvek nemá žádné vizuální prvky, které by sám vykresloval, takže nemá žádné konkrétní rozměry, které by bylo možné poskytnout. V době běhu se kontejner jednoduše nepokouší nakreslit nic, když toto rozhraní chybí. V době návrhu musí kontejner alespoň nakreslit nějaký výchozí obdélník se jménem pro takový ovládací prvek, aby uživatel ve vizuálním programovacím prostředí mohl objekt vybrat a zkontrolovat jeho vlastnosti, metody a události, které existují. Zpracování absence IViewObject2 je klíčové pro kvalitní podporu vizuálního programování.
IOleObject
Ovládací prvek vůbec nepotřebuje web ani se nezúčastní v žádném vyjednávání rozložení vloženého objektu. Všechny informace (například rozsahy řízení), které kontejner může od tohoto rozhraní očekávat, by se měly vyplnit výchozími nastaveními zadanými kontejnery.
IOleInPlaceObject
Ovládací prvek se nestává přímo aktivním (jako popisek), a proto se nikdy nepokouší aktivovat tímto způsobem. Jedinou aktivací může být přístup na její stránky vlastností.
IOleControl
Ovládací prvek nemá žádné mnemotechnické pomůcky ani nepoužívá okolní vlastnosti a nezajímá ho, pokud kontejner ignoruje události. Pokud toto rozhraní chybí, kontejner prostě nevolá své metody.
IDataObject
Ovládací prvek neposkytuje žádné sady vlastností ani žádné vizuální vykreslování, které by bylo možné uložit do mezipaměti, takže kontejner by se rozhodl uložit do mezipaměti některé výchozí prezentace bez tohoto rozhraní (podporu pro CF_METAFILEPICT, konkrétně) a zakázat všechny funkce související se sadou vlastností.
IDispatch
Ovládací prvek nemá žádné vlastní vlastnosti ani metody. Kontejner se v tomto případě nemusí pokoušet zobrazit žádné vlastnosti ovládacího prvku a neměl by zakázat volání vlastních metod, která kontejner nerozpozná jako vlastní rozšířené ovládací prvky (které mohou podporovat metody a vlastnosti). Rozšířený ovládací prvek obecně deleguje určitá volání IDispatch na ovládací prvek, ale neměl by vůbec očekávat, že ovládací prvek bude mít IDispatch.
IConnectionPointContainer
Ovládací prvek nemá žádné události, takže se kontejner nemusí řešit jejich zpracováním.
IProvideClassInfo
IProvideClassInfo2
Ovládací prvek buď nemá informace o typu nebo události, nebo kontejner musí přejít do informací o typu ovládacího prvku prostřednictvím položek registru ovládacího prvku. Existence tohoto rozhraní je optimalizace.
ISpecifyPropertyPages
Ovládací prvek nemá žádné stránky vlastností, takže pokud má kontejner jakékoli uživatelské rozhraní, které by je vyvolalo, měl by kontejner toto uživatelské rozhraní zakázat.
IPerPropertyBrowsing
Ovládací prvek nemá samotný zobrazovaný název, žádné předem určené řetězce a hodnoty a žádné vlastnosti mapování stránky. Toto rozhraní se téměř vždy používá pro generování uživatelského rozhraní kontejneru, takže takové prvky uživatelského rozhraní by byly zakázány v nepřítomnosti tohoto rozhraní.
IPersist*
Ovládací prvek nemá žádný trvalý stav hodný zmínky, takže se kontejner nemusí starat o uložení jakýchkoli dat specifických pro ovládací prvek. Kontejner samozřejmě uloží vlastní informace o ovládacím prvku ve svém vlastním formuláři nebo dokumentu, ale samotný ovládací prvek nemá nic k přispívání k informacím.
IOleCache
IOleCache2
Objekt nepodporuje ukládání do mezipaměti. Kontejner může nadále podporovat ukládání do mezipaměti pouhým vytvořením samotné mezipaměti dat pomocí CreateDataCache.

Kontejnery