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 :

différence entre Free, Release, Destroy et FreeAndNil


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut différence entre Free, Release, Destroy et FreeAndNil
    Bonjour


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    form := TForm2.Create(application);
    form.show;
    C'est quoi la différence si je fais à la suite

    pour libérer ma forme ?


    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Form.Free:
    libère l'objet Form.

    Form.Release:
    pour faire simple, envoie un message à l'objet Form pour qu'il se libère.

    Form.Destroy:
    on n'appelle jamais directement la méthode Destroy d'un objet, Destroy est appelé lors d'un Free.

    FreeAndNil(Form):
    correspond à Form.Free puis Form := nil

    Quant au meilleur choix, pour une Form j'utilise Release.

    @+ Claudius

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    n'avons nous pas déjà abordé le sujet ici ?

    sinon tu as tous les détails

  4. #4
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    oui mais j'en ai rajouté Release et Destroy , je vais emprunter ce livre d'un collège.

    Merci

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Free : s'assure d'une instance valide avant d'appeler Destroy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;

    release : envois un message pour notifier à TCustomForm de se libérer puis le gestionnaire de message CMRelease appel Free.
    Rien ne garantis la libération de l'objet via le message CM_RELEASE pouvant être intercepté et annulé, ce qui offre des avantages dans certains cas particulier mais n'est pas une méthode fiable pour libérer l'objet immédiatement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TCustomForm.Release;
    begin
      PostMessage(Handle, CM_RELEASE, 0, 0);
    end;
     
    procedure TCustomForm.CMRelease;
    begin
      Free;
    end;
    Close : procède à quelque verification et manipulation avant d'appeler Release, c'est de loin la méthode la plus propre pour fermer et libérer une fiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TCustomForm.Close;
    var
      CloseAction: TCloseAction;
    begin
      if fsModal in FFormState then
        ModalResult := mrCancel
      else
        if CloseQuery then
        begin
          if FormStyle = fsMDIChild then
            if biMinimize in BorderIcons then
              CloseAction := caMinimize else
              CloseAction := caNone
          else
            CloseAction := caHide;
          DoClose(CloseAction);
          if CloseAction <> caNone then
            if Application.MainForm = Self then Application.Terminate
            else if CloseAction = caHide then Hide
            else if CloseAction = caMinimize then WindowState := wsMinimized
            else Release;
        end;
    end;
    FreeAndNil : sauvegarde et mets l'instance d'un objet à nil puis libère ce dernier. Utiliser FreeAndNil n'est pas utile si l'on as pas besoin de remettre à nil la variable objet utilisé, notamment en fin de programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    Free : s'assure d'une instance valide avant d'appeler Destroy
    Pas tout à fait ! Free s'assure juste qu'une valeur soit assignée au pointer Self. Valide ou pas .
    Ce code se plante lamentablement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      V1 := TObject.Create;
      V2 := V1;
      V1.Free;
      V2.Free;
    Citation Envoyé par Dr.Who Voir le message
    release : envois un message pour notifier à TCustomForm de se libérer puis le gestionnaire de message CMRelease appel Free.
    Rien ne garantis la libération de l'objet via le message CM_RELEASE pouvant être intercepté et annulé, ce qui offre des avantages dans certains cas particulier mais n'est pas une méthode fiable pour libérer l'objet immédiatement.
    Son rôle est justement d'être asynchrone et ainsi de permettre à la fiche de se libérer elle-même.

  7. #7
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Quant au meilleur choix, pour une Form j'utilise Release.
    Moi au contrainre, je n'utilise jamais Release.
    Grosso modo, on rencontre deux cas d'utilisations :
    - Appel d'une fiche modale : On va commencer par instancier la fiche, on fait le ShowModal, on lit les résutlats, puis on détruit la fiche. On maîtrise parfaitement le cycle de vie de la fiche, donc on peut la créer et la détruire avec un beau try-finally, et un Free.
    - Appel d'une fiche non modale : Dans ce cas, on affiche la fenêtre et on la laisse vivre jusqu'à ce que l'utilisateur la ferme. Lorsque l'utilisateur a fermée la fiche, sauf cas exceptionnels, on ne l'utilisera plus. Autrement dit, c'est le Close qui entrainera la destruction de la fiche -> Action := caFree dans le FormClose ! Si on veut fermer la fiche par code, depuis un bouton de la fiche elle-même, il suffit alors de faire un Close.

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Hello

    Pour le cas d'une fiche modale je suis entièrement d'accord avec toi, j'utilise d'ailleurs régulièrement un Free. Aucun danger puisque l'on contrôle la durée de vie de la fiche.

    Pour le cas d'une fiche non modale, je suis également d'accord sur l'utilisation d'un caFree dans le FormClose. C'est une méthode parfaitement propre, même si je l'utilise rarement.
    Le seul danger réside dans l'utilisation d'un Free, si celui-ci est appelé (comme on le voit parfois) depuis la fiche elle-même: boom
    C'est pour cela que je préconise régulièrement l'utilisation de Release qui lui est sans danger.

    Mais chaque développeur a ses habitudes, et les deux méthodes se valent tout autant.

    @+

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/02/2013, 16h49
  2. Différence entre le mode Dbug et Release
    Par imad_eddine dans le forum Visual Studio
    Réponses: 9
    Dernier message: 15/09/2008, 20h40
  3. Différence entre Free et Destroy
    Par bubulemaster dans le forum Delphi
    Réponses: 16
    Dernier message: 30/05/2007, 17h39
  4. Différence entre mode release et mode debug
    Par WELCOMSMAIL dans le forum Visual C++
    Réponses: 1
    Dernier message: 06/11/2006, 10h20
  5. Différence entre deux lancements Release ??
    Par yetpa dans le forum MFC
    Réponses: 10
    Dernier message: 22/02/2006, 14h50

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