IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

ou utiliser Create Self,Nil,Application


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut ou utiliser Create Self,Nil,Application
    Bonjour,
    Quelle est la différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form:=TForm.Create(application);
    Form:=TForm.Create(Nil);
    Form:=TForm.Create(Self);
    et dans quel cas on les utilise ??
    Merci pour votre aide!


    Mina24.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
      with TTrucForm.Create(nil) do
      try
        ShowModal();
      finally
        Free();
      end;
    end;
    qui revient à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    Inutile de mettre un Owner, je vais libérer propre derrière !
    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 !

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 875
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    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.

  4. #4
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 306
    Points
    2 306
    Par défaut
    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é

  5. #5
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    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.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  2. Comment forcer l'utilisateur à n'utiliser qu'une seule application ?
    Par miko51 dans le forum Administration système
    Réponses: 1
    Dernier message: 02/10/2006, 09h40
  3. Utiliser les threads dans application Struts
    Par rach375 dans le forum Struts 1
    Réponses: 7
    Dernier message: 18/09/2006, 11h32
  4. "la webcam est utilisée par une autre application!" ah bon???
    Par cortex024 dans le forum Périphériques
    Réponses: 2
    Dernier message: 04/05/2006, 12h13
  5. Utilisation Mémoire d'une application
    Par scorplex dans le forum Composants VCL
    Réponses: 8
    Dernier message: 21/05/2005, 03h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo