Delphi od nějaké verze 3 podporují balíčky (packages). Jedná se o speciální DLL, které podporují speciální vlastnosti Delphi a jejich RTL (tj. zachování objektového modelu, sdílení správce paměti, bezproblémové operace s řetězci a dynamickými poli atd.). Použití balíčků umožňuje velkou modularitu.
Základem je rozmyslit si co bude základní aplikace a co bude v balíčku. Podobné problematice jsem se už věnoval v článcích o DLL a spol.
Dejme tomu, že v balíčku budeme mít formulář a ten budeme dynamicky zavádět a zobrazovat modálně.
Nastavil jsem jak u Project1.exe, tak u balicek.bpl že budou záviset na základních balíčcích Delphi (rtl a vcl, v mém případě rtl150.bpl a vcl150.bpl), tj. tyto soubory se musejí přidat k výsledné aplikaci.
Nyní do balicek.bpl přidejte co potřebujete, v mém případě formulář TForm2 s tlačítkem a zobrazením informace. Důležité: je nutné provést registraci a odregistraci třídy formuláře:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
Toto nám umožní jednoduše vyhledat náš formulář v balíčku.
V hlavní aplikaci nyní jen doplníme kód:
procedure TForm1.btn1Click(Sender: TObject);
var
Module: HModule;
AClass: TPersistentClass;
begin
Module := LoadPackage('balicek.bpl');
if Module <> 0 then
begin
AClass := GetClass('TForm2');
if AClass <> nil then
with TCustomFormClass(AClass).Create(Application) do
begin
try
ShowModal;
finally
Free;
end;
end;
UnloadPackage(Module);
end;
end;
Klíčem je funkce GetClass z Classes nebo FindClass ze stejné jednotky, která vrátí třídu pokud existuje (resp. byla zaregistrována). V případě úspěchu pak se jen vytvoří instance třídy.
Zajímavá je situace, kdy přímo hlavní aplikaci přeložíme s podporou pro balicek.bpl.
Nyní můžeme přímo napsat
uses
Form2;
procedure TForm1.btn2Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
ShowModal;
Free;
end;
end;
A tím Delphi při startu zavedou náš balíček "balicek.bpl". Výhodou je opět modularizace, kdy se při překladu balíček nemusí překládat.
Nezapomeňte, že novější Delphi umožňují pojmenovávat jednotky strukturovaně, tj. např. DelphiCZ.Framework.Core a i výsledný bpl může mít podobný název.
Další zdroje: Dynamic packages in Delphi.
Existoval i druhý díl, ale úplně zmizel z webu a našel jsem ho jen přes WayBackMachine - tak jsem z něho udělal PDF: Advanced Dynamic Packages - Vino Rodrigues