Umíme to s Delphi, 39 díl – technologie OLE jasně a srozumitelně, 2. část

Před týdnem jsme začali poměrně rozsáhlé téma OLE technologie. Dnes navážeme popisem komponenty OleContainer, která v Delphi slouží pro práci s objekty (a servery) OLE. Výklad bude prokládán názornými příklady jednoduchých aplikací, které tuto komponentu využívají.
Mechanismus OLE v Delphi – komponenta OleContainer

Před týdnem jsme si vytvořili dostatečný teoretický podklad k technologii OLE. Konečně se tedy dostáváme k tomu, co vás pravděpodobně zajímá nejvíce: jak pracovat s mechanismem OLE přímo v Delphi a jak vytvářet aplikace používající OLE. Uvidíte, že je to velmi, velmi jednoduché – ostatně jak taky v Delphi jinak :-)

Základní komponentou pro práci s OLE v prostředí Delphi je OleContainer třídy TOleContainer. Komponenta OleContainer se nachází v paletě Systém (je označována ikonkou s nápisem OLE). Tato komponenta je (jak název napovídá) tzv. OLE kontejner. OLE kontejner slouží k reprezentování serverů OLE ve vytvářené aplikaci v Delphi. Jakýkoliv objekt, který chcete pomocí mechanismu OLE do své aplikace vložit (nebo jej propojit), musí být vložen (nebo propojen – v každém případě zobrazen) uvnitř této komponenty. Pomocí komponenty OleContainer je možné propojit server OLE s vaší aplikací. Mechanismus OLE je sám o sobě dosti složitý a „ruční“ práce s ním by byla jistě velmi náročná. Komponenta OleContainer, která zapouzdřuje OLE kontejner jako komponentu Visual Component Library, jeho použití maximálně zjednodušuje.

Komponenta OleContainer obecně umožňuje uživateli vybrat libovolný objekt OLE a umožňuje jak vložení tohoto objektu do aplikace, tak i jeho propojení. Množství a konkrétní množina objektů OLE „vložitelných“ do aplikace závisí na nainstalovaném programovém vybavení konkrétního počítače, proto se může stát, že některý z níže uvedených příkladů ve své aplikaci nebudete moci použít. Až budeme vytvářet aplikace, budeme zpravidla používat dokumenty Word, neboť existuje reálný předpoklad, že tuto aplikaci bude většina z vás mít nainstalovanou. Příklady OLE objektů, které lze vložit (prostřednictvím komponenty OleContainer) do aplikace vytvářené v Delphi: dokument aplikace Word, tabulka aplikace Excel, dokument aplikace WordPad, bitmapový obrázek aplikace Malování (Paintbrush), zvuk *.WAV aplikace Přehrávač záznamů, apod.).

Platí tedy, že pokud nechcete „natvrdo“ otevřít ve vaší aplikaci některý objekt, vložíte na formulář komponentu OleContainer a v případě potřeby (tedy až uživatel projeví zájem o otevření nějakého objektu) zavoláte metodu této komponenty InsertObjectDialog. Otevře se dialogové okno, ve kterém uživatel uvidí seznam všech aktuálně podporovaných (použitelných) objektů. Podrobně se k tomu ještě dostaneme, podobně jako ke způsobu, jakým si OleContainer poradí se zobrazením hlavní nabídky a případných panelů nástrojů.

Chcete-li provést vložení nebo propojení objektu programově, poslouží vám metody komponenty OleContainer CreateObject nebo CreateObjectFromFile nebo CreateObjectFromInfo (pro vložení objektu), resp. CreateLinkToFile (pro propojení objektu).

Tolik tedy k prvotnímu seznámení s komponentou. Než se podrobně podíváme na její vlastnosti, události a metody, ukážeme si velmi jednoduchý příklad, který demonstruje, jak s touto komponentou provádět nejtriviálnější „OLE-akce“ :-). Uvidíte (jako v Delphi velmi často), že zdrojový kód, který budete muset napsat za účelem vytvoření relativně kvalitní aplikace využívající OLE, byste snadno mohli poslat kolegovi programátorovi v jedné SMS zprávě:-)

