Tipy a triky v Delphi, díl 90.

Dnes si zakončíme naše malé povídání o několika aplikacích balíku MS Office a ukážeme si poslední dva jednoduché příklady. Naučíme se zjistit, zda je příslušná aplikace nainstalována či spuštěna.
Posledních pár dílů jsme věnovali různým tipům pro aplikace Office. Ve většině případů jsme používali technologie OLE a tím pádem byla funkčnost našich příkladů závislá na tom, zda je či není příslušná aplikace v našem systému nainstalována. I když jsme vždycky používali bezpečný způsob, který by v případě nepřítomnosti dané aplikace nezpůsobil pád našeho programu, určitě by bylo dobré předem vědět, jestli je aplikace v systému dostupná či ne.

Způsobů, jak to zjistit, existuje samozřejmě jako vždy více. My zvolíme jeden z těch jednodušších, který pracuje s registry. Z nich na příslušném místě vyčteme potřebnou informaci o přítomnosti či nepřítomnosti dané aplikace Office v systému. Společný zdrojový kód pro oba dnešní příklady naleznete dále.

Dalším problémem, který by mohl teoreticky v určitých případech při našich hrátkách s OLE (a nejen s ním) nastat, je drobná kolize mezi naším programem a příslušnou aplikací. Bude-li se náš program snažit zneužít danou aplikaci k nějaké činnosti zatímco aplikace běží a má v danou chvíli na práci úplně jiné věci, může dojít k problémům. Sice by neměla nastat žádná velká kolize a vše by mělo být dostatečně ošetřeno, ale přesto by bylo určitě dobré vědět, jestli je příslušná aplikace spuštěna a zda si můžeme dovolit ji zatížit na další půlhodinu našimi pokusy. To již záleží na povaze vaší aplikace a funkcích, které bude prostřednictvím OLE od aplikací Office požadovat. K tomu tedy slouží naše druhá dnešní funkce, která je opět velmi jednoduchá a využívá jednotek ComObj a ActiveX.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, ActiveX, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function IsObjectActive(const ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(ClassName);
    Result  := GetActiveObject(ClassID, nil, Unknown) = S_OK;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsObjectActive(`Word.Application`) then ShowMessage(`Word je spusten.`);
  if IsObjectActive(`Excel.Application`) then ShowMessage(`Excel je spusten.`);
  if IsObjectActive(`Outlook.Application`) then ShowMessage(`Outlook je spusten.`);
  if IsObjectActive(`Access.Application`) then ShowMessage(`Access je spusten.`);
  if IsObjectActive(`Powerpoint.Application`) then ShowMessage(`Powerpoint je spusten.`);
end;

function OfficeAppInst(const ClassName: string): Boolean;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Result := Reg.KeyExists(ClassName);
  finally
    Reg.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OfficeAppInst(`Word.Application`) then ShowMessage(`Word je nainstalovan.`);
end;

end.

Jak vidíte, funkce jsou velmi jednoduché a obě mají stejné parametry. A tím na nějaký čas s Office končíme a příště se zase vrhneme na jiné téma.

Váš názor Další článek: RIAA poprvé přiznala chybu

Témata článku: Software, Programování, Příslušná aplikace, Díl, Trik

Určitě si přečtěte


Aktuální číslo časopisu Computer

Zachraňte nefunkční Windows

Jak nakupovat a prodávat kryptoměny

Otestovali jsme konvertibilní notebooky

Velký test 14 herních myší