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

Langage Delphi Discussion :

Récuperer la valeur retournée d'une fonction.


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut Récuperer la valeur retournée d'une fonction.
    Bonjour a tous,
    j'ai un probleme avec TStringList; avec une fonction que voici :
    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
    function pModeReglement:TStringList;
    var List:TStringList;
    begin
     with TFChoixReglement.Create(Application) do begin
      ShowModal;
      List:=TStringList.Create;
      List.Clear;
      try
      if ModalResult=mrOk then begin
       List.Add(ComboBox1.Text);
       List.Add(Edit1.Text);
      end;
      Result:=List;
      finally
      List.Free;
      Free;
      end;
     end; 
    end;
    je recupere la valeur de la fonction de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var vList:TStringList;
    .../...
     vList:=TStringList.Create;
     vList.Clear;
     vList.AddStrings(pModeReglement);
    Eh bien, ça ne marche pas, ni avec :Ai-je raté un truc ?
    Si vous êtes libre, choisissez le Logiciel Libre.

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Ceci est tout à fait normal, la liste est créée en variable locale, et donc libérée à la sortie de ta fonction -> au moment du addstring, la liste est inexistante.

    Une autre solution, est non pas de retourner un TStringList, mais de passer ta 'vList' en paramètre de pModeReglement, et d'y ajouter les éléments correspondant.

    du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure pModeReglement( vList: TStringList );
    begin
      ...
      vList.Add( ComboBox1.Text );
      vList.Add( Edit1.Text );
      ...
    end;
     
    // et l'appel:
    var vList:TStringList;
    .../...
     vList:=TStringList.Create;
     vList.Clear; // <-- inutile d'ailleurs vu que la liste vient d'être créée
     pModeReglement( vList )
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  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 : 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
    Citation Envoyé par TicTacToe
    Ceci est tout à fait normal, la liste est créée en variable locale, et donc libérée à la sortie de ta fonction -> au moment du addstring, la liste est inexistante.
    PARDON ?

    Non le seul problème dans son code est le "List.Free" qui fait que l'objet retourné a été détruit !

    le "Result:=List" ne fait que recopier le pointer d'instance, les classes delphi ne sont pas statiques, donc Result et List sont le même objet qu'il ne faut surtout pas libérer.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Doucement doucement

    Il y a plusieurs solutions à ce problème Paul TOTH.

    Evidemment, on peut éviter de désallouer la liste dans la fonction appelée, cela fonctionne et c'est une solution.

    Pour ma part, j'aime bien que les allocations/désallocations soient symétriques.
    C'est pour cela que je préconisais de pas allouer une 2eme liste dans la fonction appelée, mais simplement de passer en paramètre la liste initiale.
    -> ainsi l'allocation/désallocation de la liste est gérée par l'appelant.

    Citation Envoyé par Paul TOTH
    le "Result:=List" ne fait que recopier le pointer d'instance, les classes delphi ne sont pas statiques, donc Result et List sont le même objet qu'il ne faut surtout pas libérer.
    De plus, tu as raison, ceci effectue une copie de la référence de la liste, mais... référence qui est détruite de manière locale dans la fonction appelée.
    Ainsi, dans la fonction appelante, le résultat pointe vers le no man's land en mémoire -> c'est pourquoi cela ne fonctionne pas.

    La solution de ne pas désallouer la liste créée par la fonction appelée, doit donc être détruite par la fonction appelante... je trouve juste cela moyen
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  5. #5
    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
    Citation Envoyé par TicTacToe
    La solution de ne pas désallouer la liste créée par la fonction appelée, doit donc être détruite par la fonction appelante... je trouve juste cela moyen
    ben tout dépend de ce que tu veux faire, mais je ne trouve rien de choquant dans son code.

    imagine :
    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
     
    function StringListFromFile(const FileName:string):TStringList;
    begin
     Result:=TStringList.Create;
     if FileExist(Path1+FileName) then
      Result.LoadFromFile(Path1+FileName)
     else
     if FileExist(Path2+FileName) then
      Result.LoadFromFile(Path2+FileName);
    end;
     
    var
     l1,l2:TStringList;
    begin
     l1:=StringListFromFile('file1.txt');
     l2:=StringListFromFile('file2.txt');
     ...
     l1.free;
     l2.free;
    end;
    je ne trouve pas que l'autre solution soit plus élégante
    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
     
    procedure StringListFromFile(List:TStringList; const FileName:string);
    begin
     if FileExist(Path1+FileName) then
      List.LoadFromFile(Path1+FileName)
     else
     if FileExist(Path2+FileName) then
      List.LoadFromFile(Path2+FileName);
    end;
     
    var
     l1,l2:TStringList;
    begin
     l1:=TStringList.Create;
     l2:=TStringList.Create;
     StringListFromFile(l1,'file1.txt');
     StringListFromFile(l2,'file2.txt');
     ...
     l1.free;
     l2.free;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Et je fait quoi moi ?

    C'est vrai que le fait de ne pas détruire la liste(List) dans la fonction alors qu'elle est créer dans celle-ci, me gène plutôt.
    J'aurais tendence a préférer la solution de la procedure de TicTacToe, même si toutes les solutions se valent.
    vList.Clear; // <-- inutile d'ailleurs vu que la liste vient d'être créée.
    En fait, j'ai peur que la list ne prenne des valeurs aléatoire a sa création.
    Si vous êtes libre, choisissez le Logiciel Libre.

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par TryExceptEnd
    En fait, j'ai peur que la list ne prenne des valeurs aléatoire a sa création.
    Eh bien n'aie plus peur. Une string list nouvellement créée est toujours vide, sans exception. Et il n'y a pas de valeurs aléatoires qui traînent
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par sjrd
    Eh bien n'aie plus peur. Une string list nouvellement créée est toujours vide, sans exception. Et il n'y a pas de valeurs aléatoires qui traînent
    Peur ? façon de parler, bien-sûr.
    Merci pour la précision.
    Si vous êtes libre, choisissez le Logiciel Libre.

  9. #9
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Je pense qu'il vaut mieux passer ta liste en paramètre sans allouer une liste interne à ta fonction. Le problème réside dans le fait que l'instance de TStringList est créée localement, ta fonction se comporte en quelque sorte comme un constructeur et l'objet instancié devrait donc être libéré dans l'appelant.
    Ceci n'est bien sûr pas une règle absolue, mais selon les infos que tu nous transmets j'aurais tendance à préférer le code suivant :
    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
     
    procedure pModeReglement(List:TStrings);
    begin
      with TFChoixReglement.Create(Application) do 
      begin
        ShowModal;
        try
          if ModalResult=mrOk then
          begin
            List.Add(ComboBox1.Text);
            List.Add(Edit1.Text);
          end;
        finally
          Release; // préférable à Free
        end;
      end; 
    end;
    et dans le code appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var 
      vList:TStringList;
    .../...
     vList:=TStringList.Create;
     vList.Clear;
     pModeReglement(vList);
    ce qui évite aussi une allocation et une libération d'objet, ici superflues.
    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #10
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par e-ric
    Salut

    Je pense qu'il vaut mieux passer ta liste en paramètre sans allouer une liste interne à ta fonction. Le problème réside dans le fait que l'instance de TStringList est créée localement, ta fonction se comporte en quelque sorte comme un constructeur et l'objet instancié devrait donc être libéré dans l'appelant.
    Ceci n'est bien sûr pas une règle absolue, mais selon les infos que tu nous transmets j'aurais tendance à préférer le code suivant :
    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
     
    procedure pModeReglement(List:TStrings);
    begin
      with TFChoixReglement.Create(Application) do 
      begin
        ShowModal;
        try
          if ModalResult=mrOk then
          begin
            List.Add(ComboBox1.Text);
            List.Add(Edit1.Text);
          end;
        finally
          Release; // préférable à Free
        end;
      end; 
    end;
    et dans le code appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var 
      vList:TStringList;
    .../...
     vList:=TStringList.Create;
     vList.Clear;
     pModeReglement(vList);
    ce qui évite aussi une allocation et une libération d'objet, ici superflues.
    cdlt
    C'est ce qu'a proposé TicTacToe, j'ai une autre proposition a soumettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function pModeReglement:TStringList;
    begin
     with TFChoixReglement.Create(Application) do begin
      ShowModal;
      Result:=TStringList.Create;
      try
      if ModalResult=mrOk then begin
       Result.Add(ComboBox1.Text);
       Result.Add(Edit1.Text);
      end;
      finally
       Free;
      end;
     end;
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var 
      vList:TStringList;
    .../...
    vList:=TStringList.Create;
     vList:=pModeReglement;
    Je me demande quel est le sort de la liste ainsi crée (dans la fonction) aprés son utilisation ?
    Si vous êtes libre, choisissez le Logiciel Libre.

  11. #11
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Il n'y a pas de soucis, ca marche aussi

    C'est exactement ta toute 1ere solution sans le Free, et sans variable intermédiaire représentant ta liste locale, mais c'est tout rien de plus
    -> et attention donc a faire une désallocation de la liste après l'appel de ta fonction.

    Enfin, si je puis me permettre, dans ton cas précis, inutile d'allouer 2 fois une liste, de recopier une liste dans une autre etc...
    La passage de la liste en paramètre simplifie le code (plus de create à gérer dans la fonction appelée), et (à mon sens) est plus logique et rapide.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  12. #12
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Merci TicTac...
    Citation Envoyé par TicTacToe
    Il n'y a pas de soucis, ca marche aussi

    C'est exactement ta toute 1ere solution sans le Free, et sans variable intermédiaire représentant ta liste locale, mais c'est tout rien de plus
    -> et attention donc a faire une désallocation de la liste après l'appel de ta fonction.
    Comment faire la libération de la liste dans la fonction appelante ? par un : J'ai essayé et ça fait un appel a la fonction un 2eme fois !

    Enfin, si je puis me permettre, dans ton cas précis, inutile d'allouer 2 fois une liste, de recopier une liste dans une autre etc...
    La passage de la liste en paramètre simplifie le code (plus de create à gérer dans la fonction appelée), et (à mon sens) est plus logique et rapide.
    C'est sûrement vrai, mais on ne veut faire qu'a notre tête, comme tout les developpeurs
    Si vous êtes libre, choisissez le Logiciel Libre.

  13. #13
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Il ne faut pas perdre de vu que pModeReglement est une fonction. Si tu l'inscris 2 fois dans le code, elle sera appelée 2 fois.

    Pour libérer la liste allouée dans pModeReglement,
    Lors de l'appel il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      MaListe: TStringList;
    begin
      MaListe := pModeReglement;
      // utilisation de MaListe...
      MaListe.Free;
    comme l'a montré Paul Toth
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  14. #14
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Je crois que je me suis mal exprimé, je voulais dire en fait comment libérer la liste créer (par Result:=TStringList.Create) dans la fonction (pModeReglemnt) après l'appelle de cette fonction;
    Etant donnée que cette liste n'est pas libérée dans la fonction (pModeReglement) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function pModeReglement:TStringList;
    begin
     with TFChoixReglement.Create(Application) do begin
      ShowModal;
      Result:=TStringList.Create;// Liste créer mais non libéré dans cette fonction
      try
      if ModalResult=mrOk then begin
       Result.Add(ComboBox1.Text);
       Result.Add(Edit1.Text);
      end;
      finally
       Free;
      end;
     end;
    Courage, on y arriveras.
    Si vous êtes libre, choisissez le Logiciel Libre.

  15. #15
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Euh ben exactement comme TicTacToe l'a écrit dans son dernier message.

    Où est le problème ?
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  16. #16
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour

    Les objets en Delphi se manipulent par pointeur (par "référence" si tu préfères) et sont alloués dans le tas. Donc plusieurs variables peuvent pointer vers un même objet, mais aussi vers aucun (= nil), vers une zone invalide (l'objet a été détruit, ex: par free) et des objets inaccessibles peuvent subsister dans le tas (on a oublié de les libérer -> fuites mémoires).

    Ainsi dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vList:TStringList;
    .../...
    vList:=TStringList.Create;
    vList:=pModeReglement;
    Une TStringList est créée par vList:=TStringList.Create; mais sa référence est perdu à la ligne suivante vList:=pModeReglement; (remplacée par la référence d'un autre objet) et ne peut plus être désalloué (sauf si tu fait du Delphi.Net mais je ne crois pas ).

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 182
    Points : 1 853
    Points
    1 853
    Par défaut
    Citation Envoyé par TryExceptEnd
    C'est ce qu'a proposé TicTacToe, j'ai une autre proposition a soumettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function pModeReglement:TStringList;
    begin
     with TFChoixReglement.Create(Application) do begin
      ShowModal;
      Result:=TStringList.Create;
      try
      if ModalResult=mrOk then begin
       Result.Add(ComboBox1.Text);
       Result.Add(Edit1.Text);
      end;
      finally
       Free;
      end;
     end;
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var 
      vList:TStringList;
    .../...
    vList:=TStringList.Create;
     vList:=pModeReglement;
    Je me demande quel est le sort de la liste ainsi crée (dans la fonction) aprés son utilisation ?
    La liste de la fonction est affectée a vList, et sera libérée avec vList.Free ; par contre avant cette affectation, vList contenait déjà une instance de Tstringlist, à cause de vList:=TStringList.Create; comme indiqué par gb_68.

    Cette première instance ne sera jamais libérée. C'est un cas typique d'une fuite mémoire souvent difficile à identifier. Donc une construction à éviter absolument.

    Bruno
    mon blog - mon site web

  18. #18
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par bruno Orsier
    La liste de la fonction est affectée a vList, et sera libérée avec vList.Free ; par contre avant cette affectation, vList contenait déjà une instance de Tstringlist, à cause de vList:=TStringList.Create; comme indiqué par gb_68.

    Cette première instance ne sera jamais libérée. C'est un cas typique d'une fuite mémoire souvent difficile à identifier. Donc une construction à éviter absolument.
    Voila la réponse que j'attendais et que j'appréhendais, la liste crée dans la fonction ne serait pas libérée.
    Donc,il y a bien une seule solution valable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure pModeReglement(sList:TStringList);
    begin
     with TFChoixReglement.Create(Application) do begin
      ShowModal;
      try
      if ModalResult=mrOk then begin
       sList.Add(ComboBox1.Text);
       sList.Add(Edit1.Text);
      end;
      finally
      Free;
      end;
     end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     var vList:TStringList;
    .../...
     vList:=TStringList.Create;
     try
     pModeReglement(vList);
     .../...
     finally
      vList.Free;
     end;
    Merci a tous.
    Si vous êtes libre, choisissez le Logiciel Libre.

  19. #19
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Problème résolu ?

    -> alors un clic sur
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 182
    Points : 1 853
    Points
    1 853
    Par défaut
    Citation Envoyé par TryExceptEnd
    Voila la réponse que j'attendais et que j'appréhendais, la liste crée dans la fonction ne serait pas libérée.
    je pinaille surement, mais la liste créée dans la fonction sera bien libérée, c'est la 1ère liste qui sera perdue. En simplifiant au maximum,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vList := TStringList.Create ; // référence qui sera perdue
    vList := TStringList.Create ;
    vList.Free ;
    B.
    mon blog - mon site web

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 2
    Dernier message: 11/04/2008, 22h58
  3. Réponses: 4
    Dernier message: 07/04/2007, 20h02
  4. valeur retournée par une fonction
    Par Biosox dans le forum C
    Réponses: 13
    Dernier message: 19/01/2007, 23h17
  5. valeur retournée d'une fonction
    Par jokos2000 dans le forum Oracle
    Réponses: 8
    Dernier message: 29/06/2005, 12h21

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