Příklad jednoduché aplikace využívající OLE

  • Vytvořte novou aplikaci, formulář nazvěte frmHlavni a umístěte na něj komponentu Panel z palety Standard. Tento panel nazvěte (Name) prostě Panel a nastavte mu hodnotu vlastnosti Allign na alBottom. Panel se přichytí na dolní okraj formuláře.
  • Nyní umístěte na formulář komponentu OleContainer z palety Systém. Nazvěte ji prostě OleContainer a nastavte jí hodnotu vlastnosti Align na alClient. Kontejner se „rozprostře“ po zbytku plochy formuláře, kterou nezabírá panel.
  • Nakonec vložte na panel dvě komponenty Button a pojmenujte je btnVloz a btnKonec.
  • Ošetřete události OnClick tlačítek btnVloz a btnKonec:
procedure TfrmHlavni.btnVlozClick(Sender: TObject);
begin
  OleContainer.InsertObjectDialog;
end;

procedure TfrmHlavni.btnKonecClick(Sender: TObject);
begin
  Application.Terminate;
end;

Tím, věřte – nevěřte, je tvorba aplikace ukončena! Ač se to zdá neuvěřitelné, právě jste vytvořili svou první aplikaci využívající OLE. Aplikaci uložte, přeložte a spusťte. Vzhled spuštěné aplikace (před zobrazením objektu, avšak po úpravě velikosti formuláře a titulků komponent btnKonec, btnZobraz, Panel a frmHlavni) je na následujícím obrázku:

Nyní si zkuste klepnout na tlačítko Vlož. Pokud pracujete na pomalejším stroji, budete muset chvíli počkat, ale nepropadejte panice, systém nezatuhl, pouze přemýšlí:-) Časem by se měl otevřít dialog podobný tomu z následujícího obrázku:

Raději ještě jednou připomeňme, že množství a konkrétní množina objektů, které tento dialog nabídne, závisí na instalovaném softwaru počítače, na kterém bude aplikace nakonec spuštěna (nikoliv přeložena).

V tomto dialogu je možné vybrat buď vytvoření nového objektu (pak bude na formuláři zobrazen prázdný dokument příslušného formátu) nebo načíst existující ze souboru. Pokud vyberete načtení ze souboru, můžete tento soubor najít na disku. V každém případě musíte otevřít takový soubor, se kterým je asociován některý ze serverů OLE dostupných na příslušném počítači. Pokud se pokusíte zobrazit objekt (otevřít soubor), k němuž neexistuje žádný dostupný server OLE, bude po chvilce generována výjimka EOleSysError s chybovou zprávou.

Vyberete-li vytvoření ze souboru, budete moci také zatrhnout políčko Propojení (pomocí kterého objekt pouze propojíte, zatímco jinak jej vložíte).

V každém případě máte možnost zatrhnout políčko „Zobrazit jako ikonu“. Pokud tak učiníte, bude objekt zobrazen uprostřed kontejneru jen jako ikonka. V opačném případě bude zobrazen celý.

Abychom sjednotili následující postup, vyberte v popisovaném dialogu „Vytvořit ze souboru“ a na disku nalezněte nějakou bitmapu, např. C:\WINDOWS\ STEHY.BMP. Nezaškrtávejte „Propojení“ ani „Zobrazit jako ikonu“. V kontejneru se zobrazí vybraná bitmapa, viz následující obrázek:

Zobrazení objektu je ale něco jiného než jeho aktivace! Nyní je objekt sice zobrazen v kontejneru, ale nemůžete jej nijak editovat. Pokud chcete provádět editaci (a tedy využívat kompletní nabídku OEL serveru Malování), poklepejte na kontejner myší. Okno vzápětí změní svůj vzhled a místo našeho formuláře uzříte (mírně modifikovaný) program Malování, viz obrázek:

Okno naší aplikace (zobrazující nyní v podstatě program Malování) můžete libovolně zvětšovat a zmenšovat, díky nastavení hodnot vlastností Allign kontejneru i panelu se bude velikost obou komponent vždy správně přizpůsobovat. Všimněte si ale, že v programu Malování chybí zobrazená hlavní nabídka. To je jistě poměrně dramatický problém ... lépe řečeno – byl by to problém, kdyby neměl tak jednoduché řešení. Prozatím aplikaci uzavřete (např. Alt-F4). Na formulář v Delphi nyní přidejte komponentu MainMenu z palety Standard. Nemusíte vytvářet žádné položky nabídky, jen tam zmíněnou komponentu umístěte:

