Umíme to s Delphi, 34. díl – BPL: packages (balíky), 1. část

V dnešním díle seriálu otevřeme problematiku tzv. balíků (packages). Balíky jsou speciálními formami DLL knihoven, které mohou být používány aplikacemi napsanými v Delphi nebo vývojovým prostředím Delphi, případně oběma. Bez balíků se lze těžko obejít, pokud vytváříte a instalujete novou komponentu Delphi.
V minulém dílu seriálu jsem sice slíbil, že dnes budeme pokračovat popisem další komponenty typu „kalendář“, ale upřímně řečeno jsem pojal obavu, zda není „kalendářování“ v poslední době již příliš. Proto jsem lehce změnil plánovaný harmonogram a pokusil se popsat také něco sofistikovanějšího (i když ne příliš). O slíbený kalendář ale nepřijdete, je již napsaný a brzy se určitě na stránkách Živě.cz objeví.

Kromě toho se ale také blíží okamžik, kdy se budeme zabývat vývojem vlastních komponent (opravdu). Proto neuškodí pronést několik procítěných slov k balíkům, které budeme při tvorbě komponent bezpodmínečně potřebovat. O problematiku balíků kromě toho projevil zájem také jeden ze čtenářů v diskusi pod dílem seriálu věnovaným DLL knihovnám. Jak už řečeno, balík je speciální formou dynamicky linkované knihovny (DLL). DLL knihovnami jsme se již v našem seriálu zabývali, proto si je pouze velmi stručně v jednom odstavci připomeňme.

Knihovna DLL je (zjednodušeně řečeno) soubor, který se k aplikaci linkuje (tedy připojuje) až za běhu. Na první pohled se podobá programovému modulu. Obsahuje totiž také programový kód (procedury a funkce) a data. Navíc může obsahovat také zdroje Windows, tzv. resources. DLL knihovny jsou samostatnými aplikacemi (spustitelnými), které mají svou vnitřní strukturou relativně blízko k *.EXE souborům. Základními dvěma znaky knihoven DLL je jejich připojování k aplikaci až za běhu v okamžiku, kdy je to potřeba; a dále možnost jejich sdílení více aplikacemi.

Tak, stručné připomenutí knihoven DLL máme úspěšně za sebou a můžeme se vrhnout na balíky. Nejprve krátké obecné pojednání, abyste si pod tímto označením dovedli něco představit.

Balíky – oč vlastně jde?

Balík je speciální dynamicky linkovaná knihovna. Na rozdíl od „klasických“ knihoven DLL ji však nemůže využívat libovolná aplikace ve Windows, nýbrž pouze aplikace vytvořená v Delphi (a v C++ Builderu) – a také samotné vývojové prostředí Delphi (IDE). Balíky rozdělujeme na „běhové“ (runtime packages) a „návrhové“ (balíky platné v době návrhu, design-time packages). Běhové balíky zabezpečují (jak také jinak) běh aplikace (např. přinášejí nějaké funkce, apod.). Pokud distribuujete aplikaci, která používá běhové balíky, je nezbytně nutné tyto balíky dodat spolu s aplikací na cílový počítač, jinak se aplikace nespustí! Návrhové balíky jsou používány jen při práci ve vývojovém prostředí, tedy v návrhové fázi aplikace. Kód platný v době návrhu vykonává integrované prostředí Delphi. Bez návrhových balíků se lze těžko obejít při vytváření a instalaci nových komponent, např. vyvíjíme-li pro svou komponentu specializovaný property editor (Property editor = editor vlastností komponenty).

