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 :

FicIni:=TIniFile.Create et FreeAndNil(FicIni)


Sujet :

Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut FicIni:=TIniFile.Create et FreeAndNil(FicIni)
    Bonjour à tous,

    Je me pose une question assez bête depuis que j'ai découvert la commande FreeAndNil.
    Je l'utilise chaque fois que je crée dynamiquement pour libérer la mémoire mais, dans le cadre de la création dynamique d'un fichier (.ini par exemple), est ce une bonne méthode?

    Voici ce que je fais, mais est ce correct pour un fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Var
       Repertoire:String;
       FicIni:TIniFile;
    begin
         Repertoire:=IncludeTrailingPathDelimiter(ExtractFileDir(Principal_CheminDossier));
         FicIni:=TIniFile.Create(Repertoire+Principal_AnneeTravail+'.ini');
         MaskEdit3.Text:=FicIni.ReadString('DOSSIER','DATE OUVERTURE','');
         MaskEdit4.Text:=FicIni.ReadString('DOSSIER','DATE CLOTURE','');
         FreeAndNil(FicIni);
    end;
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Le Free ou le FreeAndNil est nécessaire pour tout objet dont la libération n'est pas gérée par un autre objet.
    Il doit y avoir un article dans la FAQ qui traite de ces cas là (fait une rechercher sur Owner).

    Une bonne pratique est d'encadrer l'utilisation dans un try..finally

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FicIni:=TIniFile.Create(Repertoire+Principal_AnneeTravail+'.ini');
    try
         MaskEdit3.Text:=FicIni.ReadString('DOSSIER','DATE OUVERTURE','');
         MaskEdit4.Text:=FicIni.ReadString('DOSSIER','DATE CLOTURE','');
    finally
         FreeAndNil(FicIni);
    end;

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Ok, merci, donc, on peut utiliser le FreeAndNil en lieu et place de Free.
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    tu as quelques détails ici

    A+
    Charly

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Ok, merci, donc, on peut utiliser le FreeAndNil en lieu et place de Free.
    Oui. FreeAndNil passe la valeur de l'objet à Nil une fois l'espace mémoire libéré ce qui te permet de tester ton objet pour une utilisation ultérieure si ton objet est décrit comme global.

    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
     
    Var
       FicIni:TIniFile;
    implémentation
    ....
    Var
       Repertoire:String;
    begin
         Repertoire:=IncludeTrailingPathDelimiter(ExtractFileDir(Principal_CheminDossier));
        if FicIni = nil then
            FicIni:=TIniFile.Create(Repertoire+Principal_AnneeTravail+'.ini');
         MaskEdit3.Text:=FicIni.ReadString('DOSSIER','DATE OUVERTURE','');
         MaskEdit4.Text:=FicIni.ReadString('DOSSIER','DATE CLOTURE','');
    end;
     
    finalization
         FreeAndNil(FicIni);
    Dans certains cas comme JSON tu peux utiliser le DisposeOf

  6. #6
    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 : 54
    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 430
    Points
    28 430
    Par défaut
    juste une précision, FreeAndNil() a un intérêt bien particulier, il libère l'objet ET force la variable à nil.

    dans le cas de ton exemple, un FicIni.Free suffit puisque la variable locale FicIni ne sera plus jamais utilisée et sa valeur peut être différente de nil sans que cela pose problème.

    FreeAndNil est presque équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FicIni.Free;
      FicIni := nil;
    je dis "presque" car la méthode force la variable à nil avant d'appeler la méthode Free

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      tmp := FicIni;
      FicIni := nil;
      tmp.Free;
    dès lors, même si le destructor devait remonter une exception la variable serait malgré tout à nil.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. FreeAndnil(Form) ne fonctionne pas dans un create ?
    Par BuzzLeclaire dans le forum Langage
    Réponses: 2
    Dernier message: 13/11/2009, 16h34
  2. TColor et TIniFile
    Par metzger dans le forum Delphi
    Réponses: 11
    Dernier message: 17/06/2007, 17h42
  3. Database new user & create table
    Par MFDev dans le forum InterBase
    Réponses: 3
    Dernier message: 30/09/2003, 20h47
  4. unable to create INITIAL extent for segment in tablespace
    Par Ludolitaliano dans le forum Administration
    Réponses: 4
    Dernier message: 11/09/2003, 16h43
  5. TXMLModule.create - name = resource not found
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/03/2003, 10h54

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