Nyní aplikaci přeložte a spusťte a stejně jako v předchozím případě zobrazte STEHY.BMP. Poklepáním objekt aktivujte a sledujte, jaká nastala změna:

Zázraku, kterého jste byli přímými svědky, se říká spojování nabídek a předchozí příklad demonstroval jen jeho nejtriviálnější podobu. Budeme si o něm podrobně povídat později.

Poznámka: tento zázrak ale bohužel skončí s OLE chybou, což se může zdát matoucí: proč k ní došlo? Je někde nějaká nesrovnalost? Důvodem je fakt, že před ukončením aplikace je nutné objekt uvolnit z paměti. K tomu se používá metoda DestroyObject, o které si povíme níže v tomto dílu. Na tomto místě proto jen uveďme, že nejjednodušším řešením této situace je vytvoření event handleru události OnDestroy hlavního formuláře s následujícím kódem:

procedure TfrmHlavni.FormDestroy(Sender: TObject);
begin
  if OleContainer.State <> osEmpty then OleContainer.DestroyObject;
end;

Tím jsme si tedy demonstrovali úplně ty nejzákladnější činnosti, které lze pomocí OLE provádět: zobrazení a aktivace objektu. Zkuste si několik experimentů s různými objekty.

Vlastnosti komponenty OleContainer

Už z předchozího jednoduchoučkého příkladu je asi patrné, že komponenta OleContainer toho bude umožňovat poměrně dost. Je to tak: nyní se budeme touto komponentou zabývat podrobně. Začneme popisem vlastností.

Vlastnost: AllowActiveDocs

Význam: Udává, má-li mít kontejner podporu tzv. aktivních dokumentů (tzv. rozhraní IOleDocumentSite). Aktivní dokumenty podporuje například Microsoft Word, nicméně my se jimi nebudeme na tomto místě zabývat.

Vlastnost: AllowInPlace

Význam: Říká, má-li kontejner podporovat tzv. aktivaci na místě. Aktivace na místě udává, že pokud se uživatel rozhodne aktivovat OLE objekt zobrazený na formuláři (v kontejneru), spustí se server OLE uvnitř kontejneru. Pokud je hodnota AllowInPlace = False, otevře si server OLE při spuštění nové okno. Zkuste si nastavit hodnotu False a spustit aplikaci z předchozí podkapitoly. Soubor STEHY.BMP bude zobrazen tam, kde je zobrazen teď: uvnitř kontejneru. Jakmile na něj ale poklepete (aktivujete jej), otevře si program Malování nové okno. Zkuste si v souboru provést nějakou změnu, např. přikreslit čáru. Změna, kterou provedete v programu Malování (lépe řečeno: v aktivovaném OLE serveru aplikace Malování) se rázem (okamžitě) promítne i do zobrazení objektu na formuláři:

Vlastnost: AutoActivate

Význam: Stanovuje, kdy a jakým způsobem se má provést aktivace objektu v kontejneru. Možné hodnoty:

  • aaManual – aktivace se musí provést programově voláním metody DoVerb(ovShow), viz dále.
  • aaGetFocus – aktivace se provede automaticky v okamžiku, kdy OLE kontejner získá zaměření (např. klepnutím myší, klávesou Tab, apod.).
  • aaDoubleClick – přednastavená hodnota, aktivace se provede poklepáním na kontejner.
Vlastnost: AutoVerbMenu

Význam: Říká, má-li se automaticky vytvářet kontextová nabídka OLE kontejneru, ve které budou možnosti aktuálního objektu. Pokud je hodnota True, je tato nabídka vytvářena (a překryje případné jiné kontextové nabídky, které jsme třeba pro OLE kontejner vytvořili ručně).

Vlastnost: BorderStyle

Význam: Určuje styl okraje, který bude kolem kontejneru. Možné hodnoty:

  • bsSingle – jednoduchá linka,
  • bsNone – žádný okraj.
Jiné hodnoty nejsou možné!

Vlastnost: CanPaste

Význam: Logická vlastnost, která vždy za běhu aplikace obsahuje hodnotu říkající, zda schránka Windows (clipboard) právě obsahuje OLE objekt, který je možné vložit do kontejneru.

Vlastnost: CopyOnSave

Význam: Udává, jestli při ukládání objektu na disk některou z metod SaveToFile, resp. SaveToStream dojde nejprve k vytvoření lokální kopie objektu (kopie v operační paměti). Tato kopie je důležitá z toho důvodu, že na ní může proběhnout komprese redundantních dat za účelem úspory diskového prostoru. Komprimovaná kopie je pak uložena na cílové místo. Jediným důvodem pro zakázání této komprimace by snad mohl být velmi rozsáhlý objekt a nedostatek operační paměti.

Vlastnost: Iconic

Význam: Říká, má-li se objekt v OLE kontejneru zobrazit jen jako ikona, nikoliv ve své výsledné podobě:

Tuto vlastnost ovšem nelze nastavit, pokud je kontejner zrovna prázdný (to by způsobilo výjimku). Pokud již zobrazuje nějaký objekt, je možné zobrazit jej jako ikonu nebo kompletně.

Vlastnost: Linked

Význam: Je-li hodnota této vlastnosti za běhu aplikace True, je objekt propojený, jinak je vložený.

Vlastnost: Modified

Význam: Říká, byl-li objekt v kontejneru změněn, smazán nebo nahrazen jiným objektem (v těchto případech je hodnota True).

Vlastnost: NewInserted

Význam: Vrací True, pokud byl objekt vložen voláním metody InsertObjectDialog, tedy pokud nebyl vložen ze schránky nebo vytvořen jako propojení.

Vlastnost: ObjectVerbs

Význam: Tato vlastnost je typu TStrings a obsahuje seznam všech klíčových slov, které objekt OLE momentálně podporuje. Pozor: tato klíčová slova jsou vracena jako řetězce a navíc v neupravené podobě, některá proto mohou obsahovat třeba ampérsandy (&) pro označení klávesy rychlé volby, apod. Následující obrázek obsahuje vylepšenou aplikaci z předchozí podkapitoly. Do pravé části formuláře je přidán seznam ListBox (lbVerbs) a na panel je navíc umístěno tlačítko btnVerbs, jehož událost OnClick je ošetřena takto:

procedure TfrmHlavni.btnVerbsClick(Sender: TObject);
begin
  lbVerbs.Items.Assign(OleContainer.ObjectVerbs);
end;

Vlastnost: OldStreamFormat

Význam: Nastavení této vlastnosti na True způsobí, že objekty budou ukládány ve verzi OLE 1 (budou obsahovat hlavičku pro spolupráci s Delphi, apod.). Tato vlastnost je zde jen pro zpětnou kompatibilitu.

Vlastnost: OleClassName

Význam: Obsahuje jméno třídy objektu OLE v kontejneru. Příklad: umístíte-li do kontejneru dokument Wordu, může tato vlastnost obsahovat např. řetězec ‘Word.Document.8‘. Hodnota této vlastnosti je brána z registru Windows, ve kterém je příslušný OLE server zaregistrován.

Vlastnost: OleObject

Význam: Jedna z nejdůležitějších vlastností komponenty OleContainer. Reprezentuje totiž přímo objekt v OLE Containeru. Tato vlastnost je typu Variant (což je typ, který reprezentuje hodnotu, jejíž skutečný typ se za běhu aplikace mění). Pomocí této vlastnosti je možné přímo programově ovládat OLE server (tato technologie se nazývá OLE Automation). Později si to také popíšeme a ukážeme na příkladech.

Poznámka pro pokročilé uživatele:

OleContainer má k přímému přístupu na IOleInterface speciálně vytvořenou vlastnost OleObjectInterface, o které se v tomto díle nezmiňujeme. Rozdíl je pak hlavně v tom, že když žádný objekt není v kontejneru, pak OleObject generuje výjimku, ale OleObjectInterface jenom vrátí hodnotu nil.

Vlastnost: PrimaryVerb

