Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 174. – balíky BPL

Jan Šindelář 23.2.2005

Použití DLL knihoven není jediná možnost, jak využít některé možnosti sdílení kódu, paměti a dalších zdrojů mezi aplikacemi. Programátoři v Delphi mají ještě jednu možnost a tou je použití BPL. Stručné představení této metody nás čeká v dnešním dílu.

Balíky BPL, tedy Borland Package Library, možná znáte a používáte při instalaci nových komponent. Takový balík stačí otevřít, nainstalovat a v Delphi IDE se vám ukáže obvykle nová komponenta, resp. jejich kolekce. Dá se říci, že toto je jedna polovina využití BPL. Balíčky lze ovšem použít i jinak, přímo za běhu aplikace, a nahradit tak klasické DLL knihovny. Oproti DLL knihovnám nabízí některé další zajímavé možnosti pro vaši aplikaci (může obsahovat celé komponenty, třídy, objekty...), ovšem hned na začátku je třeba říci, že takovou knihovnu lze na rozdíl od DLL (která je v rámci Windows univerzální) použít opět pouze s aplikacemi, které jsou vytvořeny v Delphi (použít lze i C++ Builder od Borlandu). Co to znamená? Pro uživatele vaší aplikace prakticky nic, těm je lhostejné, zda se používá DLL či BPL. Pokud ovšem chcete vytvořit a distribuovat univerzální knihovnu, kterou pak může využít i programátor v C++ či Visual Basicu, musíte použít DLL.

Začneme malým experimentem, který sice zkušené programátory nijak neohromí, ale začátečníky může překvapit. Spustíme Delphi, vytvoříme nový projekt se základním (prázdným) formulářem a zkompilujeme jej. Výsledkem bude aplikace, tedy spustitelný exe soubor, jehož velikost (v závislosti na verzi Delphi) bude přibližně 300 kB. Tohle všichni dobře známe a nepřekvapí to ani začátečníky. Teď ovšem uděláme jednu zásadní věc.

Otevřeme si přes menu Project -> Options dialogové okno s detailním nastavením projektu a na záložce Packages zaškrtneme volbu Build with runtime packages. Poté projekt znovu zkompilujte. Výsledný exe soubor má kolem 20 kB. Celá věc je však prostá. Zatímco implicitně Delphi kompilují vše do jednoho spustitelného souboru tak, aby šla aplikace spustit téměř na libovolném počítači bez nutnosti instalovat další potřebné součásti do systému, po zaškrtnutí příslušného zatržítka je vytvořen exe soubor "čistý" a vše ostatní je v externích balících (tedy v BPL).

Spustíte-li tento maličký 20 kB soubor, měl by vám bez problému fungovat, neboť máte na svém počítači Delphi nainstalované a cesty k příslušným balíkům systém zná. Pokud ovšem pošlete soubor někomu jinému, kdo Delphi nemá, bude mít smůlu a aplikace fungovat nebude. Musíme totiž (podobně jako u DLL knihoven) distribuovat s aplikací i jednotlivé balíčky BPL, což v případě běžných aplikací znamená především knihovnu vizuálních komponent.

K čemu je to tedy dobré? Vezmeme-li si jako příklad poněkud extrémní projekt jako je Office, který obsahuje řadu samostatných spustitelných programů, určitě bude výhodné, budou-li jednotlivé aplikace malé a budou společně sdílet jeden balík knihoven. Výsledná instalace pak bude daleko menší a hlavně bude v paměti jen jeden modul, který obsahuje VCL pro všechny běžící Delphi aplikace.

BPL knihovny jsou v zásadě dvojího druhu a to run-time a design-time (případně může být balík obojí současně, ale to nepovažuji za další "druh"). Právě balíky design-time budete možná znát, neboť se používají pro instalaci komponent a dalších funkcí do IDE. Nás ovšem zajímá druhá skupina, run-time, které budeme používat jako náhradu za DLL knihovny.

Jak si tedy jednoduchý balíček vytvořit? Z menu File zvolíme New a v dialogovém okně zvolíme Package. Otevře se nám malé okno, kde vidíme stromovou strukturu složek. Pokud občas instalujete nějaké komponenty, dobře toto okno znáte. Složka Contains by měla být zatím prázdná, složka Requires může obsahovat některé potřebné unity pro celý balík. Tlačítkem Add teď přidáme do balíku nový unit (tedy soubor .pas). Může to být vámi vytvořená komponenta, knihovna funkcí a podobně. Podle toho, jaké další knihovny váš přidaný unit potřebuje, se ve složce Requires mohou objevit automaticky další potřebné moduly. Nyní klikneme na tlačítko Options a v dialogu zvolíme typ balíčku - Runtime only. Teď už stačí jen balíček uložit a kliknutím na příslušné tlačítko zkompilovat.

Výsledkem bude BPL soubor s naším balíčkem. Podle nastavení Delphi se však může stát, že BPL soubor nebude ve stejné složce, kam jste uložili "zdrojový kód" balíčku. Nepropadejte však panice, pravděpodobně jej najdete v adresáři {Delphi\Projects\BPL\}.

Použití vlastního balíčku je pak snadné. Nemusíme nic programovat, ale pouze u nové aplikace přes menu Project -> Options a na záložce Packages opět zaškrtneme příslušné zatržítko a přes tlačítko Add přidáme náš nový balík. Automaticky je pak "přilinkován" do projektu a můžeme jej využívat. To ovšem neznamená, že ve zdrojovém kódu aplikace pak nemusíme do uses přidat příslušný unit!

Myslím, že to by pro dnešek mohlo na úvod stačit. Už víme, co to je BPL a k čemu je použít. Programujete-li převážně Delphi aplikace resp. rozsáhlejší provázané projekty s několika programy v Delphi, případně chcete-li rozšířit vaše programy o možnost "plug-inů", jsou BPL balíky ideální řešení. Konkrétnější příklad si předvedeme zase příště.