Umíme to s Delphi, 35. díl – BPL: packages (balíky), dokončení

Před týdnem jsme se začali zabývat tématem balíků. Řekli jsme si, co balíky jsou, a vysvětlili jsme si hlavní rozdíly mezi běhovými a návrhovými balíky. Dnes v tomto tématu pokračujeme. Začneme stručným přehledem souborů, které se v balících vyskytují, a pak se pokusíme krok za krokem vytvořit svůj vlastní balík.
Nejprve uvedeme odpověď na námět pro přemýšlivé z minulého dílu. Návrhový balík budete muset s výsledkem svého snažení distribuovat tehdy, když nebude výsledkem vašeho snažení „obyčejná“ aplikace, ale komponenta. Vytváříte-li totiž pořádnou komponentu, pak budete

chtít, aby (když jí už někdo použije ;-)) šlo její vlastnosti nastavit už při vývoji =>

Delphi tak musí vědět, co a jak bude uživatel komponenty moci nastavit už při vývoji.

Soubory balíků

Vytváříte-li vlastní balík, vytváříte v podstatě určitý druh projektu. Každý projekt se skládá z (více) souborů a balík není v tomto ohledu nijak výjimečný. Pojďme se podívat na přípony souborů, které s balíky souvisí (viz tabulka):

Přípona Význam souboru
*.DPK Zdrojový soubor balíku. Nachází se v něm především seznam modulů (jednotek), které balík obsahuje a seznam dalších balíků, které vyžaduje. Je to jakási analogie zdrojového souboru projektu <.DPR). Pro každý balík je právě jeden tento soubor.
*.DCP Binární (zkompilovaný) soubor obsahující hlavičku balíku a spojení všech *.DCU souborů v balíku. Abyste mohli balík v aplikaci vůbec použít, musíte mít tento soubor. Pro každý balík je právě jeden tento soubor.
*.DCU Binární (zkompilovaný) soubor modulu, který je v balíku obsažen. Pro každý obsažený modul existuje jeden tento soubor (je to „klasická“ zkompilovaná jednotka Delphi Compiled Unit, která se vyskytuje v každé aplikaci, pro každou jednotku.
*.BPL Tento soubor je vlastní (běhový!) balík. Tento soubor je vlastně Windows DLL knihovnou, ale se speciálními vlastnostmi, které jej předurčují pro použití v aplikacích Delphi (příp. Borland C++ Builderu). Tento soubor budete distribuovat společně s aplikací (v případě že … viz minulý díl seriálu).

Vytváření vlastních balíků

Rozhodnete-li se vytvořit nový balík, budete si muset promyslet následující body:
  • dostatečný důvod k vytvoření balíku: balík má smysl vytvářet pouze v případě, že nezbytně potřebujete něco do něj opravdu „zabalit“ :-) – viz poslední odrážka;
  • název balíku;
  • seznam dalších balíků, které bude váš balík vyžadovat;
  • seznam programových jednotek (modulů), které bude váš balík obsahovat.

