Automatické vypnutí Active u následníka TDataset během nahrávání formuláře

vložil Radek Červinka 21. února 2016 22:10

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.

Tagy: ,

Praxe

Komentáře

23.2.2016 10:34:30 #

Stanislav Hruška

Ešte netreba zabudnúť na TFDConnection.Connected := True; Princíp je ten istý.

Stanislav Hruška

24.2.2016 10:03:44 #

Igor Gottwald

Pro Standu Hrušku: FireDAC komponenty mají šikovnou vlastnost ConnectedStoredUsage a ActiveStoredUsage, pomocí kterých můžete přesně toto chování ovládat. Takže například v návrhovém režimu si ponecháte příznak Active nebo Connected zapnutý, ale při běhu jej musíte zapnout kódem.

Igor Gottwald

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců