# active_x

### Funkce

Přístroj active_x pracuje jako obecný kontejner schopný ve své ploše vytvořit a zobrazit komponentu odpovídající specifikaci ActiveX firmy Microsoft. Více se o ActiveX a souvisejících technologiích firmy Microsoft můžete dočíst v kapitole Control Web a ActiveX.

Technologie ActiveX je velmi úzce svázána s komponentovou technologií COM (Component Object Model), v řadě případů mnohé definice splývají (nejjednodušší ActiveX objekt je totéž co nejjednodušší COM komponenta -- stačí pokud vyváží základní a jediné povinné rozhraní všech COM komponent IUnknown).

Základní motivace vzniku technologie COM je vytvoření standardu umožňujícího tvorbu aplikací ze samostatných binárních komponent, tedy komponent vytvořených nezávislými firmami (programátory) v nezávislých vývojových nástrojích (jazycích). Stejně jako např. při návrhu elektronických obvodů lze použít zapouzdřené komponenty (třeba A/D převodník, DC/DC konvertor apod.) pouze se znalostí jejich rozhraní, i v případě COM komponent je vnitřní architektura nepodstatná, důležité je rozhraní komponenty. Klasické objektově-orientované technologie, dříve slibující znovupoužití již vytvořeného kódu prostřednictvím dědění objektů, v tomto ohledu selhaly, neboť objekty nedokázaly překročit hranice mezi vývojvými prostředími (jazyky) a mnohdy ani mezi různými verzemi téhož jazyka. Ojekty nebyly schopny relativně samostatné existence v rámci operačního systému, vždy zůstaly spíše jen způsobem vnitřní organizace dané aplikace. COM komponenty jsou naproti tomu registrovány v rámci operačního systému a jsou použitelné jakoukoliv aplikací, která využívá standardy COM. Použití COM objektů v rámci systému Control Web zajišťuje právě virtuální přístroj active_x.

Prostřednictvím přístroje active_x je tedy možno do aplikace zabudovat různé komponenty, např. Windows Media Player přehrávající MPEG nebo AVI video, Adobe Acrobat Reader zobrazující PDF dokumentaci, Macromedia Director zobrazující animace apod.

Jednou z klíčových úloh ActiveX je zajištění programové ovladatelnosti jednotlivých komponent. Pokud je dopředu znám typ (třída) jednotlivých komponent, jsou tedy známa rozhraní publikovaná komponentami a samozřejmě lze volat metody těchto rozhraní. Obecné nástroje ale musí pracovat s dopředu neznámými komponentami, proto byly v rámci ActiveX vyvinuty prostředky pro ovládání předem neznámých komponent zvané Automation (dříve OLE Automation). Komponenty programově ovládatelné (scriptable) informují o svých vlastnostech a metodách prostřednictvím tzv. typových knihoven (type libraries) a programy využívající služeb těchto komponent dokáží na základě informací v typových knihovnách za běhu přistupovat ke komponentám, o nichž neznali v době své tvorby (překladu) vůbec nic. Přístup ke komponentám se v principu děje dvěma způsoby:

- Čtení a zápis vlastností (properties).
- Volání metod.

Protože prostředí systému Control Web je volně programovatelné (viz. kapitola Programování a procedury), zajišťuje přístroj active_x taktéž zprostředkovávání přístupu k vlastnostem (properties) a metodám ActiveX komponenty z procedur libovolných virtuálních přístrojů aplikace Control Web.

### Syntax

      active_x active_x_name;
        rem = string;
        bubble = string;
        timer = timer_name;
        owner = owner_name;
        position = integer, integer, integer, integer;
        win_disable = [ identifier, ... ];
        win_title = string;
        CLSID = class_id;
        name = string;
        properties
          property_name = property_value;
          ...
        end_properties;
      end_active_x;

### Specifické parametry přístroje

- CLSID
  Každá ActiveX komponenta (a nejen komponenta) je identifikována globálně unikátním identifikátorem (GUID), který se v případě identifikátoru třídy nazývá CLaSs IDentifier (CLSID). CLSID je 128-bitové číslo, zapisované v podobě řetězce 32 šestnástkových číslic ve složených závorkách:

    {HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH}

Pomlčky mezi skupinami číslic nemají žádný funkční význam. Aby ActiveX komponenta správně pracovala v prostředí Windows, je nutné, aby byla zaregistrována v systémové registrační databázi. Tato databáze je také jediné místo, odkud lze CLSID dané komponenty získat.

Název ActiveX komponnety s CLSID

Hledání v Editoru Registru není zrovna přímočaré, proto inspektor přístroje active_x nabízí seznam přítomných ActiveX komponent.

Inspektor active_x nabízí všechny instalované třídy

Podrobnější popis naleznete v kapitole Control Web a ActiveX.

- name
  Parametr name představuje alternativní metodu zadání třídy komponenty. Jeho hodnota musí být jméno komponenty uvedené v registrační databázi pod klíčem HKEY_CLASSES_ROOT. Zpravidla záznam s tímto jménem obsahuje pouze položku CLSID, pomocí které lze snadno nalézt veškeré informace o ActiveX komponentě v záznamu HKEY_CLASSES_ROOT\CLSID.

