Delphi "Problem": TForm. Create () - Null, Selbst oder Anwendung?

Wenn Sie erstellen Delphi-Objekte dynamisch Der Konstruktor "Create", der von TControl erbt, z. B. eine TForm (die ein Formular / Fenster in Delphi-Anwendungen darstellt), erwartet einen "Owner" -Parameter:

Konstruktor Create (AOwner: TComponent);

Der Parameter AOwner ist der Eigentümer des TForm-Objekts. Der Eigentümer des Formulars ist dafür verantwortlich, das Formular - d. H. Den vom Formular zugewiesenen Speicher - bei Bedarf freizugeben. Das Formular wird im Komponenten-Array seines Besitzers angezeigt und automatisch zerstört, wenn sein Besitzer zerstört wird.

Sie haben drei Möglichkeiten für den AOwner-Parameter: Null, selbst, und Anwendung.

Um die Antwort zu verstehen, müssen Sie zuerst die Bedeutung von "Null", "Selbst" und "Anwendung" kennen.

  • Null Gibt an, dass kein Objekt das Formular besitzt und der Entwickler daher für die Freigabe des erstellten Formulars verantwortlich ist (durch Aufrufen von myForm. Kostenlos, wenn Sie das Formular nicht mehr benötigen)
  • Selbst Gibt das Objekt an, in dem die Methode aufgerufen wird. Wenn Sie beispielsweise eine neue Instanz eines TMyForm-Formulars im OnClick-Handler einer Schaltfläche erstellen (wobei diese Schaltfläche in einer MainForm platziert ist),
    instagram viewer
    selbst bezieht sich auf "MainForm". Wenn die MainForm freigegeben wird, wird auch MyForm freigegeben.
  • Anwendung Gibt eine globale Variable vom Typ TApplication an, die beim Ausführen Ihrer Anwendung erstellt wird. "Anwendung" kapselt Ihre Anwendung und bietet viele Funktionen, die im Hintergrund des Programms auftreten.

Beispiele:

  1. Modale Formen. Wenn Sie ein Formular erstellen, das modal angezeigt und freigegeben werden soll, wenn der Benutzer das Formular schließt, verwenden Sie "nil" als Eigentümer:
    var myForm: TMyForm; begin myForm: = TMyForm. Erstellen(Null); versuche myForm. ShowModal; endlich myForm. Kostenlos; Ende; Ende;
  2. Modeless Formen. Verwenden Sie "Anwendung" als Eigentümer:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Erstellen (Anwendung);

Wenn Sie nun die Anwendung beenden (beenden), gibt das Objekt "Application" die Instanz "myForm" frei.

Warum und wann ist TMyForm. Erstellen (Anwendung) NICHT empfohlen? Wenn das Formular ein modales Formular ist und zerstört wird, sollten Sie "nil" für den Eigentümer übergeben.

Sie könnten "Anwendung" übergeben, aber die Zeitverzögerung, die durch das Senden der Benachrichtigungsmethode an jede Komponente und jedes Formular verursacht wird, das der Anwendung gehört oder indirekt gehört, kann sich als störend erweisen. Wenn Ihre Anwendung aus vielen Formularen mit vielen Komponenten (zu Tausenden) besteht und das von Ihnen erstellte Formular viele Steuerelemente (zu Hunderten) enthält, kann die Benachrichtigungsverzögerung erheblich sein.

Wenn Sie "nil" anstelle von "application" als Eigentümer übergeben, wird das Formular früher angezeigt und wirkt sich ansonsten nicht auf den Code aus.

Wenn das zu erstellende Formular jedoch nicht modal ist und nicht aus dem Hauptformular der Anwendung erstellt wird, wird durch Schließen des Eigentümers das erstellte Formular freigegeben, wenn Sie als Eigentümer "self" angeben. Verwenden Sie "self", wenn das Formular seinen Ersteller nicht überleben soll.

Warnung: Um eine Delphi-Komponente dynamisch zu instanziieren und später explizit freizugeben, übergeben Sie immer "nil" als Eigentümer. Andernfalls können unnötige Risiken sowie Probleme mit der Leistung und der Codewartung entstehen.

Im SDI-AnwendungenWenn ein Benutzer das Formular schließt (durch Klicken auf die Schaltfläche [x]), ist das Formular noch im Speicher vorhanden - es wird nur ausgeblendet. In MDI-Anwendungen wird das Schließen eines untergeordneten MDI-Formulars nur minimiert.
Das OnClose Veranstaltung bietet eine Aktion Mit dem Parameter (vom Typ TCloseAction) können Sie angeben, was passiert, wenn ein Benutzer versucht, das Formular zu schließen. Wenn Sie diesen Parameter auf "caFree" setzen, wird das Formular freigegeben.

Delphi Tipps Navigator:
»Holen Sie sich den vollständigen HTML-Code aus der TWebBrowser-Komponente
«So konvertieren Sie Pixel in Millimeter