Otevírání příloh

- využití OLE při otevírání příloh (Word, Excel, atd.)

Tuesday, 1. April 2008

Když jsou uživatelé zhýčkaní

Vytvářet řešení, které vám bude otevírat embededd objekty v richtext poli se možná zdá být zbytečné. Proč si proboha uživatel nemůže nad ikonkou procvičit klikání, že? Někdy se to ovšem může hodit, třeba u vnořených pohledů na formuláři, které nám zobrazují dokumenty, které souvisí s hlavním formulářem. A problém je na světě. Řešení, jak se do toho pustit, moc není. Já si vybral OLE.

Princip řešení je ve vyhledání embedded obejktů v RTF poli. Z těchto objektů lze získat příponu, třeba pomocí funkce v LotusScriptu Right, která vrací uvedený počet znaků z pravavé strany daného řetězce. Hlavně se nesmí zapomenout na sjednocení velikosti písmen přípony, třeba pomocí funkce Ucase$.

'o je embedded object
Ucase$(Right(o.Name,3))

Díky tomu můžeme vytvořit příslušný OLE objekt.

Set App = CreateObject("Word.Application")

Od OLE objektu se odvíjí samozřejmě přistupování k metodám a objektům. Například pro Word jsou to dokumenty (documents) a pro Excel jsou to pracovní sešity (Workbooks).

Máme OLE

Samozřejmě přichází to hlavní, jak vytvořit z embedded přílohy (1454 - attachments) OLE objekt? No, já si vyextrahoval přílohu do tempu daného uživatele pomocí metody objektu ExtractFile.

Call o.ExtractFile( Environ("Temp") & "\" & o.Name)

Environ vrátí cestu k temp adresáři (C:\Document And Settings\User\Local Settings\Temp). Tento OLE objekt otevřu v dané asociované aplikaci. Kdo zná trochu OLE, určitě ví čím.

Obj.Open cesta

Nejdůležitější krok je zobrazení dané aplikace uživateli.

App.Visible = True
App.Activate

Kontrola editace

Jeden z nejdůležitějších kroků je ten, jak odchytit událost zavření asociované aplikace. Ne, to nevím  a myslím, že to ani nejde. Respektive jde, ale není to zdokumentované, takže jsem to nikde nenašel. Pokud někdo ví, budu rád za info. Řešil jsem to ale tak, že po otevření asociované aplikace zobrazím modální (aplikační, 36) okno s dotazem, zda chci dokument uložit. Pokud ano, vymaži původní embedded objekt. S tím byl malý problém, protože metoda Remove pro embedded objekt v RTF moc nefunguje :) Sama IBM o tom ví a problém byl reportován. Kdy se vyřeší, snad brzo :) Alespoň je řešení, stačí pomocí pole proběhnout richtext a pokud se nám shoduje jméno, vymažeme jej:

  Forall o In rtitem.EmbeddedObjects
   If(o.Type=EMBED_ATTACHMENT) Then
    If o.name=o.Name Then
     Call o.Remove
    End If
   End If
  End Forall

Je to oficiální postup řešení IBM. No, hlavně že funguje. Pak již stačí objekt zase vložit z tempu do richtextu a smazat po sobě temp

Kill cesta

Snad tento hrubý a velice abstraktní návod na řešení někomu pomůže. Vím, že to kód, ale to snad každý pochopí. Můžu jen říci, že to bylo vyzkoušeno na OS Windows Vista s MS Office 2007.



systém spravován pomocí webmaker.ooo.cz
©2006-2017 Tomáš Hanus | ixulot | ixodesign.cz | RSS