Mějme klasický kód, tj. vytvoříme dynamicky za běhu formulář a modálně ho zobrazíme.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
try
ShowModal;
finally
Free;
end;
end;
end;
Nepovažuji se za nejostřejší nůž v šuplíku a tudíž se možná pletu, ale je zde malé ale.
Jak všichni víme, constructor Create pro komponenty obsahuje parametr Owner: TComponent, tj. předáním existující komponenty jednoduše přehodíme odpovědnost za uvolnění nové komponenty na předanou komponentu. Tj. při uvolnění nadřazené (předané) komponenty, destruktor uvolní všechny vlastněné komponenty. Což je velmi vhodné využívat a považuji to za velmi geniální myšlenku.
Ale zpět k našemu případu. V příkladu předáváme Application. Destructor pro TComponent obsahuje následující kód:
if FOwner <> nil then FOwner.RemoveComponent(Self);
a v RemoveComponent je
procedure TComponent.RemoveComponent(AComponent: TComponent);
begin
ValidateRename(AComponent, AComponent.FName, '');
Notification(AComponent, opRemove);
AComponent.SetReference(False);
Remove(AComponent);
end;
Všimněte si řádku s Notification. Existuje spousta komponent, které naslouchají na Notification a provádějí všelijaké akce. V tomto případě úplně zbytečně.
Chci tím naznačit, že specifikovat vlastníka v případě, že sami uvolňujeme není zas až tak dobrý nápad. Nebo se pletu?
Mimochodem: dá se nějak zaručit, aby se při přepínání aplikací vždycky zobrazilo naše zobrazené modální okno (nebo hláška)? Už se mi v extrémních případech stalo, že nešel dialog vidět (po přepnutí).