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 :

Problème avec une fonction qui renvoie un TStringList ?


Sujet :

Delphi

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut Problème avec une fonction qui renvoie un TStringList ?
    Bonjour,

    J'ai un petit soucis avec une fonction qui renvoi un TStringList, j'ai l'impression qu'elle ne renvoi rien alors que les fichiers sont bien trouvés.

    Voici le code :
    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
    24
    25
    26
    27
    28
    29
     
    function GetListFiles(MyPattern:String):TStringList;
    var
         MySearch  : TSearchRec;
         MyListe   : TStringList;
    begin
         try
              MyListe := TStringList.Create;
              if FindFirst(MyPattern, faAnyFile, MySearch) = 0 then
              begin
                   repeat
                        MyListe.Add(MySearch.Name);
                   until FindNext(MySearch) <> 0;
                   FindClose(MySearch);
              end;
              Result := MyListe;
              MyListe.Free;
         except on E : Exception
         do
              begin
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.FormCreate(Sender: TObject);
    begin
         Listbox2.Items.Assign(GetListFiles('.\Update\*.exe'));
    end;
    Le problème doit se trouver au niveau du Result mais je ne sais pas comment le résoudre

    Merci pour votre aide,
    Mathieu
    Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    C'est tout simple. TStringList est un objet, donc quand tu fais Result := MyListe, tu passes à la valeur de retour non pas l'objet mais le pointeur vers cet objet. Du coup quand à la ligne d'après tu fais MyListe.Free, tu vides également l'objet Result...

    La solution consiste à ne pas détruire ton objet MyListe dans la fonction GetListFiles mais dans le FormCreate.

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il me semble que tu libères la liste après l'avoir assignée à Result...
    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 GetListFiles(MyPattern:String):TStringList;
    var
         MySearch  : TSearchRec;
    begin
         try
              if FindFirst(MyPattern, faAnyFile, MySearch) = 0 then
              begin
                   repeat
                        Result.Add(MySearch.Name); // il me semble que l'objet résultat est déjà créé par le compilo ; à vérifier
                   until FindNext(MySearch) <> 0;
                   FindClose(MySearch);
              end;
     
         except on E : Exception
         do
              begin
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Bonjour,

    Merci pour votre aide. Si j'ai bien compris, il faut que je retire ma ligne MyListe.Free cependant, ce n'est plus un code très propre ?

    Y-a-t-il un code plus propre que le mien ou alors dans le cas ou je retire mon MyListe.Free, celle-ci est quad même appelée implicitement ?

    Merci,
    Mathieu
    Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)

  5. #5
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Bonjour,

    Pour que mon code soit plus propre, j'ai donc transformé ma fonction en procedure comme ça :
    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
    24
    25
    26
    27
    28
    29
    30
     
    procedure GetListFiles(MyListe:TStringList;MyPattern:String);
    var
         MySearch  : TSearchRec;
    begin
         try
              if FindFirst(MyPattern, faAnyFile, MySearch) = 0 then
              begin
                   repeat
                        MyListe.Add(MySearch.Name);
                   until FindNext(MySearch) <> 0;
                   FindClose(MySearch);
              end;
         except on E : Exception
         do
              begin
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.FormCreate(Sender: TObject);
    var
         ListeFiles     : TSTringList;
    begin
         ListeFiles := TStringList.Create;
         GetListFiles(ListeFiles,'.\Update\*.exe');
         Listbox2.Items := ListeFiles;
         ListeFiles.Free;
    end;
    Cordialement,
    Mathieu
    Embarcadero RAD Studio XE / Microsoft Windows 7 Édition Intégrale (64 bits)

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 156
    Points : 106
    Points
    106
    Par défaut
    Bonjour, Mathieu

    Il y a légèrement plus simple :

    - définir la procédure GetListFiles, avec comme paramètre un objet TStrings pour MyListe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure GetListFiles(MyListe : TStrings; ;MyPattern:String);
    begin
       .....
    end;
    - Ensuite, tu appelles ta procédure de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetListFiles(Listbox2.Items, '.\Update\*.exe');
    Ainsi, pas besoin de créer une liste temporaire, donc pas besoin de la supprimer ensuite.

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

Discussions similaires

  1. Une fonction qui renvoie un array
    Par Tangui dans le forum Débuter
    Réponses: 1
    Dernier message: 02/12/2007, 00h53
  2. Réponses: 1
    Dernier message: 23/10/2007, 09h37
  3. Comment faire une fonction qui renvoi un tableau.
    Par poly128 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 01h04
  4. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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