Máte-li ve všem jasno:-), můžeme se pustit do práce. Připomínám, že k vytvoření balíku budete potřebovat přinejmenším jeden (funkční) programový modul (jednotku). Dejme tomu, že jej máte. V závěru kapitoly naleznete zdrojový kód jednoduchého modulu, který můžete k tomuto účelu využít.

  • Vyberte File – New…, z otevřeného dialogu zvolte Package. Potvrďte.
  • Otevře se dialog Package Editor, viz obrázek:
  • Klepněte pro větší obrázek
  • V tomto dialogu přehledně vidíte obě klíčové sekce balíku: Contains (tedy moduly, které balík obsahuje) a Requires (tedy balíky, které vyžaduje). Všimněte si, že balík VCL50 je vyžadován implicitně (nicméně můžete jej klidně odebrat).
  • Chcete-li přidat modul do sekce Contains, zvolte tuto sekci a klepněte na tlačítko Add… Otevře se další dialog a v něm buď zadejte název souboru *.PAS (i s případnou adresářovou cestou), nebo klepněte na tlačítko Browse… a soubor najděte. Modul se následně zobrazí v sekci Contains.
  • Chcete-li přidat balík do sekce Requires, postupujte zcela analogicky: zvolte sekci Requires, klepněte na Add… a buď zadejte soubor (ovšem tentokráte *.DCP, protože nepřidáváme modul, ale již existující balík) nebo jej vyhledejte pomocí Browse…
  • Stejným způsobem můžete přidat do balíku libovolné množství dalších modulů a balíků.
  • Klepnete-li v Package Editoru na tlačítko Options, otevře se dialog pro nastavování možností balíku (viz obrázek). V tomto dialogu můžete nastavit např. popis balíku (Description) a především jeho typ – návrhový nebo běhový. Všimněte si, že můžete také zvolit běhový i návrhový zároveň:
  • Klepněte pro větší obrázek
  • Až budete mít vloženy všechny moduly a balíky a nastaveny všechny vlastnosti, uložte balík. Doporučuji – stejně jako u aplikací – ukládat každý balík do zvláštního adresáře. Vyberte z hlavní nabídky File – Save All a zadejte název balíku (např. Balik1). Podíváte-li se nyní do adresáře, kam jste balík uložili, zjistíte, že se tam nalézají 4 soubory: Balik1.cfg (konfigurační soubor), Balik1.dof (nastavení kompilátoru a dalších prostředků), Balik1.res (resource soubor) a především Balik1.dpk (hlavní soubor, „projekt“ balíku).
  • Nakonec je třeba balík zkompilovat. Klepněte na tlačítko Compile. Při kompilaci dojde jednak ke zkompilování všech modulů a jednak ke kontrole případných závislostí. Proto můžete být v průběhu kompilace požádáni o souhlas s dodatečným zařazením některých dalších balíků do projektu. Během kompilace visí na obrazovce okno s průběžným hlášením chyb a varovných hlášek. Pokud toto okno vypadá po skončení kompilace jako na následujícím obrázku, je všechno v pořádku a kompilace proběhla bez chyb:
  • Klepněte pro větší obrázek
  • Nyní se můžete podívat do adresáře s balíkem. Zjistíte, že přibyl jediný soubor: Balik1.dcu. To je zkompilovaný soubor balíku, ale není to vlastní balík. Ten se totiž standardně ukládá do adresáře PROJECTS\BPL. V tomto adresáři byste měli objevit soubory Balik1.dcp a Balik1.bpl, což je konečně kýžený výsledný balík.
  • Nyní se můžete vrátit z průzkumu adresářové struktury vašeho disku zpět do Delphi:-). Ještě jednou se podívejte na Package Editor a zaměřte svou pozornost na tlačítko Install. Pokud na něj klepnete, dojde k automatické instalaci balíku (tedy vyhnete se postupu popsanému výše). Tato volba má smysl jen u návrhových balíků.
  • A na závěr raději ještě jednou upozorním na velmi důležitou zradu: i když v aplikaci zvolíte používání balíku Balik1, stejně musíte zapsat název vloženého modulu do sekce Uses ve všech modulech, ve kterých hodláte funkce z balíku používat!

Několik závěrečných poznámek k balíkům

Existuje pojem tzv. kolekcí balíků. Tyto kolekce slouží k dalšímu zjednodušení distribuce balíků mezi vývojáři a uživateli. Každá kolekce obsahuje jeden nebo (zpravidla) více balíků a kromě nich libovolné další soubory, které chcete s balíky distribuovat. Poměrně komfortní je také instalace balíků z těchto kolekcí, neboť probíhá částečně automaticky a vy pouze vyberete z dialogu Installation, jak má instalace proběhnout (příp. jaké balíky chcete instalovat). K vytváření a správě kolekcí slouží Package Collection Editor, který otevřete z hlavního menu – Tools – Package Collection Editor.

Je třeba dbát maximální opatrnosti, pokud jde o vyvíjení nových verzí balíků. Předpokládá se, že vytvoříte aplikaci používající nějaký balík a časem budete chtít vydat novou, aktualizovanou verzi balíku (a často i aplikace). To je sice skvělá idea, ale nese s sebou mnoho úskalí. Musíte totiž zabezpečit, že i staré aplikace s touto novou verzí balíku korektně poběží. Nové verze balíků by bezpodmínečně měly být zpětně kompatibilní. Pokud jedna verze balíku obsahuje nějakou funkci s nějakým významem, není dobré tuto funkci předefinovat tak, že dělá úplně něco jiného. Stejně tak jakákoliv modifikace datových typů definovaných v balíku povede k tomu, že aplikace zvyklé na starou verzi balíku nebudou fungovat. Pokud přesto zjistíte, že je nezbytně nutné nějakou takovouto změnu provést, což se koneckonců asi dá očekávat, nazvěte novou verzi balíku jinak než původní! Pak může teoreticky jeden počítač obsahovat obě verze knihovny, takže poběží jak „staré“ aplikace zvyklé na „starou“ knihovnu, tak nové.

Zdrojový kód jednoduchého modulu

Tento modul můžete zkopírovat a použít, pokud si chcete vyzkoušet vytvoření balíku a nechce se vám programovat vlastní modul. Musíte pouze uvést název modulu do sekce Uses v modulech aplikace, která bude balík využívat!

unit Modul;      // tento modul můžete použít pro vytváření balíku

interface      // sekce interface – modul obsahuje proceduru a
        // funkci
function Faktorial(N: integer): LongWord;
procedure VypisVolnouPamet;

implementation    // sekce implementation – těla funkce a metody
uses
  SysUtils, Classes, Dialogs, Windows;

{$R *.RES}

        // funkce pro výpočet faktorálu ze zadaného
        // argumentu
function Faktorial(N: integer): LongWord;
var
  I: Word;
  Pom: LongWord;

begin
  Pom := 1;

  for I := N downto 1 do
    Pom := Pom * I;

  Result := Pom;
