Pokud používáte vkládání DB komponent přímo na formulář (třeba do DataModule), občas se může stát, že zapomenete nastaveno TDataSetxx.Active := True, což může velmi zpomalit start programu a mít další vedlejší efekty.
Když přejdu to, že si myslím, že je lepší vytvářet Db komponenty až za běhu (nebo aspoň mít vlastního následníka, v kterém úpravu provedeme) a ne v design modu, existuje možnost jak to vyřešit.
Mějme pro jednoduchost komponenty v DataModulu (budu uvažovat FireDAC Query). Před deklaraci DataModulu vložíme
type
TFDQuery = class (FireDac.Comp.Client.TFDQuery)
protected
procedure SetActive(Value:Boolean); override;
end;
pak dál pokračuje původní deklarace datamodulu nebo formuláře.
Dále někde do implementace pak vlastní trik:
procedure TFDQuery.SetActive(Value: Boolean);
begin
if (csReading in ComponentState) then
begin
inherited SetActive (False);
end
else
inherited SetActive(Value);
end;
V podstatě během nahrávání formuláře se uschovává hodnota Active, která se použije později až je formulář načten. Toho my využijeme a pokud je csReading (tedy čtení z dat formuláře) tak jednoduše vždy uchováme False, tj. dataset není otevřen.
Ale pořád si myslím, že ideálnější řešení je použít vlastní třídu, která dědí z používaných komponent a všechny DB objekty vytvářet až za běhu. Jednak vám to jednoduše změnit komponenty, až bude třeba a za druhé tak můžete jednodušeji zasahovat, případně opravovat jejich chyby a nemusíte řešit podobné věci co jsem teď ukazoval.