Delphi „problém“: TForm. Create () - Nil, Self alebo Application?

Keď vytvoríte Delphi objekty dynamicky ktoré zdedí od TControl, napríklad TForm (predstavujúci formulár / okno v aplikáciách Delphi), konštruktor „Create“ očakáva parameter „Owner“:

konštruktor Create (vlastník: TComponent);

Parameter AOwner je vlastníkom objektu TForm. Vlastník formulára je zodpovedný za uvoľnenie formulára - t. J. Pamäte pridelenej formulárom - v prípade potreby. Formulár sa objaví v poli Komponenty jeho vlastníka a pri zničení jeho vlastníka sa automaticky zničí.

Pre parameter AOwner máte tri možnosti: nula, ja, a prihláška.

Aby ste pochopili odpoveď, musíte najskôr poznať význam výrazu „nula“, „ja“ a „aplikácia“.

  • nula špecifikuje, že žiadny objekt nevlastní formulár, a preto je vývojár zodpovedný za uvoľnenie vytvoreného formulára (volaním myForm. Zdarma, keď už formulár nepotrebujete)
  • sám určuje objekt, v ktorom sa metóda volá. Ak napríklad vytvárate novú inštanciu formulára TMyForm zvnútra ovládača OnClick tlačidla (kde je toto tlačidlo umiestnené na MainForm), sám odkazuje na „MainForm.“ Keď sa teda uvoľní MainForm, uvoľní to aj MyForm.
  • instagram viewer
  • prihláška určuje globálnu premennú typu TApplication vytvorenú pri spustení aplikácie. „Aplikácia“ zapuzdruje vašu aplikáciu a poskytuje mnoho funkcií, ktoré sa vyskytujú na pozadí programu.

Príklady:

  1. Modálne formy. Keď vytvoríte formulár, ktorý sa má zobraziť modálne a uvoľniť, keď používateľ zatvorí formulár, použite ako vlastníka „nil“:
    var myForm: TMyForm; začať myForm: = TMyForm. vytvorenie (nula); skúste myForm. ShowModal; nakoniec myForm. Zadarmo; koniec; koniec;
  2. Modeless formy. Ako vlastník použite „Aplikácia“:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Vytvoriť (aplikácia);

Teraz, keď ukončíte (ukončíte) aplikáciu, objekt „Application“ uvoľní inštanciu „myForm“.

Prečo a kedy je TMyForm. Vytvoriť (aplikácia) NEDoporučuje sa? Ak je formulár modálnym formulárom a bude zničený, mali by ste majiteľovi odovzdať „žiadne“.

Mohli by ste prejsť „žiadosť“, ale časové oneskorenie spôsobené spôsobom oznámenia zaslaným do všetkých komponentov a formulárov, ktoré vlastní alebo nepriamo vlastní aplikácia, by sa mohlo ukázať ako rušivé. Ak vaša aplikácia pozostáva z mnohých formulárov s mnohými komponentmi (v tisícoch) a formulár, ktorý vytvárate, má veľa ovládacích prvkov (v stovkách), oneskorenie upozornení môže byť značné.

Zadanie nuly ako vlastníka namiesto „aplikácie“ spôsobí, že sa formulár objaví skôr, a inak to nebude mať vplyv na kód.

Ak však formulár, ktorý potrebujete vytvoriť, nie je modálny a nie je vytvorený z hlavného formulára aplikácie, potom, keď ako vlastníka zadáte „self“, zatvorením vlastníka sa vytvorený formulár uvoľní. Ak nechcete, aby formulár prežil svojho tvorcu, použite výraz „ja“.

Výstraha: Ak chcete dynamicky vytvoriť inštanciu Delphi a explicitne ju uvoľniť niekedy neskôr, ako vlastník vždy odovzdajte nulovú hodnotu. Ak tak neurobíte, môže to predstavovať zbytočné riziko, problémy s výkonom a údržbou kódu.

v Aplikácie SDI, keď užívateľ zatvorí formulár (kliknutím na tlačidlo [x]) formulár stále existuje v pamäti - iba sa skryje. V aplikáciách MDI zatvorenie podradeného formulára MDI iba minimalizuje.
onClose udalosť poskytuje akčné parameter (typu TCloseAction) môžete použiť na určenie toho, čo sa stane, keď sa používateľ pokúsi zatvoriť formulár. Nastavením tohto parametra na „caFree“ sa formulár uvoľní.

Navigátor tipov pre Delphi:
»Získajte kompletný HTML z komponentu TWebBrowser
«Ako previesť pixely na milimetre