Význam: Specifikuje index klíčového slova, který se má brát pro server OLE jako primární (default, přednastavený). Tato vlastnost se hodí při volání metody DoVerb, neboť volání DoVerb(ovPrimary) způsobí provedení takového příkazu z pole ObjectVerbs, jehož index je udáván vlastností PrimaryVerb.

Vlastnost: SizeMode

Význam: Udává, jakým způsobem bude upravována velikost objektu v OLE kontejneru. Možné hodnoty:

  • smClip – přednastavená hodnota: zobrazí objekt v jeho původní velikosti a ořízne všechny části, které se nevejdou do kontejneru.
  • smCenter – zobrazí objekt ve své původní velikosti a vycentruje jej doprostřed kontejneru.
  • smScale – upraví velikost objektu (se zachováním poměru výšky k šířce) tak, aby se do kontejneru vešel.
  • smStretch - upraví velikost objektu (bez zachování poměru výšky k šířce) tak, aby se do kontejneru vešel, viz obrázek.
  • smAutoSize – zobrazí objekt v jeho původní velikosti a upraví velikost kontejneru tak, aby se do něj objekt vešel.

Vlastnost: SourceDoc

Význam: Specifikuje název souboru, ve kterém se nachází objekt OLE v případě, že tento objekt byl propojen. Pokud není objekt propojen, vrátí SourceDoc prázdný řetězec.

Vlastnost: State

Význam: Podává informaci o stavu, ve kterém se momentálně nachází OLE objekt.Možné hodnoty:

  • osEmpty – OLE kontejner je prázdný, není v něm žádný objekt.
  • osLoaded – v kontejneru je zobrazen OLE objekt, ale není aktivován: jeho server OLE neběží.
  • osRunning – v kontejneru je zobrazen OLE objekt a jeho server OLE běží.
  • osOpen – objekt OLE je otevřen ve svém vlastním (novém) okně.
  • osInPlaceActive – objekt OLE je aktivován na místě, nicméně dosud nebyly spojeny všechny nabídky a panely nástrojů. Jakmile se kompletní aktivace (tedy včetně těchto úkonů) dokončí, změní se hodnota na osUIActive.
  • osUIActive – objekt OLE je aktivován na místě, je aktivní a všechny panely a nabídky byly spojeny.

Tolik tedy k vlastnostem komponenty OleContainer. Vidíte, že nabízí mnoho možností, jak s objekty OLE pracovat. A to jsme se zatím nedostali na metody:-)

Metody komponenty OleContainer

Vlastnosti máme za sebou, pojďme k metodám. Pomocí následujících metod provádíme ovládání objektů OLE i serverů OLE.

Metoda: ChangeIconDialog

Význam: Zobrazí dialog pro změnu ikony objektu pro případ, že je objekt zobrazován jako ikona (např. vlastnost Iconic). Je možné vybrat ikonu ze souboru *.ICO, *.EXE a *.DLL. Dialog vrací hodnotu True, pokud byl dialog úspěšně zobrazen a uživatel jej ukončil stiskem tlačítka OK. Jinak vrací False. Ukázku dialogu přináší následující obrázek:

Metoda: Close

Význam: Deaktivuje OLE objekt. Deaktivací se zde myslí ukončení jeho serveru OLE, nicméně objekt dále zůstane zobrazen v kontejneru. Veškeré provedené změny, které uživatel v objektu učinil, jsou automaticky uloženy.

Metoda: Copy

Význam: Kopíruje objekt OLE do schránky Windows. Pokud v kontejneru zrovna není žádný objekt, generuje tato metoda výjimku (ostatně stejně jako všechny dosud uvedené metody a většina následujících, pokud je aplikujete na prázdný kontejner).

Metoda: CreateLinkToFile

Význam: Programové vytvoření objektu (v kontejneru) propojeného s fyzickým souborem. Význam této metody je stejný jako zaškrtnutí políčka „Propojení“ v dialogu InsertObjectDialog. Metoda má dva parametry: v prvním zadáváme název souboru (včetně cesty) a druhým říkáme, zda se má objekt zobrazit v celé své kráse nebo jako ikona. Pokud již je v kontejneru nějaký objekt, je zničen a případné změny jsou ztraceny. Hlavička metody:

procedure CreateLinkToFile(FileName: string; Iconic: Boolean);