Poznámky:

  • Při vytváření komponenty není balík jako takový nezbytně potřeba (takže by se zdálo, že se bez něj lze obejít), protože zdrojové kódy komponenty můžete mít také v modulu (unitě). Faktem ale zůstává, že při instalaci komponenty musíte zvolit cílový balík, kam se komponenta přidá, takže se vlastně bez balíků rozhodně neobejdete. Podrobnosti si popíšeme v kapitole věnované vývoji nových komponent.
  • Vzhledem k tomu, že při práci v Delphi používáte návrhové balíky samotných Delphi (ať již programujete nové komponenty nebo „obyčejné“ aplikace, neobejdete se bez návrhových balíků ve své podstatě vůbec nikdy, protože bez nich si v Delphi „neškrtnete“. To jen pro ty, kteří si rádi hrají se slovy:-)
Z toho, co bylo řečeno, byste asi dokázali odvodit, že pokud vaše aplikace používá návrhový balík, není nutné tento balík šířit s finální verzí aplikace.

Námět pro přemýšlivé:

Pokud máte chuť trochu se zamyslet, zkuste do diskuse pod článkem napsat, v jakém případě neplatí předchozí věta. Přesněji řečeno, vymyslete, ve které situaci budete (muset) návrhový balík distribuovat s výsledkem svého snažení :-).

Balík ovšem nemusí být „vyhraněný“: může být zároveň běhový a návrhový. Balíky dále mohou být (a také velmi často jsou) na sobě navzájem závislé, typicky návrhový balík používá ke své činnosti některé funkce z běhového balíku.

Aby bylo možné rozlišit balíky od jiných dynamicky linkovaných knihoven, používají balíky odlišné přípony „svých“ souborů: jsou uchovávány v souborech s příponách *.BPL (Borland Package Library).

Stejně jako další knihovny, také balíky obsahují kód, který může být sdílen více aplikacemi (upřímně řečeno, existovalo by jen velmi málo důvodů pro používání balíků, kdyby tomu tak nebylo). Pro zajímavost: kde si myslíte, že jsou uloženy nejčastěji používané komponenty Delphi? Samozřejmě, v balíku, a to VCL50.BPL. VCL50 je čistě běhový balík. Zdálo by se tedy, že jakákoliv aplikace (používající komponenty, tedy opravdu jakákoliv:-)) potřebuje, aby na počítači, kde běží, byla tato knihovna k dispozici. To je logická úvaha, nicméně později si ukážeme, že lze nastavit takové vlastnosti projektu, které způsobí přilinkování potřebných údajů k výslednému *.EXE souboru (a v Delphi je navíc tato volba implicitně zapnutá). I kdybyste ale zvolili, že VCL50 se nemá linkovat k aplikaci, bude stačit na počítači jediná kopie této knihovny a ta postačí všem aplikacím, které obsahují nějaké VCL komponenty (a také samotnému Delphi), a to je obrovská výhoda balíků.

Když vyvíjíte aplikaci v Delphi, můžete používat balíky. Nemusíte, pokud nechcete. Ale můžete:-) Ale existuje jedna činnost, při které se bez nich neobejdete: pokud chcete přidat (doinstalovat) do Delphi vlastní komponentu, musíte ji instalovat jako návrhový balík, neexistuje jiná cesta.

Je asi skoro zbytečné dodávat, že můžete vytvářet své vlastní běhové i návrhové balíky.

Kdy používat balíky?

Po přečtení úvodních informací o balících vás možná trápí otázka, proč vlastně používat balíky, když stejné služby mohou zastat knihovny DLL. Ano, obecné doporučení zní zhruba takto:
  • naprogramujte balík, pokud chcete vytvořit vlastní komponentu, která má být k dispozici v integrovaném prostředí;
  • naprogramujte standardní knihovnu DLL, pokud vám jde jen o knihovnu funkcí, které mají být využitelné jakoukoliv aplikací Windows, bez ohledu na vývojový nástroj použitý k vývoji této aplikace.
Ať již jste s těmito doporučeními srozuměni nebo ne (jsou to v každém případě jen doporučení), věnujte nyní svou pozornost podrobnějšímu popisu jednotlivých druhů knihoven.

Běhové balíky

