Delfi "problēma": TForm. Izveidot () - nulle, pats vai lietojumprogramma?

Kad jūs izveidojat Delphi objekti dinamiski kas manto no TControl, piemēram, TForm (attēlo formu / logu Delphi lietojumprogrammās), konstruktors “Izveidot” sagaida parametru “Īpašnieks”:

konstruktors Izveidot (AOwner: TComponent);

Parametrs AOwner ir objekta TForm īpašnieks. Veidlapas īpašnieks ir atbildīgs par veidlapas - t.i., formas piešķirtās atmiņas - atbrīvošanu pēc vajadzības. Veidlapa parādās tā īpašnieka masīvu komponentos, un tā tiek automātiski iznīcināta, kad tās īpašnieks tiek iznīcināts.

Parametram AOwner ir trīs izvēles iespējas: Nulle, sevi, un pieteikums.

Lai saprastu atbildi, vispirms jāzina "nulles", "sevis" un "pieteikuma" nozīme.

  • Nulle norāda, ka nevienam objektam nepieder forma, un tāpēc izstrādātājs ir atbildīgs par izveidotās formas atbrīvošanu (zvanot uz myForm. Bezmaksas, kad jums vairs nav vajadzīga veidlapa)
  • Es pats norāda objektu, kurā tiek izsaukta metode. Ja, piemēram, jūs izveidojat jaunu TMyForm veidlapas eksemplāru no pogas OnClick apstrādātāja (kur šī poga ir novietota uz MainForm),
    instagram viewer
    sevi attiecas uz "MainForm". Tādējādi, atbrīvojot MainForm, tā atbrīvos arī MyForm.
  • Pieteikums norāda globālo TApplication tipa mainīgo, kas izveidots, palaižot lietojumprogrammu. "Lietojumprogramma" iekapsulē jūsu lietojumprogrammu, kā arī nodrošina daudzas funkcijas, kas rodas programmas fonā.

Piemēri:

  1. Modālās formas. Veidojot veidlapu, kas tiek parādīta modāli un atbrīvota, kad lietotājs aizver veidlapu, izmantojiet “nulle” kā īpašnieku:
    var myForm: TMyForm; sākt myForm: = TMyForm. Izveidot (nulle); izmēģiniet myForm. ShowModal; beidzot myForm. Bezmaksas; beigas; beigas;
  2. Bezveidīgas formas. Izmantojiet lietojumprogrammu kā īpašnieku:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Izveidot (aplikācija);

Tagad, pārtraucot (izejot) no lietojumprogrammas, objekts “Application” atbrīvos “myForm” instanci.

Kāpēc un kad ir TMyForm. Izveidot (lietojumprogrammu) NAV ieteicams? Ja veidlapa ir modāla forma un tiks iznīcināta, īpašniekam jums jānodod "nulle".

Jūs varētu nokārtot "lietojumprogrammu", taču laika kavēšanās, ko izraisa paziņošanas metodes nosūtīšana katram komponentam un formai, kas pieder lietojumprogrammai vai netieši pieder tai, var izrādīties graujoša. Ja jūsu lietojumprogramma sastāv no daudzām formām ar daudziem komponentiem (tūkstošos) un jūsu veidotajai veidlapai ir daudz vadības ierīču (simtos), paziņojuma aizkave var būt ievērojama.

Piešķirot "nulle" kā īpašniekam, nevis "lietojumprogrammai", veidlapa parādīsies ātrāk un citādi neietekmēs kodu.

Tomēr, ja veidlapa, kas jums jāizveido, nav modāla un nav izveidota no lietojumprogrammas galvenās formas, tad, kad kā īpašnieku norādāt “pats”, īpašnieka aizvēršana izveidoto veidlapu atbrīvos. Izmantojiet "pats", ja nevēlaties, lai veidlapa pārsniegtu tās veidotāju.

Brīdinājums: Lai dinamiski padarītu Delphi sastāvdaļu un skaidri atbrīvotu to kaut kad vēlāk, vienmēr nokārtojiet "nulli" kā īpašnieku. To nedarot, var rasties nevajadzīgs risks, kā arī veiktspējas un koda uzturēšanas problēmas.

Iekšā SDI lietojumprogrammas, lietotājam aizverot veidlapu (noklikšķinot uz pogas [x]) forma joprojām pastāv atmiņā - tā tiek tikai paslēpta. MDI lietojumprogrammās MDI bērnu formas aizvēršana to tikai samazina.
OnClose pasākums nodrošina Darbība parametru (tipa TCloseAction) jūs varat izmantot, lai norādītu, kas notiek, kad lietotājs mēģina aizvērt formu. Iestatot šo parametru uz "caFree", veidlapa tiks atbrīvota.

Delphi padomu navigators:
»Iegūstiet pilnu HTML no TWebBrowser komponenta
«Kā pārvērst pikseļus milimetros

instagram story viewer