Metoda: CreateObject

Význam: Programové vložení objektu do kontejneru. Abychom mohli volat tuto metodu, je nutné znát jméno třídy objektu (vlastnost OleClassName). Toto jméno předáváme jako první parametr, druhým parametrem je opět informace o tom, má-li být objekt zobrazen jako ikona. Hlavička metody:

procedure CreateObject(const OleClassName: string; Iconic: Boolean);

Metoda: CreateObjectFromFile

Význam: Programové vložení objektu do kontejneru. Na rozdíl od předchozí metody můžeme objekt určit jménem souboru. Pozor: máte-li na disku nějaký soubor, například bitmapový obrázek nebo dokument Wordu, ještě to neznamená, že máte OLE objekt! OLE objekt je nutné z tohoto souboru vytvořit – a k tomu právě slouží metoda CreateObjectFromFile, která vytvoří z obsahu zadaného souboru objekt OLE a zobrazí jej v kontejneru. Hlavička metody:

procedure CreateObjectFromFile(const FileName: string; Iconic: Boolean);

Metoda: CreateObjectFromInfo

Význam: Třetí možnost programového vložení objektu do kontejneru. Tentokráte se objekt specifikuje pomocí záznamu TCreateInfo, ve kterém jsou popsány všechny podstatné údaje pro jeho vytvoření. Podívejme se na deklaraci typu TCreateInfo:

type
  TCreateInfo = record
    CreateType: TCreateType;
    ShowAsIcon: Boolean;
    IconMetaPict: HGlobal;
    ClassID: TCLSID;
    FileName: string;
    DataObject: IDataObject;
  end;

Je vidět, že v tomto záznamu nalezneme informaci o tom, zda vytvořit objekt ze souboru, zda jej máme vložit či propojit, zda se má zobrazit jako ikona, v jakém se nachází souboru, apod. Hlavička metody:

procedure CreateObjectFromInfo(const CreateInfo: TCreateInfo);

Nejčastěji používanou metodou pro nás asi bude CreateObjectFromFile.

Metoda: DestroyObject

Význam: Zničí objekt v kontejneru, což způsobí ztrátu všech neuložených změn.

Metoda: DoVerb

Význam: Požádá objekt OLE o provedení zadané akce. Pomocí této metody lze ovládat servery OLE, nicméně problém většinou spočívá v tom, že nevíme, které akce je možné momentálně provést. Standard OLE definuje několik akcí, které by měly jít provádět u všech objektů (typicky ovShow pro zobrazení), nicméně pro aktuální seznam je vždy nutné použít vlastnost ObjectVerbs. Metoda DoVerb sice souvisí s technologií OLE, nikoliv OLE Automation, přesto se k ní podrobněji vrátíme v kapitole věnované mechanismu OLE Automation. Na tomto místě si jen zapamatujte, že primární (default) akci nad objektem provedete voláním DoVerb(ovPrimary).

Metoda: InsertObjectDialog

Význam: Zobrazí dialog pro vložení nebo propojení objektu. Již jsme se s ním setkali na začátku tohoto dílu. V tomto dialogu je možné zvolit, zda se má objekt vytvořit nový či ze souboru, zda se má propojit nebo vložit a zda se má zobrazit pouze jako ikona kterou je navíc možné v rámci dialogu změnit). Dialog vrací True, pokud byl korektně zobrazen a pokud jej uživatel ukončil stiskem OK.

Metoda: LoadFromFile

Význam: Načte objekt OLE ze souboru. Pozor: je možné načíst pouze objekt OLE jako takový! Nelze načíst libovolný soubor (například dokument Word), protože to není objekt OLE! Pokud máte dokument Word, bitmapový obrázek či jiný „normální“ soubor, je nutné zavolat „na něj“ metodu CreateObjectFromFile, která z obsahu tohoto „normálního“ souboru teprve vytvoří objekt OLE. Pokud pak tento objekt uložíte na disk jako objekt OLE (např. metodou SaveToFile), budete jej moci příště již načíst pomocí LoadFromFile. Parametrem metody je samozřejmě název (včetně cesty) souboru na disku.

Metoda: LoadFromStream

