Bonjour,
Quelle est la différence entre :et dans quel cas on les utilise ??Code:
1
2
3 Form:=TForm.Create(application); Form:=TForm.Create(Nil); Form:=TForm.Create(Self);
Merci pour votre aide!
Mina24.
Version imprimable
Bonjour,
Quelle est la différence entre :et dans quel cas on les utilise ??Code:
1
2
3 Form:=TForm.Create(application); Form:=TForm.Create(Nil); Form:=TForm.Create(Self);
Merci pour votre aide!
Mina24.
A lire TComponent.Create
Application, je l'utilise pour des fenêtres en mode SDI (Show), ou plusieurs fenêtre cohabitent simultanément, comme Delphi 7 ou le mode Flottant du DXE2
Je pourais aussi utiliser Application.MainForm, cela ne changerait pas grand chose !
Lors que tu ferme la fenêtre principale, cela va arrêter le programme, lorsque Application sera implicitement libéré, toutes les fenêtre ayant Application comme Owner seront libéré !
Self, c'est aussi dans un cas de SDI mais avec des fenêtres liées, j'ouvre une fenêtre A qui ouvre une fenêtre B et C avec A comme paramètre représenté par Self, quand je ferme A, cela fermer B et C automatiquement, pas de code !
C'est surtout utile, si tu ne connais pas le nombre de fenêtre qui peuvent s'ouvrir, si le nombre et le type est fixe, en général, mon destructeur va libérer explicitement ces fenêtres
nil, c'est toujours pour le ShowModal, comme ceci
qui revient àCode:
1
2
3
4
5
6
7
8 begin with TTrucForm.Create(nil) do try ShowModal(); finally Free(); end; end;
Inutile de mettre un Owner, je vais libérer propre derrière !Code:
1
2
3
4
5
6
7
8
9
10 var F: TForm; begin F := TTrucForm.Create(nil); try F.ShowModal(); finally F.Free(); end; end;
En plus mettre un Owner, cela implique la modification de la collection Components[] du Owner et d'autre élements sur la gestion des références publiées et de la propriété Name, c'est du temps de perdu pour rien !
On passe en paramètre du Create le Owner du composant (ici, une fiche).
Ce owner se charge de la libération de l'objet (sa destruction).
Donc, en première approche :
- nil si tu te charges du cycle création/destruction ;
- self si création dans une méthode d'un objet qui deviendra donc le propriétaire de l'objet et devra le libérer ;
- Application pour une fiche créée et/ou détruite automatiquement par l'appli
Regarde dans la TObjectList la propriété OwnsObjects qui charge la liste de libérer les objets qu'on lui ajoute : ça en fait une sorte de Garbage Collector si on ajoute à une telle liste tous les objets dont on doit synchroniser la destruction.
Bonjour,
Le paramètre du constructeur de TForm représente l'instance du composant qui va être propriétaire de la nouvelle instance créée. Ce qui veut dire, que c'est cet objet passé en paramètre qui va être chargé de libérer l'instance de ta TForm lorsque lui-même sera libéré. Donc dans tes exemple, cela va indiquer la durée de vie de ta form :
- Application est une instance de TApplication, elle est créée automatiquement par Delphi au démarrage de l'application, elle sera détruite à sa sortie. Donc dans ce cas la durée de vie de ta form est égale à la durée de vie de ton application.
- Self représente l'instance de l'objet auquel appartient ta méthode. Donc si tu précise Self, ta nouvelle form sera détruire en même temps que l'objet qui la créée et donc se durée de vie est intrinsèquement liée à celle de l'objet représenté par self.
- nil signifie que tu ne lui passe pas d'instance d'objet, ta form ne sera donc jamais détruire, sauf si tu le fait manuellement. Intéressant si tu veux controler précisément sa durée de vie En réalité il me semble que Windows libère de toute façon tous les objets lors du déchargement de l'application.
@++
Dany
oups, grillé :)
Merci beaucoup pour vos réponses!
1.Je serais tenté d'utiliser create(NIL) Pour contrôler la durée de vie de mes fiches car mes fenêtres ne cohabitent pas simultanément, Mais avec cette méthode(utilisation de NIL) si je ne libère pas ma fiche est ce qu'elle va être libéré automatiquement après avoir quitter l'application.
2. Aussi j'ai remarqué dans vos exemples que vous utilisez form.free pour libérer la forme mais moi j'utilise form.release . est ce que c'est la même chose??
Mina24.
Ne réfléchis pas que sur les TForm. Comme la dit Shai, la même mise en oeuvre s'applique à tout les descendants de TComponent.
Concernant ton dernier post:
1. Définir un propriétaire ne signifie pas que tu ne puisses plus la détruire manuellement. Prend-le plus comme une sécurité contre les fuites mémoires dans des applications à longue durée de vie. (s'il n'est pas égal à Application bien sûr)
Comme l'a signalé skywaukers, la mémoire du processus est de toute façon nettoyée à sa terminaison.
2. Release est un Free asynchrone. Le seul cas où Release est obligatoire est lorsque la fiche souhaite se détruire elle-même (dans l'un de ces événements). Perso je l'utilise très rarement.