Upozornění: toto jméno není stejné, jako jméno zobrazované v inspektoru přístroje active_x v záložce CLSID. ActiveX komponenta má jméno uvedené přímo v HKEY_CLASSES_ROOT, vyžadované parametrem name, a název uvedený v HKEY_CLASSES_ROOT\CLSID, zobrazovaný inspektorem přístroje, sloužící ke srozumitelnému pojmenování komponenty.

Pokud jsou současně uvedeny oba parametry CLSID i name, parametr name je ignorován a je použit pouze parametr CLSID.

- parameters
  Tato sekce obsahuje vždy na levé straně jméno vlastnosti (property) ActiveX komponenty a za znakem '=' její hodnotu. Hodnota může být logická, číselná nebo řetězcová.

Vlastnosti ActiveX komponenty

Upozornění: tato sekce představuje v rámci celého systému Control Web výjimku, neboť její syntax závisí na jiných parametrech přístroje, konkrétně na CLSID nebo name. Až podle dané komponenty lze rozhodnout, jestli je konkrétní vlastnost přípustná. To je důvod, proč při chybně zadané vlastnosti nedojde k zastavení překladu, ale pouze se vypíše varování a překlad pokračuje dále. V případě, že byl překlad vyvolán v rámci překlápění, dojde ke ztrátě zápisu dané vlastnosti. Stejná situace nastane, pokud je v inspektoru změněna komponenta a nová komponenta nepodporuje dříve definované vlastnosti -- takové vlastnosti pak budou vymazány.

Vlastnosti ActiveX komponenty lze nastavovat i za běhu voláním nativních procedur přístroje active_x.

### Nativní procedury přístroje

    Move( dx, dy : number )

Přesune přístroj o souřadnice dx, dy vzhledem ke stávající poloze. Velikost přístroje se nezmění.

    MoveTo( x, y : number )

Přesune přístroj na souřadnice x, y vzhledem k vlastníkovi. Velikost přístroje se nezmění.

    Size( w, d : number )

Změní velikost přístroje na w, d. Pozice přístroje není ovlivněna.

    NewRect( x, y, w, d : number )

Změní současně pozici i velikost přístroje. Pozice je určena vzhledem k vlastníkovi.

    Hide()

Skryje přístroj.

    Show()

Zobrazí přístroj.

    SetProperty( PropertyName : string; PropertyValue : any )
    SetProperty( PropertyName : string; PropertyValue : any; index : number )
    SetProperty( PropertyName : string; PropertyValue : any; index1, index2 : number )
    SetProperty( PropertyName : string; PropertyValue : any; index1, index2, index3 : number )

Nastaví vlastnost (property) ActiveX komponenty, identifikované jménem PropertyName. Pokud je vlastnost indexovaná, je možno použít přetížených procedur akceptujících daný počet indexů.

    GetProperty( PropertyName : string; &PropertyValue : any )
    GetProperty( PropertyName : string; &PropertyValue : any; index : number )
    GetProperty( PropertyName : string; &PropertyValue : any; index1, index2 : number )
    GetProperty( PropertyName : string; &PropertyValue : any; index1, index2, index3 : number )

Přečte vlastnost (property) ActiveX komponenty, identifikované jménem PropertyName a vrátí její hodnotu do elementu PropertyValue. Pokud je vlastnost indexovaná, je možno použít přetížených procedur akceptujících daný počet indexů.

    Automation metody

Přístroj active_x mapuje Automation metody ActiveX komponenty jako své nativní procedury. Protože množina těchto metod závisí na vložené ActiveX komponentě, nelze je staticky zobrazit. Z tohoto důvodu inspektor přístroje active_x nabízí přehled aktuálně existujících nativních procedur včetně automation metod:

Automation metody mapované jako nativní procedury

### Událostní procedury přístroje

Přístroj může volat standardní událostní procedury:

    OnActivate()
    OnSelect()
    OnDeselect()
    OnShow()
    OnHide()
    OnNewPosition( RectX, RectY, RectW, RectD : integer )
    OnWindowMinimize()
    OnWindowMaximize()
    OnWindowRestore( WasMinimized, WasMaximized : boolean )
    OnWindowClose()

Podrobnější informace k těmto procedurám lze nalézt v kapitole Programování a procedury.

### Specifické událostní procedury přístroje

Pokud je ActiveX komponenta schopna generovat události (Events), publikuje je v podobě tzv. zdrojových rozhraní (source interfaces). Tato rozhraní komponenta neimplementuje, ale pouze říká, že má zájem je volat po výskytu nějaké události. Přístroj active_x vytvoří pro vloženou ActiveX komponentu dané rozhraní a naváže je na přípojný bod komponenty. Jednotlivé události volané komponentou jsou pak mapovány jako specifické událostní procedury přístroje active_x.

Aby byl přístroj active_x schopen mapovat události ActiveX komponenty jako specifické událostní procedury, musí být splněno několik podmínek:

- Přístroj active_x dokáže přemapovat události jen z jednoho výstupního rozhraní. Zvoleno je vždy "default" rozhraní.
- Výstupní rozhraní musí být typu "dispinterface", rozhraní VTBL není podporováno.
- Protože navázání na události je prováděno až za běhu, musí ActiveX komponenta poskytovat svou typovou informaci (rozhraní IProvideClassInfo).