TForm.Create (AOwner)

Lorsque vous créez dynamiquement des objets Delphi qui héritent de TControl, comme un TForm (représentant un formulaire / fenêtre dans les applications Delphi), le constructeur "Create" attend un paramètre "Owner":

constructeur Create (AOwner: TComponent);

Le paramètre AOwner est le propriétaire de l'objet TForm. Le propriétaire du formulaire est responsable de libérer le formulaire - c'est-à-dire la mémoire allouée par le formulaire - en cas de besoin. Le formulaire apparaît dans le tableau Composants de son propriétaire et il est détruit automatiquement lorsque son propriétaire est détruit. 

Vous avez trois choix pour le paramètre AOwner: Néant, soi, et application.

Pour comprendre la réponse, vous devez d'abord connaître la signification de «zéro», «soi» et «application».

  • Néant spécifie qu'aucun objet ne possède le formulaire et que le développeur est donc responsable de la libération du formulaire créé (en appelant myForm.Free lorsque vous n'avez plus besoin du formulaire)
  • Soi spécifie l'objet dans lequel la méthode est appelée. Si, par exemple, vous créez une nouvelle instance d'un formulaire TMyForm à partir du gestionnaire OnClick d'un bouton (où ce bouton est placé sur un MainForm), soi fait référence à "MainForm". Ainsi, lorsque le MainForm sera libéré, il libérera également MyForm.
  • Application spécifie une variable de type TApplication globale créée lorsque vous exécutez votre application. "Application" encapsule votre application et fournit de nombreuses fonctions qui se produisent en arrière-plan du programme.

Exemples:

  1. Formes modales. Lorsque vous créez un formulaire à afficher de façon modale et libéré lorsque l'utilisateur ferme le formulaire, utilisez "nil" en tant que propriétaire:
    var myForm: TMyForm; begin myForm: = TMyForm.Create (néant); essayez myForm.ShowModal; enfin myForm.Free; fin; fin;
  2. Formes sans modalité. Utilisez "Application" en tant que propriétaire:
    var
    myForm: TMyForm;

    myForm: = TMyForm.Create (Application);

Maintenant, lorsque vous fermez (quittez) l'application, l'objet "Application" libère l'instance "myForm".

Pourquoi et quand TMyForm.Create (Application) n'est-il PAS recommandé? Si le formulaire est un formulaire modal et sera détruit, vous devez passer "néant" pour le propriétaire.

Vous pouvez transmettre «application», mais le délai causé par l'envoi de la méthode de notification à chaque composant et formulaire appartenant ou appartenant indirectement à l'application peut s'avérer perturbateur. Si votre application se compose de plusieurs formulaires avec de nombreux composants (par milliers) et que le formulaire que vous créez comporte de nombreux contrôles (par centaines), le délai de notification peut être important..

Si vous passez "nil" en tant que propriétaire au lieu de "application", le formulaire apparaîtra plus tôt et n'affectera pas le code.

Cependant, si le formulaire que vous devez créer n'est pas modal et n'est pas créé à partir du formulaire principal de l'application, lorsque vous spécifiez "self" en tant que propriétaire, la fermeture du propriétaire libérera le formulaire créé. Utilisez "self" lorsque vous ne voulez pas que le formulaire survive à son créateur.

avertissement: Pour instancier dynamiquement un composant Delphi et le libérer explicitement un peu plus tard, passez toujours "nil" en tant que propriétaire. Ne pas le faire peut entraîner des risques inutiles, ainsi que des problèmes de performances et de maintenance du code.

Dans les applications SDI, lorsqu'un utilisateur ferme le formulaire (en cliquant sur le bouton [x]), le formulaire existe toujours dans la mémoire - il est seulement masqué. Dans les applications MDI, la fermeture d'un formulaire enfant MDI ne fait que le réduire.
le OnClose l'événement fournit un action paramètre (du type TCloseAction) que vous pouvez utiliser pour spécifier ce qui se produit lorsqu'un utilisateur tente de fermer le formulaire. Régler ce paramètre sur "caFree" libérera le formulaire.

Navigateur de conseils Delphi:
"Obtenez le code HTML complet du composant TWebBrowser
"Comment convertir des pixels en millimètres