Delphi "probleem": TForm. Create () - Nil, Self of Application?

Wanneer je creëert Delphi objecten dynamisch die erven van TControl, zoals een TForm (die een formulier / venster vertegenwoordigt in Delphi-toepassingen), verwacht de constructeur "Create" een "Owner" -parameter:

constructor Create (AOwner: TComponent);

De AOwner-parameter is de eigenaar van het TForm-object. De eigenaar van het formulier is verantwoordelijk voor het vrijmaken van het formulier - d.w.z. geheugen dat door het formulier is toegewezen - indien nodig. Het formulier verschijnt in de Components-array van de eigenaar en wordt automatisch vernietigd wanneer de eigenaar wordt vernietigd.

U heeft drie keuzes voor de AOwner-parameter: Nihil, zelf, en toepassing.

Om het antwoord te begrijpen, moet u eerst de betekenis van "nihil", "zelf" en "Toepassing" kennen.

  • Nihil specificeert dat geen enkel object eigenaar is van het formulier en daarom is de ontwikkelaar verantwoordelijk voor het vrijmaken van het gemaakte formulier (door myForm aan te roepen. Gratis wanneer u het formulier niet meer nodig heeft)
  • instagram viewer
  • Zelf specificeert het object waarin de methode wordt aangeroepen. Als u bijvoorbeeld een nieuw exemplaar van een TMyForm-formulier maakt vanuit de OnClick-handler van een knop (waar deze knop op een MainForm wordt geplaatst), zelf verwijst naar "MainForm." Dus wanneer het MainForm wordt vrijgegeven, zal het ook MyForm vrijmaken.
  • Toepassing specificeert een globale variabele van het type TApplication die is gemaakt wanneer u uw toepassing uitvoert. "Applicatie" kapselt uw applicatie in en biedt vele functies die op de achtergrond van het programma voorkomen.

Voorbeelden:

  1. Modale vormen. Wanneer u een formulier maakt om modaal weer te geven en vrij te maken wanneer de gebruiker het formulier sluit, gebruikt u "nul" als eigenaar:
    var myForm: TMyForm; begin myForm: = TMyForm. Maken (nihil); probeer myForm. ShowModal; eindelijk myForm. Vrij; einde; einde;
  2. Modeloze vormen. Gebruik "Application" als de eigenaar:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Creëer (Applicatie);

Wanneer u nu de applicatie beëindigt (afsluit), zal het "Application" -object de "myForm" -instantie vrijmaken.

Waarom en wanneer is TMyForm. Maken (applicatie) NIET aanbevolen? Als het formulier een modaal formulier is en wordt vernietigd, moet u "nul" doorgeven aan de eigenaar.

U kunt 'toepassing' doorgeven, maar de vertraging die wordt veroorzaakt doordat de meldingsmethode wordt verzonden naar elk onderdeel en formulier dat eigendom is van of onrechtstreeks eigendom is van de toepassing, kan storend werken. Als uw toepassing uit vele formulieren met veel componenten bestaat (in de duizenden) en het formulier dat u maakt veel besturingselementen heeft (in de honderden), kan de meldingsvertraging aanzienlijk zijn.

Als u 'nul' als eigenaar opgeeft in plaats van 'toepassing', wordt het formulier eerder weergegeven en heeft dit geen invloed op de code.

Als het formulier dat u moet maken echter niet modaal is en niet is gemaakt vanuit het hoofdformulier van de toepassing, dan zal het sluiten van de eigenaar het gemaakte formulier vrijmaken wanneer u "zelf" als eigenaar opgeeft. Gebruik 'zelf' als u niet wilt dat het formulier de maker overleeft.

Waarschuwing: Als u een Delphi-component dynamisch wilt instantiëren en deze enige tijd later expliciet wilt vrijgeven, geeft u altijd "nul" op als eigenaar. Als u dit niet doet, kan dit onnodige risico's met zich meebrengen, evenals prestatie- en codeonderhoudsproblemen.

In SDI-toepassingen, wanneer een gebruiker het formulier sluit (door op de knop [x] te klikken), bestaat het formulier nog steeds in het geheugen - het wordt alleen verborgen. In MDI-toepassingen minimaliseert het sluiten van een MDI-child-formulier deze slechts.
De OnClose evenement biedt een Actie parameter (van het type TCloseAction) die u kunt gebruiken om op te geven wat er gebeurt wanneer een gebruiker probeert het formulier te sluiten. Als u deze parameter instelt op "caFree", wordt het formulier vrijgemaakt.

Delphi tips navigator:
»Haal de volledige HTML op van de TWebBrowser-component
«Hoe u pixels converteert naar millimeters

instagram story viewer