end;

        // procedura, která vypíše aktuálně volnou paměť
        // v počítači. Je použito datového typu
// TMemoryStatus a funkce GlobalMemoryStatus,
// které přináší Windows API (jejich původ tedy
// není přímo v Delphi
procedure VypisVolnouPamet;
var
  Pamet: TMemoryStatus;

begin
  GlobalMemoryStatus(Pamet);

  ShowMessage(`Volna pamet: ` + FloatToStr(Pamet.dwAvailPhys / 1024) + ` kB`);
end;

end.

Důležitá poznámka k dnešnímu dílu

V závěru dnešního dílu seriálu musím bohužel uvést stejné upozornění jako před týdnem. Není to sice obvyklé, nicméně v tomto díle došlo k tomu, že některé uvedené skutečnosti (především názvy souborů, např.VCL50) nemusí fungovat ve všech verzích Delphi. Funkčnost byla ozkoušena na Delphi 5.0 a ve starších verzích se mohou projevit (a nepochybně projeví) drobné odlišnosti. Ty však nemají charakter přímého rozporu s textem, jsou spíše formálního rázu. V každém případě nezkoušejte experimentovat s balíky v Delphi 1.0 či 2.0 (nepředpokládám, že by to někoho z vás napadlo:-)), neboť tam se pojem „balík“ vůbec nevyskytuje.

Na závěr

Balíky jsou novinkou od Delphi verze 3.0. Slouží jako specializované dynamicky linkované knihovny a používají se k seskupování programového kódu, který využívá více aplikací. Nejdůležitější dělení je na běhové a návrhové balíky.

V tomto a v předchozím díle seriálu jsme shrnuli problematiku balíků. V žádném případě jsme balíky nepopsali kompletně. Vyčerpávající popis však jednak není možný, a jednak je také zbytečný. V tomto okamžiku máte snad dostatečnou povšechnou povědomost o balících, takže až se za čas vrhneme na vytváření komponent, nic vás v tomto směru nepřekvapí.

Diskuze (3) Další článek: Digitální kamera v základní sestavě PC

Témata článku: Software, Windows, Programování, Balík, Dialog, Modul, Nová sekce, Díl, Hlavní soubor, Dok, Delphi, TomTom, Stará verze, Browse, Starý typ, Package, Pack, Výjimečná vlastnost, DEL, Zvláštní význam, Nová komponenta, Páčka, Dokončení


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

Deset kotev, které i v roce 2020 táhnou Android ke dnu

Deset kotev, které i v roce 2020 táhnou Android ke dnu

** Android existuje skoro 12 let a za tu dobu v mnoha směrech dospěl ** Dnes běží na sedmi z deseti telefonů, ale čemu za to vděčí? ** Našli jsme 10 kotev, které táhnou tento operační systém ke dnu

Karel Kilián | 169

Nové názvy, upravený vývoj. Microsoft ukázal, jak teď bude vydávat Windows 10

Nové názvy, upravený vývoj. Microsoft ukázal, jak teď bude vydávat Windows 10

** Podzimní vydání Windows 10 přinese jen minimum novinek ** Aktualizace ponese formální označení 20H2 ** Microsoft mění názvy v programu Windows Insider

Lukáš Václavík | 17

Apple má šanci definitivně se uzamknout. macOS byl na jeho poměry až příliš otevřený

Apple má šanci definitivně se uzamknout. macOS byl na jeho poměry až příliš otevřený

** Apple, vývojáře i uživatele rozhodně nečekají dva roky prázdnin ** macOS se může uzavřít podobně jako iOS a iPadOS ** Přechod na Arm znamená stopku pro hackintoshe

Lukáš Václavík | 105

12 netradičních map České republiky, které jste ještě nikdy neviděli

12 netradičních map České republiky, které jste ještě nikdy neviděli

** Tušíte, kolik je u nás hřbitovů a jak jsou velké? ** Dokážete si představit mapu českých řek a potoků? ** Udělali jsme to všechno za vás nad daty ČÚZK

Jakub Čížek | 10

Jak uložit dokument z Wordu, aby vydržel celé roky? Je to těžší než cesta na Mars

Jak uložit dokument z Wordu, aby vydržel celé roky? Je to těžší než cesta na Mars

** Jak uložit soubory, aby vydržely vnoučatům? ** A co kdyby měly přečkat celá staletí? ** Teď se o to pokouší GitHub a je to oříšek i pro lingvisty

Jakub Čížek | 118

Apple vychrlil novinky: Nové operační systémy a příprava na vlastní procesory

Apple vychrlil novinky: Nové operační systémy a příprava na vlastní procesory

** Apple dnes představuje novinky ** Tradiční keynote v rámci konference WWDC probíhá jen online ** Nové operační systémy, ale i něco navíc

David Polesný | 109


Aktuální číslo časopisu Computer

Megatest: nejlepší notebooky do 20 000 Kč

Test 8 levných IP kamer

Jak vybrat bezdrátová sluchátka

Testujeme Android 11