Delphi "problem": TForm. Opprette () - Nil, Selv eller applikasjon?

Når du lager Delphi objekter dynamisk som arver fra TControl, for eksempel en TForm (som representerer et skjema / vindu i Delphi-applikasjoner), forventer konstruktøren "Opprett" en "Eier" -parameter:

konstruktør Create (AOwner: TComponent);

AOwner-parameteren er eieren av TForm-objektet. Eieren av skjemaet er ansvarlig for å frigjøre skjemaet - det vil si minnet som er tildelt av skjemaet - ved behov. Skjemaet vises i komponentgruppen til eieren, og det blir automatisk ødelagt når eieren blir ødelagt.

Du har tre valg for AOwner-parameteren: Nil, selv, og applikasjon.

For å forstå svaret, må du først vite betydningen av "null", "selv" og "applikasjon."

  • Nil spesifiserer at ingen objekt eier skjemaet, og derfor er utvikleren ansvarlig for å frigjøre det opprettede skjemaet (ved å ringe myForm. Gratis når du ikke lenger trenger skjemaet)
  • Selv spesifiserer objektet som metoden heter. Hvis du for eksempel oppretter en ny forekomst av en TMyForm-form fra innsiden av en knapps OnClick-handler (der denne knappen er plassert på en MainForm),
    instagram viewer
    selv- refererer til "MainForm." Når MainForm er frigjort, vil den dermed også frigjøre MyForm.
  • applikasjon spesifiserer en global variabel TA-applikasjonstype opprettet når du kjører applikasjonen. "Application" innkapsler applikasjonen din, samt gir mange funksjoner som oppstår i bakgrunnen av programmet.

eksempler:

  1. Modale former. Når du oppretter et skjema som skal vises modalt og frigjøres når brukeren lukker skjemaet, bruker du "nil" som eier:
    var myForm: TMyForm; begynn myForm: = TMyForm. Skape(nil); prøv myForm. ShowModal; endelig myForm. Gratis; slutt; slutt;
  2. Modeless former. Bruk "Søknad" som eier:
    Var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Opprett (applikasjon);

Når du avslutter (avslutter) applikasjonen, vil objektet "Application" frigjøre "myForm" -forekomsten.

Hvorfor og når er TMyForm. Opprette (applikasjon) IKKE anbefalt? Hvis skjemaet er en modal form og vil bli ødelagt, bør du gi "null" for eieren.

Du kan passere "søknad", men tidsforsinkelsen forårsaket av at varslingsmetoden ble sendt til alle komponenter og skjemaer som eies eller indirekte eies av applikasjonen, kan vise seg å være forstyrrende. Hvis søknaden din består av mange skjemaer med mange komponenter (i tusenvis), og skjemaet du oppretter har mange kontroller (i hundrevis), kan varselforsinkelsen være betydelig.

Hvis du passerer "null" som eier i stedet for "søknad", vil dette føre til at skjemaet vises tidligere, og vil ellers ikke påvirke koden.

Imidlertid, hvis skjemaet du trenger å opprette ikke er modalt og ikke opprettes fra programmets hovedskjema, vil når du angir "selv" som eier, frigjøre eieren det opprettede skjemaet. Bruk "selv" når du ikke vil at skjemaet skal leve ut skaperen.

Advarsel: For å dynamisere en Delphi-komponent og frigjøre den eksplisitt en gang senere, pass alltid "nil" som eier. Unnlatelse av å gjøre dette kan føre til unødvendig risiko, i tillegg til problemer med ytelse og kode.

I SDI-applikasjoner, når en bruker lukker skjemaet (ved å klikke på [x] -knappen) eksisterer skjemaet fortsatt i minnet - det blir bare skjult. I MDI-applikasjoner minimerer det bare å lukke en MDI-underform.
De OnClose arrangement gir en Handling parameter (av TCloseAction-typen) du kan bruke til å spesifisere hva som skjer når en bruker prøver å lukke skjemaet. Hvis du setter denne parameteren til "caFree", frigjør du skjemaet.

Delphi tipser navigatøren:
»Få full HTML fra TWebBrowser-komponenten
«Slik konverterer du piksler til millimeter

instagram story viewer