Typickým obsahem běhových balíků je jeden nebo více modulů (programových jednotek) s funkcemi, třídami, apod. Balík může obsahovat více těchto modulů (ostatně – jmenuje se „balík“, že…:-)) Balík je ve své podstatě jakási obálka více modulů (nebo i jen jednoho).

Běhové balíky se dostávají ke slovu v okamžiku, kdy aplikace běží. Aby vůbec běžet mohla, na počítači se musí nacházet (kromě jejího spustitelného souboru) také všechny běhové knihovny <.BPL), které potřebuje ke svému běhu. Nestačí ovšem, že knihovny na počítači jsou, důležité také je, kde jsou. Abychom pochopili tuto poplašnou zprávu, musíme si povědět, jakým způsobem se balíky při běhu aplikace vlastně používají.

Balíky jsou tzv. implicitně linkovanými knihovnami DLL, není tedy třeba psát explicitně žádné příkazy, aby se tyto knihovny přilinkovaly. Windows automaticky hledají (a zavádějí) všechny knihovny, které aplikace potřebuje, a to ještě před spuštěním oné aplikace! Toto je velmi důležitý bod, neboť z něj plynou klíčové závěry: pokud se knihovny mají linkovat před startem aplikace, nebude zřejmě příliš účinné uvádět umístění jejích knihoven někde v této aplikaci. Balíky tedy musí být „vyhledatelné“ samotným systémem Windows, a proto se musí nacházet někde v definovaném (systémovém) adresáři. Takových adresářů je typicky celá řada, ale nikdy se nespletete, pokud použijete WINDOWS\SYSTEM. (A zde leží mimochodem další z důvodů, proč nainstalované Windows permanentně a nekontrolovatelně kynou a kynou.)

Poznámka: adresář WINDOWS\SYSTEM je platný pouze v případě (implicitní instalace) Windows 98. Pro 32-bitové systémy (Windows NT, Windows 2000) je to adresář %SystemRoot%\SYSTEM32.

Podívejme se, jak říci aplikaci, že má ke svému běhu využívat běhový balík. Předpokládejme na chvíli, že máme k dispozici vytvořený běhový balík. Později si ukážeme, jak vlastní běhový balík vytvořit. Už jsme si řekli, že nejprve je vhodné zkopírovat soubor balíku <.BPL) do jednoho konkrétního systémového adresáře Windows - například přímo z aktuálního adresáře s balíkem za použití příkazu (samozřejmě do cílového adresáře musíme mít přístup pro zápis):

  pro Win9x:    copy  balik.bpl  %WinDir%\SYSTEM
  pro Win2k:    copy  balik.bpl  %SystemRoot%\SYSTEM32

Poznámka: systémový adresář vrací funkce WinAPI GetSystemDirectory() z jednotky Windows!

Co dělat dále?

  • Vytvořte novou aplikaci, která má využívat balíky (File – New Application).
  • Vyberte z hlavní nabídky Project – Options, zvolte kartu Packages. Otevře si dialog, který ukazuje obrázek:
  • Klepněte pro větší obrázek
  • Zaměřte se na pole „Runtime Packages“, neboť v něm se provádí manipulace s běhovými balíky. O něm nyní budeme chvíli teoretizovat:
Nastavení, která provedete, budou platit jen pro aplikaci, v jejímž rámci toto nastavování provádíte. Pokud chcete, aby tato nastavení měla význam ve všech dalších projektech, zaškrtněte políčko Default v pravém dolním rohu.

Abyste ale mohli cokoliv měnit, musíte nejprve zaškrtnout pole „Build with runtime packages“. Nyní se přepne editační pole do režimu „enabled“, a vy do něj můžete připisovat další balíky, případně z něj můžete ubírat stávající. Všimněte si, že není třeba zadávat cesty k souborům. Důvodem je právě to, že jde o běhové knihovny a jak bylo řečeno výše, tyto knihovny se musejí nacházet v takové lokaci, kde je Windows bez problémů najdou (přičemž Windows, když nenajdou knihovnu v aktuálním adresáři, tak prohledají adresáře podle aktuální systémové proměnné PATH). Nemusíte uvádět ani přípony souborů. Názvy jednotlivých balíků se oddělují středníky. V editačním poli jsou standardně uvedeny balíky, které jsou asociované s návrhovými balíky uvedenými v horní polovině dialogu (viz dále).

