När du skapar Delphi objekt dynamiskt som ärver från TControl, till exempel en TForm (som representerar ett formulär / fönster i Delphi-applikationer), förväntar konstruktören "Skapa" en "Ägare" -parameter:
konstruktör Skapa (AOwner: TComponent);
Parametern AOwner äger TForm-objektet. Ägaren av formuläret ansvarar för att frigöra formuläret - dvs. minnet som tilldelats av formuläret - vid behov. Formuläret visas i komponentgruppen för dess ägare och det förstörs automatiskt när dess ägare förstörs.
Du har tre alternativ för AOwner-parametern: Noll, själv, och Ansökan.
För att förstå svaret måste du först veta betydelsen av "noll", "själv" och "Användning."
- Noll anger att inget objekt äger formuläret och därför är utvecklaren ansvarig för att frigöra det skapade formuläret (genom att ringa myForm. Gratis när du inte längre behöver formuläret)
- Själv anger det objekt som metoden heter. Om du till exempel skapar en ny instans av ett TMyForm-formulär inifrån en knapps OnClick-hanterare (där denna knapp placeras på en MainForm), själv hänvisar till "MainForm." Således, när MainForm frigörs, kommer det också att frigöra MyForm.
- Ansökan anger en global TApplication-typvariabel som skapas när du kör din applikation. "Application" kapslar in din applikation och tillhandahåller många funktioner som förekommer i programmets bakgrund.
Exempel:
- Modala former. När du skapar ett formulär som ska visas modellt och frigörs när användaren stänger formuläret använder du "nil" som ägare:
var myForm: TMyForm; börja myForm: = TMyForm. Skapa(noll); prova myForm. ShowModal; äntligen myForm. Fri; slutet; slutet;
- Modeless former. Använd "Application" som ägare:
var
myForm: TMyForm;
...
myForm: = TMyForm. Skapa (ansökan);
När du avslutar (avslutar) applikationen kommer objektet "Application" att frigöra instansen "myForm".
Varför och när är TMyForm. Skapa (ansökan) rekommenderas INTE? Om formuläret är en modal form och kommer att förstöras, ska du skicka "noll" för ägaren.
Du kan passera "ansökan", men tidsförseningen som orsakas av att anmälningsmetoden skickas till varje komponent och form som ägs eller indirekt ägs av applikationen kan visa sig vara störande. Om din ansökan består av många formulär med många komponenter (i tusentals), och det formulär du skapar har många kontroller (i hundratals), kan anmälningsförseningen vara betydande.
Att skicka "noll" som ägare istället för "ansökan" kommer att göra att formuläret visas förr och påverkar inte koden på annat sätt.
Men om formuläret du behöver skapa inte är modalt och inte skapas från programmets huvudformulär, när du anger "själv" som ägare, kommer ägarens stängning att frigöra det skapade formuläret. Använd "jag" när du inte vill att formen ska överleva sin skapare.
Varning: För att dynamiskt instansera en Delphi-komponent och uttryckligen frigöra den någon gång senare, passera alltid "nil" som ägare. Om du inte gör det kan det orsaka onödiga risker samt problem med prestanda och kodunderhåll.
I SDI-applikationer, när en användare stänger formuläret (genom att klicka på [x] -knappen) finns formen fortfarande i minnet - det blir bara dold. I MDI-applikationer minimerar det bara att stänga en MDI-underform.
De OnClose evenemang ger en Verkan parameter (av typen TCloseAction) som du kan använda för att specificera vad som händer när en användare försöker stänga formuläret. Om du ställer in denna parameter till "caFree" kommer formen att frigöras.
Delphi tipsnavigator:
»Hämta hela HTML-filen från TWebBrowser-komponenten
«Hur konverterar jag pixlar till millimeter