TForm.Create (AOwner)

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

Konstruktor Create (AOwner: TComponent);

Der Parameter AOwner ist der Eigentümer des TForm-Objekts. Der Besitzer 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 gelöscht, wenn sein Besitzer gelöscht wird. 

Sie haben drei Möglichkeiten für den Parameter AOwner: 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 daher der Entwickler dafür verantwortlich ist, das erstellte Formular freizugeben (durch Aufrufen von myForm.Free, 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 in der OnClick-Prozedur einer Schaltfläche erstellen (wobei diese Schaltfläche in einer MainForm platziert wird), selbst verweist auf "MainForm". Wenn das MainForm freigegeben wird, wird es daher auch MyForm freigeben.
  • 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 wird, wenn der Benutzer das Formular schließt, verwenden Sie "nil" als Eigentümer:
    var myForm: TMyForm; begin myForm: = TMyForm.Create (Null); try myForm.ShowModal; endlich myForm.Free; Ende; Ende;
  2. Modelllose Formen. Verwenden Sie "Anwendung" als Eigentümer:
    var
    myForm: TMyForm;

    myForm: = TMyForm.Create (Anwendung);

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

Warum und wann wird TMyForm.Create (Application) NICHT empfohlen? Wenn es sich bei dem Formular um ein modales Formular handelt, das zerstört wird, müssen Sie dem Besitzer "nil" übergeben.

Sie könnten "Anwendung" übergeben, aber die Zeitverzögerung, die durch das Senden der Benachrichtigungsmethode an alle Komponenten und Formulare verursacht wird, deren Eigentümer oder indirekter Eigentümer die Anwendung ist, könnte sich als störend erweisen. Wenn Ihre Anwendung aus vielen Formularen mit vielen Komponenten (in Tausendern) besteht und das von Ihnen erstellte Formular über viele Steuerelemente (in Hunderten) verfügt, kann die Benachrichtigungsverzögerung erheblich sein.

Wenn Sie anstelle von "application" "nil" als Eigentümer übergeben, wird das Formular schneller angezeigt und der Code wird nicht anderweitig beeinflusst.

Wenn das zu erstellende Formular jedoch nicht modal ist und nicht aus dem Hauptformular der Anwendung erstellt wird, wird das erstellte Formular durch Schließen des Besitzers freigegeben, wenn Sie "self" als Besitzer angeben. Verwenden Sie "self", wenn Sie nicht möchten, dass das Formular seinen Ersteller überlebt.

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 Leistungs- und Code-Wartungsprobleme auftreten.

Wenn ein Benutzer in SDI-Anwendungen 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 Tips Navigator:
Msgstr "Vollständiges HTML von der TWebBrowser - Komponente abrufen
"Wie man Pixel in Millimeter umrechnet