Chcete-li přidat další balík, můžete také stisknout tlačítko Add… Otevře se další dialog, viz obrázek:

Klepněte pro větší obrázek

V tomto dialogu můžete buď opět zadat název knihovny, nebo klepnout na Browse… a knihovnu najít. Ve druhém editačním poli (Search path) můžete změnit cesty, ve kterých se mají knihovny hledat.

Nyní ale přijdou asi dva nejdůležitější body celé této podkapitoly, protože bez nich se můžete dostat do problémů:

  • Pokud zaškrtnete políčko „Build with runtime packages“ (což musíte, pokud chcete ubírat a přidávat běhové knihovny), musí být všechny zadané knihovny na cílovém počítači! Aplikace se nerozběhne na počítači, kde se některá z těchto knihoven nenalézá! Výhodou ale bude značně menší velikost výsledného *.EXE souboru. Např. aplikace s formulářem a jedním tlačítkem, jehož stisk aplikaci ukončí, zabere na disku cca 14 kB. Naopak – nebude-li zmíněné políčko zaškrtnuté, nemusí být na cílovém počítači vůbec nic (snad kromě Windows:-)) a aplikace poběží, ale … ale velikost téhož spustitelného souboru bude skoro 300 kB. Pokud si tedy jste jisti, že na výsledném počítači budou přítomny potřebné knihovny (především VCL50, ale nejen ona), můžete zatrhnout „Build with runtime packages“ a ušetříte místo na disku.
  • I když vaše aplikace používá balíky, stále je nutné vložit jména použitých modulů do sekcí Uses zdrojových souborů aplikace. Příklad: máte běhový balík ABC, který obsahuje moduly A, B a C. Vaše aplikace hodlá využít funkce z modulů B a C. Musíte tedy ručně přidat do sekce Uses moduly B a C, a to i přesto, že výše uvedeným postupem stanovíte využívání běhového balíku ABC. Pokud to neučiníte, aplikace nepůjde ani přeložit, protože nebude „znát“ funkce z modulů B a C.
Poznámka pro pokročilé uživatele:

Pomocí funkce LoadPackage je možné načíst balík i za běhu aplikace, nicméně tato činnost již překračuje rámec tohoto seriálu.

Přehled modulů ve standardních běhových balících Delphi

Následující tabulka pro zajímavost uvádí, které standardní běhové balíky Delphi obsahují které moduly.

