Tipy a triky v Delphi, díl 172. – formulář v DLL knihovně

Do třetice si budeme povídat o DLL knihovnách a tentokrát si do ní uložíme rovnou celý formulář. Postup je opět velmi jednoduchý.

Samozřejmě i tentokrát začneme nejprve knihovnou. Stejně jako v minulém a předminulém dílu založíme nový projekt typu DLL knihovna. Poté opět přes menu File -> New -> Form vložíme do projektu nový formulář, který ihned uložíme a následně přes menu Project -> Add to Project přidáme formulář do projektu DLL knihovny.

Nyní můžeme vložený formulář libovolně vizuálně upravit dle libosti a potřeby. Můžeme přidat další komponenty, vložit vlastní funkce a kódy událostí, zkrátka cokoliv vás napadne. Máme-li formulář připraven, není to ještě vše. Musíme do kódu projektu knihovny přidat funkce pro zobrazení formuláře, neboť jinak by nebylo možné zobrazit formulář z externí aplikace. Přesněji řečeno to bude jedna procedura, která slouží k běžnému zobrazení formuláře, a jedna funkce, která se postará o modální zobrazení (její návratovou hodnotou je modal result). Funkci i proceduru pak přidáme do seznamu externě dostupných funkcí knihovny. Kód projektu pak vypadá takto:

library Project1;

uses
  SysUtils,
  Classes,
  Unit1 in `Unit1.pas` {Form1}

{$R *.res}

procedure ShowF; stdcall;
begin
  Form1 := TForm1.Create(nil);
  Form1.Show;
end;

function ShowFModal:integer; stdcall;
begin
  Form1 := TForm1.Create(nil);
  Result := Form1.ShowModal;
end;

Exports ShowF, ShowFModal;

begin

end.

Direktiva stdcall, kterou nalezneme u názvu funkce i procedury, patří mezi tzv. volací konvence, kterých je několik druhů a rozhodují o způsobu předávání parametrů (jejich pořadí). Detaily a další možnosti (jako např. register, safecall apod.) naleznete v nápovědě Delphi.

Nesmíme zapomenout na jednu věc a tou je řádné ukončení (resp. destrukce) formuláře po jeho uzavření a tím správné uvolnění zdrojů. Využijeme k tomu událost OnClose formuláře, kde nastavíme TOnCloseAction na hodnotu caFree, která uvolní paměť. Kód události pak bude vypadat takto:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

Tím je knihovna hotová a zbývá nám jen kompilace, abychom získali výsledný DLL soubor. Ten pak použijeme v ukázkové aplikaci. Založíme nový projekt, do dané složky zkopírujeme naši DLL knihovnu a na formulář umístíme pouze dvě tlačítka. První bude volat funkci knihovny pro tradiční zobrazení formuláře, druhé tlačítko pak pro modální zobrazení. Důležitá je ovšem deklarační část unitu formuláře, kde musíme nadefinovat příslušnou proceduru a funkci, které pak budeme v událostech OnClick zmiňovaných tlačítek volat. V této deklaraci si zvolíme vhodný název a uvedeme, že se funkce nachází v externím zdroji, který je opět definován názvem DLL knihovny a tentokrát i názvem funkce. Tyto dva deklarační řádky pak mohou vypadat jednoduše takto:

.
.
procedure ShowForm; stdcall; external `Project1.dll` name `ShowF`;
function ShowFormModal:integer; stdcall; external `Project1.dll` name `ShowFModal`;
.
.

Tím je vlastně dnešní příklad hotov. A využití? Představte si, že máme aplikaci a z menu voláme její funkce. Ty se pak otvírají v dalších oknech. Pokud tato okna (včetně příslušných funkcí, samozřejmě) uložíme do DLL knihovny, umožní nám to velmi elegantní aktualizaci naší aplikace, kdy stačí vyměnit pouze příslušnou knihovnu. Navíc můžeme funkce aplikace rozdělit do pomyslných "plug-inů" a aktualizovat pak pouze jednotlivé části aplikace zvlášť. To je pochopitelně jen nástin nabízejících se možností.

I tentokrát si můžete kompletní zdrojové kódy ukázkové aplikace i samotné knihovny stáhnout zde.

Diskuze (10) Další článek: Sophos rozšíří své produkty o firewall

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