Tipy a triky v Delphi, díl 101.

Po minulém jubileu se opět vrháme na další tipy. Tentokrát je na řadě Macromedia Flash a jeho přehrávání v Delphi.
Tipy a triky v Delphi, díl 101. Po minulém jubileu se opět vrháme na další tipy. Tentokrát je na řadě Macromedia Flash a jeho přehrávání v Delphi.

Nejprve si vysvětlíme, co bude cílem dnešního snažení a pak se vrhneme na postup. Tak tedy, od našeho dnešního příkladu budeme chtít, aby v okně naší aplikace přehrál libovolný Flash soubor, resp. soubory s koncovkou swf. Jelikož si soubor s naší Flash animací uložíme do zdrojů, bude přímo součástí naší aplikace. Tím se sice může podstatně zvětšit velikost výsledného exe souboru (záleží na velikosti souboru s animací), nicméně bude vše pohromadě a alespoň si znovu pocvičíme práci se zdroji. Samozřejmě můžete zvolit svůj vlastní postup a soubor načítat externě (v konečném důsledku to tak stejně dopadne i našem příkladu). Aby toho nebylo ještě dost, ošetříme navíc jednu důležitou událost, která může nastat. Uživatel naší aplikace totiž nemusí mít Flash v počítači nainstalován, takže se postaráme i o tento případný "nedostatek" a Flash v případě potřeby doinstalujeme sami. Příslušný ocx modul bude rovněž součástí zdrojů naší aplikace. Výsledkem tedy bude aplikace, která přehraje danou Flash animaci a v případě potřeby ještě předtím zajistí instalaci Flashe.

Začneme tvorbou souboru se zdroji. To jsme již prováděli několikrát, takže jen velmi krátce. Do jednoho adresáře nakopírujte váš swf soubor s animací a dále soubor swflash.ocx, který naleznete v systémovém adresáři Windows (podle verze buď windows\system32\macromed\flash a nebo windows\system\macromed\flash). Poté vytvoříme textový soubor s názvem flash.rc, který bude obsahovat pouze tyto dva řádky:

SHOCKWAVEFILE RCDATA soubor.swf
SHOCKWAVEOCX RCDATA swflash.ocx

Tento soubor pak pomocí kompilátoru zdrojů, který naleznete v adresáři BIN v Delphi, zkompilujete příkazem:

Brcc32 flash.rc

a získáte tím zkompilovaný soubor se zdroji flash.res

Nyní je čas spustit Delphi a na paletu komponent importovat Flash, abychom pak mohli s tímto ActiveX objektem pracovat v naší aplikaci. V menu Component vybereme položku Import ActiveX Control, v zobrazeném seznamu nalistujeme Shockwave Flash a stiskneme tlačítko Install. Hotovo.

Konečně se dostáváme ke zdrojovému kódu. Vytvoříme si novou aplikaci a na formulář přidáme ze záložky ActiveX (pokud jste v předchozím kroku nezvolili jinou) komponentu ShockwaveFlash. Teď máte celkem volnou ruku ve změně rozličných parametrů, které se týkají animace i velikosti okna, ale zatím nenačítejte do komponenty žádný soubor s animací, protože ho budeme načítat ze zdrojů. Teď už jenom vytvoříme událost OnCreate, kde se budou veškeré akce odehrávat.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, ShockwaveFlashObjects_TLB;

type
  TForm1 = class(TForm)
    ShockwaveFlash1: TShockwaveFlash;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R flash.res}

procedure TForm1.FormCreate(Sender: TObject);
var
  SystemDir: array[0..MAX_PATH] of Char;
  SWFDir, AppDir: string;
  Fres: TResourceStream;
  Ffile: TFileStream;
begin
  GetSystemDirectory(@SystemDir, MAX_PATH);
  SWFDir := SystemDir + `\macromed\flash\`;
  GetDir(0, AppDir);
  if not FileExists(SWFDir + `swflash.ocx`) then
  begin
    {$i-}
    MkDir(SystemDir + `\macromed`);
    MKDir(SystemDir + `\macromed\flash`);
    {$i+}
    Fres := TResourceStream.Create(0, `SHOCKWAVEOCX`, RT_RCDATA);
    Ffile := TFileStream.Create(SWFDir + `swflash.ocx`, fmCreate);
    Ffile.CopyFrom(Fres, Fres.Size);
    Fres.Free;
    Ffile.Free;
    WinExec(PChar(`regsvr32 /s ` + SWFDir + `swflash.ocx`), SW_HIDE);
  end;
  Fres := TResourceStream.Create(0, `SHOCKWAVEFILE`, RT_RCDATA);
  Ffile := TFileStream.Create(`soubor.swf`, fmCreate);
  Ffile.CopyFrom(Fres, Fres.Size);
  Fres.Free;
  Ffile.Free;
  ShockwaveFlash1.Movie := AppDir + `\soubor.swf`;
end;

end.

A to je vše. Takto spuštěná aplikace nejprve ověří, zda je nainstalován Flash kontrolou existence příslušného souboru a pokud jej nenalezne, vytvoří si příslušný adresář a ze zdrojů naší aplikace jej do tohoto umístění "rozbalí". Pak jej jednoduchým příkazem v systému zaregistruje. Vzhledem ke snaze zkrátit a zpřehlednit výsledný kód je napsán poněkud zjednodušeně, ale ošetření výjimek určitě zvládnete přepracovat do profesionálnější podoby sami podle vašich potřeb. Určitě by také bylo vhodné ještě před samotnou instalací čehokoliv do systému se uživatele zeptat, zda si to přeje či ne a nebo ho alespoň upozornit.

Ve druhé části kódu se pak již rozbalí ze zdrojů samotný soubor s animací a začne se přehrávat. I zde je jisté zjednodušení. Určitě by se slušelo rozbalit soubor spíše do složky pro dočasné soubory a po ukončení aplikace jej smazat. Zkrátka jistě přijdete na řadu dalších zlepšení.

Diskuze (2) Další článek: Fujifilm uvádí FinePix S5000 Zoom - jako zrcadlovka!

Témata článku: Software, Programování, Shockwave, Díl, Spuštěná aplikace, Zjednodušený příklad, 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ší