Balík Obsahuje moduly
VCL50.BPL Ax, Buttons, Classes, Clipbrd, Comctrls, Commctrl, Commdlg, Comobj, Comstrs, Consts, Controls, Ddeml, Dialogs, Dlgs, Dsgnintf, Dsgnwnds, Editintf, Exptintf, Extctrls, Extdlgs, Fileintf, Forms, Graphics, Grids, Imm, IniFiles, Isapi, Isapi2, Istreams, Libhelp, Libintf, Lzexpand, Mapi, Mask, Math, Menu, Messages, Mmsystem, Nsapi, Ole2I, Oleconst, Olectnrs, Olectrls, Oledlg, Penwin, Printers, Proxies, Registry, Regstr, Richedit, Shellapi, Shlobj, Stdctrls, Stdvcl, Sysutils, Tlhelp32, Toolintf, Toolwin, Typinfo, Vclcom, Virtintf, Windows, Wininet, Winsock, Winspool, Winsvc
VCLX50.BPL Checklst, Colorgrd, Ddeman, Filectrl, Mplayer, Outline, Tabnotbk, Tabs
VCLDB50.BPL Bde, Bdeconst, Bdeprov, Db, Dbcgrids, Dbclient, Dbcommon, Dbconsts, Dbctrls, Dbgrids, Dbinpreq, Dblogdlg, Dbpwdlg, Dbtables, Dsintf, Provider, SMintf
VCLDBX50.BPL Dblookup, Report
DSS50.BPL Mxarrays, Mxbutton, Mxcommon, Mxconsts, Mxdb, Mxdcube, Mxdssqry, Mxgraph, Mxgrid, Mxpivsrc, Mxqedcom, Mxqparse, Mxqryedt, Mxstore, Mxtables, Mxqvb
QRPT50.BPL Qr2const, Qrabout, Qralias, Qrctrls, Qrdatasu, Qrexpbld, Qrextra, Qrprev, Qrprgres, Qrprntr, Qrqred32, Quickrpt
TEE50.BPL Arrowcha, Bubblech, Chart, Ganttch, Series, Teeconst, Teefunci, Teengine, Teeprocs, Teeshape
TEEDB50.BPL Dbchart, Qrtee
TEEUI50.BPL Areaedit, Arrowedi, Axisincr, Axmaxmin, Baredit, Brushdlg, Bubbledi, Custedit, Dbeditch, Editchar, Flineedi, Ganttedi, Ieditcha, Pendlg, Pieedit, Shapeedi, Teeabout, Teegally, Teelisb, Teeprevi, Teexport
VCLSMP50.BPL Sampreg, Smpconst

Návrhové balíky

Tolik tedy k běhovým balíkům, nyní se budeme chvíli zabývat návrhovými balíky. Jak už bylo řečeno, návrhové balíky jsou využívány IDE. V naprosté většině případů obsahují editory vlastností komponent, průvodce, apod. Delphi samozřejmě obsahuje celou řadu standardních návrhových balíků, které jsou nabity – jak jinak – komponentami (viz tabulka):

Balík Odpovídající palety komponent
DCLSTD50.BPL Standard, Additional, System, Win32, Dialogs
DCLTEE50.BPL Additional (komponenta Chart)
DCLDB50.BPL Data Access, Data Controls
DCLMID50.BPL Data Access (MIDAS)
DCL31W50.BPL Win 3.1
DCLNET50.BPL
NMFAST50.BPL Internet
DCLSMP50.BPL Samples
DCLOCX50.BPL ActiveX
DCLQRT50.BPL QReport
DCLDSS50.BPL Decision Cube
IBSMP50.BPL Samples (komponenta IBEventAlerter)
DCLINT50.BPL (International Tools — průvodce Resource DLL)
RCEXPERT.BPL (Resource Expert)
DBWEBXPRT.BPL (Web Wizard)

Tyto návrhové balíky při své práci využívají některých běhových balíků (volají jejich funkce). Tím je řečeno, že balíky mohou mít mezi sebou definované závislosti. Později si ukážeme, kde se tyto závislosti definují. Pokud např. balík A potřebuje ke své činnosti nějakou funkci balíku B, bude knihovna B přilinkována i v případě, že ji sami explicitně neuvedete.

Stejně jako v případě běhových balíků, pojďme se i nyní podívat, jak nainstalovat návrhový balík. Tato činnost bude částečně podobná instalaci běhových balíků. Opět je nejprve nutné mít balík nakopírovaný na disk, nicméně již neplatí, že je nutné „zaplácnout“ jím systémový adresář. Není to ani příliš taktické, protože tyto knihovny budou používány pouze Delphi, takže se doporučuje spíše adresář DELPHI\BIN nebo podobný. Pokračujte následujícími kroky:

  • Opět vytvořte novou aplikaci a z hlavní nabídky vyberte Project – Options. Stejný dialog můžete otevřít také pomocí položky hlavní nabídky Component – Install Packages (pokud není zrovna otevřený žádný projekt, všechna nastavení, která provedete, budou považována za „default“). V každém případě zvolte kartu Packages.
  • Tentokrát se zaměřte na pole Design packages. To obsahuje seznam dostupných balíků. Chcete-li se podívat, které komponenty obsahuje některý z balíků, vyberte jej myší a klepněte na tlačítko Components. Otevře se okno s výčtem komponent, viz obrázek:
  • Klepněte pro větší obrázek
  • Chcete-li přidat další balík, klepněte na tlačítko Add… Otevře se standardní OpenDialog, najděte balík a potvrďte.
  • Chcete-li naopak některý z balíků odebrat, vyberte jej a klepněte na Remove.