Význam: Načte objekt OLE z proudu. Pro tuto metodu platí stejné důležité upozornění jako pro metodu LoadFromFile.

Metoda: ObjectPropertiesDialog

Význam: Zobrazí dialog pro nastavení vlastností objektu. Následující obrázek ukazuje tento dialog pro objekt dokumentu Word:

Metoda: Paste

Význam: Vloží do kontejneru obsah schránky Windows. Schránka musí obsahovat objekt OLE. Jestli je tato podmínka splněna, můžete otestovat např. pomocí metody CanPaste.

Metoda: PasteSpecialDialog

Význam: Zobrazí dialog „Vložit jinak“. Uživatel bude moci vybrat, jakým způsobem se má obsah schránky vložit do kontejneru.

Metoda: Run

Význam: Změní stav objektu OLE na osRunning: spustí jeho server OLE, nicméně neprovádí vlastní aktivaci objektu. Pokud již server OLE běží, bude otvírání a aktivace objektu OLE tohoto serveru mnohem rychlejší.

Metoda: SaveAsDocument

Význam: Uloží objekt OLE do souboru v „přirozeném“ formátu jako dokument. Příklad: Máte v kontejneru zobrazen např. dokument Word, který jste vytvořili ze souboru pomocí metody CreateObjectFromFile (znovu připomínám, že obyčejný soubor není OLE objektem a pomocí této metody je nutné objekt ze souboru vytvořit!). Pokud zavoláte metodu kontejneru SaveToFile (viz dále), bude objekt OLE uložen do souboru jako objekt OLE! I když řeknete, že chcete soubor uložit s příponou *.DOC, Word jej neotevře, právě proto, že už to nebude „obyčejný“ soubor *.DOC , ale objekt OLE. Metoda SaveAsDocument naopak uloží objekt ve formátu dokumentu, takže v případě dokumentu Word jej Wordem otevřete, ale protože to je soubor, nikoliv objekt OLE, budete z něj muset příště opět objekt vytvořit. V jedné z dalších podkapitol naleznete příklad na ukládání a načítání objektů, ve kterém vše uvidíte prakticky.

Metoda: SaveToFile

Význam: Uloží objekt OLE do zadaného souboru. Pokud hodnota CopyOnSave = True, dojde nejprve k vytvoření kopie objektu v paměti, k jeho komprimaci a teprve následně k fyzickému uložení na disk.

Metoda: SaveToStream

Význam: Uloží objekt OLE do proudu. O hodnotě vlastnosti CopyOnSave platí totéž, co v případě metody SaveToFile.

Metoda: UpdateObject

Význam: Znovu načte zdroj dat a zabezpečí tak, že v kontejneru OLE je zobrazena opravdu aktuální verze objektu. Používá se pro vložené i propojené objekty. Tuto metodu zavolejte v případě, že potřebujete zajistit, aby kontejner zobrazoval opravdu aktuální data (někdo vám je totiž mohl takříkajíc „pod rukou“ změnit).

Metoda: UpdateVerbs

Význam: Znovu načte seznam klíčových slov, která jsou k dispozici pro aktuální objekt OLE. Tento seznam je uchováván ve vlastnosti ObjectVerbs. Příklad: objekt Media Clip mění svá klíčová slova Play a Stop podle svého stavu.

Na závěr

Vidíte, že přestože jsme popisovali jen vlastnosti a metody jedné jediné komponenty, je dnešní díl seriálu poměrně dlouhý. A to jsme jistě nepopsali vše, co komponenta OleContainer umožňuje. Technologie OLE je zkrátka velmi mocná a i přes občasné chybičky ve funkčnosti* se také velmi snadno používá. Stojí proto za to věnovat jí trochu času. S technologií OLE se ale ještě neloučíme. Za týden nás totiž ještě čeká popis spojování nabídek a také vysvětlení rozdílu mezi obyčejnými soubory a objekty OLE. Na závěr příštího dílu si uvedeme trochu rozsáhlejší příklad, který předvede několik dnes popsaných metod komponenty OleContainer.

*poznámka: zmíněné drobné chybičky ve funkčnosti jsou ale z velké části chybou programátora klientské aplikace.

Diskuze (1) Další článek: Objevte bohatství

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,