Všimněte si, že u každého balíku je zobrazeno zatrhávací pole. To můžete použít v případě, že chcete/nechcete daný balík dočasně používat, ale zároveň nechcete, aby ze seznamu zmizel (pak by bylo nutné přidávat jej „standardně“ – pomocí Add…). Tím, že zrušíte zatržení některých balíků, redukujete množství komponent na paletě – vyzkoušejte si!

Poznámka: budete-li chtít zrušit zatržení u některého balíku, možná bude tento balík odkazován z jiných balíků a budete muset potvrdit i jejich odebrání. Při experimentování se vám také může stát, že vám prostě „zmizí“ formulář, nedejte se zmýlit, v aplikaci je stále přítomen (jen není vidět) a zobrazíte si jej např. přes hlavní menu View – Forms… Dejte si také pozor, abyste při pokusech měli otevřen nějaký (byť nový) projekt a abyste neměli zatrženo „Default“. Ne že by to byla velká katastrofa, ale vždy je vhodné myslet na zadní vrátka…:-)

Tolik tedy k popisu obou typů balíků. Pro dnešek bylo myslím všeho až dost, za týden se podíváme na poslední „maličkost“, která nám v této souvislosti zbývá: na vytváření vlastních balíků. Kromě toho si uvedeme, z jakých souborů se balík skládá.

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

V našem seriálu to není 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 odzkouš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.
Diskuze (9) Další článek: Delší zkušenosti s Pinnacle Studio DV

Témata článku: Software, Windows, Programování, Midas, Páčka, Remove, Editační funkce, Toto, Bubble, Delphi, Hlavní důvod, Komponenta, Aplikace, Balík, Výsledné dílo, Tito, Hlavní funkce, Cube, Knihovna, Spustitelný soubor, Pack, Díl, Browse, DSG, IED


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

Windy je laboratoř na počasí: 12 tipů, jak se ve službě vyznat a využít ji naplno

Windy je laboratoř na počasí: 12 tipů, jak se ve službě vyznat a využít ji naplno

** Předpověď počasí Windy nabízí nepřebernou škálu funkcí ** Zorientovat se v nich nemusí být vždy snadné ** Proto přinášíme 12 užitečných tipů a triků

Karel Kilián | 10

Za hranicemi Chromu: 13 nejzajímavějších prohlížečů, které „nikdo“ nepoužívá

Za hranicemi Chromu: 13 nejzajímavějších prohlížečů, které „nikdo“ nepoužívá

** Šesti nejpoužívanějším prohlížečům patří 94 % trhu ** Různé „klony“ Chromu slibují lepší funkce nebo jiný design ** Také Firefox má řadu zajímavých odnoží

Lukáš Václavík | 39

WindowsFX: Nainstalujte to mamce a taťkovi. Ani nepoznají, že to je Linux

WindowsFX: Nainstalujte to mamce a taťkovi. Ani nepoznají, že to je Linux

** Po dvou měsících tu máme další linuxovou kopii ** Tentokrát jde o imitaci Desítek ** Sestavili ji brazilští geekové nad Ubuntu

Jakub Čížek | 135

Vyrobíme si falešný Mac mini za tisícovku. Stačí Raspberry Pi a 3D tiskárna

Vyrobíme si falešný Mac mini za tisícovku. Stačí Raspberry Pi a 3D tiskárna

** Vyzkoušíme Raspberry Pi 4 s iRaspbianem ** Operační systém vypadá skoro jako macOS ** Vše strčíme do vlastní stylové krabice

Jakub Čížek | 31


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