Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Fonction qui retourne un TStringList [ Divers / Débutant(e) ] (John Dogget)

mercredi 5 décembre 2007 à 14:13:42 | Fonction qui retourne un TStringList

John Dogget

Bonjour à tous.

J'ai ecris une function qui retourne un TStringList comme résultat, mais je n'arrive pas à liberer le StringList à la fin de la fonction sans que le programme plante

Voici cette fonction ...

function ListerProcessus:TStringList;
var
  HandleCaptureProcessus:THandle;
  StructureProcessus:TProcessEntry32;
  Liste:TStringList;
begin
  Liste:=TStringList.Create;
  HandleCaptureProcessus:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
  StructureProcessus.dwSize:=SizeOf(TProcessEntry32);
  Process32First(HandleCaptureProcessus,StructureProcessus);
  repeat
    Liste.Add(StructureProcessus.szExeFile);
  until not Process32Next(HandleCaptureProcessus,StructureProcessus);
  CloseHandle(HandleCaptureProcessus);
  Result:=Liste;
end;

Normalement toute StringList doit être libéré après usage, pourtant si je rajoute "Liste.Free" toute à la fin de la fonction, elle me retourne une liste vide, alors que théoriquement le résultat est déjà affecté (Result:=Liste).

Pourquoi ?

Autre chose bizarre, dans l'appel de cette fonction cette fois ...
Voila ce que j'ai ecris ...

procedure TForm2.FormShow(Sender: TObject);
var
  Liste:TStringList;
  IndexListe:integer;
begin
  LstVw_ProcessusEnCours.Clear;
  Liste:=ListerProcessus;
  for IndexListe:=0 to (Liste.Count-1) do
    LstVw_ProcessusEnCours.Items.Add.Caption:=Liste[IndexListe];
  Liste.Free;
end;

Si je suis le code comme ça, je libere un TStringList que je n'ai jamais crée (pas de Liste.Create dans le code), pourtant ça marche très bien comme ça

Ca semble fonctionner correctement et je ça devrait me suffire mais ça me chiffonne quand même
Quelqu'un a t'il une explication ?

PS: et désolé pour la longueur du message

mercredi 5 décembre 2007 à 14:59:13 | Re : Fonction qui retourne un TStringList

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Bon

Tu pouvais écrire ta fonction comme ceci :
Function ListerProcessus:TStringList;
Var
  
HandleCaptureProcessus:THandle;
  StructureProcessus:TProcessEntry32;
Begin
  
Result:=TStringList.Create;
  HandleCaptureProcessus:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
  StructureProcessus.dwSize:=SizeOf(TProcessEntry32);
  Process32First(HandleCaptureProcessus,StructureProcessus);
  Repeat
    
Result.Add(StructureProcessus.szExeFile);
  Until Not Process32Next(HandleCaptureProcessus,StructureProcessus);
  CloseHandle(HandleCaptureProcessus);
End;
Highlighted with Pas2HTML

Qand tu fais :
  Liste := ListerProcessus;
C'est "ListerProcessus" qui se charge de créer la StringList
et il est donc tout à fait normal que tu la libère après sont utilisation

 
@+
Cirec


mercredi 5 décembre 2007 à 15:21:55 | Re : Fonction qui retourne un TStringList

florenth

Membre Club
Ehhh mais je rêve !
Faut rechercher mon ami !
J'ai écrit tout un tutoriel la dessus: http://www.delphifr.com/tutoriaux/FONCTION-CREANT-OBJET-BONNE-FACON-PROCEDER_606.aspx

Alors quand même... ça mérite un détour.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]

mercredi 5 décembre 2007 à 15:36:26 | Re : Fonction qui retourne un TStringList

John Dogget

Merci à tous les deux
@ florenth : j'ai pas cherché avant ...

jeudi 6 décembre 2007 à 02:15:31 | Re : Fonction qui retourne un TStringList

f0xi

Membre Club Administrateur CodeS-SourceS


procedure ListerProcessus(Strings: TStrings);
var
  THSHnd : THandle;
  ProcEntry : TProcessEntry32;
begin
  if not assigned(Strings) then
    raise Exception.Create('Erreur interne: Objet en entrée non alloué.');

  THSHnd := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if THSHnd <> -1 then
  begin
    try
      Strings.BeginUpdate;
      try
        ProcEntry.dwSize := SizeOf(TProcessEntry32);
        if Process32First(THSHnd, ProcEntry) then
          repeat
            Strings.Add(ProcEntry.szExeFile);
          until not Process32Next(THSHnd,ProcEntry);
      finally
        Strings.EndUpdate;
      end;
    finally
      CloseHandle(THSHnd);
    end;
  end
  else
    raise Exception.CreateFmt('Erreur interne (%d): Handle invalide.',[GetLastError]);
end;






jeudi 6 décembre 2007 à 19:32:18 | Re : Fonction qui retourne un TStringList

florenth

Membre Club
Ahh ce bon f0xi ! Toujours aussi fâché avec les méthodes retournant un objet !
M'enfin, ton code est plus sécurisé que la version originale de john, c'est donc pour la bonne cause !

jeudi 6 décembre 2007 à 19:43:06 | Re : Fonction qui retourne un TStringList

John Dogget

Perso, j'ai repris la méthode de cirec, assez similaire à la mienne, mais plus claire pour la compréhension.
C'est vrai aussi que je suis passé (volontairement) à côté des erreurs éventuelles ...



vendredi 7 décembre 2007 à 08:42:26 | Re : Fonction qui retourne un TStringList

japee

Membre Club Administrateur CodeS-SourceS
Florenth > perso je préfère passer l'objet en paramètre, ça évite d'oublier de le libérer après l'appel.

John Dogget > la méthode de f0xi n'est pas plus difficile à comprendre que celle de Cirec. Seule l'approche diffère :
- méthode Cirec : il faut libérer la méthode après son appel,
- méthode f0xi : il suffit de passer un objet de type TStrings en paramètre (TListBox.Items par exemple). Plus vérification de la validité du handle avec CreateToolHelp32Snapshot différent de -1, et protection "béton" du code. Pourquoi dans ces conditions ne pas valider la réponse ?

vendredi 7 décembre 2007 à 11:35:26 | Re : Fonction qui retourne un TStringList

cirec

Membre Club Administrateur CodeS-SourceS
hep hep hep,

c'est pas ma fonction, c'est celle de John Dogget ...

je lui ai juste montré qu'il pouvait se passer de déclarer & créer une nouveau StringList, il suffisait d'utiliser Result correctement et rien d'autre.

Ensuite il n'y a pas de différence entre une procedure avec un objet en paramètre et fonction qui renvoie un objet :
Dans les deux cas l'objet sera libéré soit automatiquement par Delphi dans le cas cité par Japee soit manuellement par l'utilisateur après utilisation

Supposez que pour x raison on ne veuille pas d'un composant visuel (ComboBox, ListBox etc) mais simplement d'une TStringList je ne crois pas qu'avec la procédure de F0xi l'on puisse se passer de libérer l'objet en fin d'utilisation.

Supposez que l'objet en question soit un TBitmap  pensez vous que la procédure  vous évitera de le libérer après utilisation ? 
Sûr que non


C'est quand même bizarre cette amnésie que beaucoup de gens ont quand on utilise une fonction que l'on fait soit même et cette même amnésie disparait quand on utilise une fonction de Delphi ou Windows ????

Il n'y a donc pas plus intérêt d'utiliser l'une ou l'autre ... le tout est de savoir ce qu'il faut faire et quand.

Et je vous rappel que la question portait sur une fonction renvoyant un Objet et non sur une procédure utilisant un objet

Et à titre d'information si CreateToolHelp32Snapshot renvoi INVALID_HANDLE_VALUE la fonction ne plante pas pour autant et ne déclenche pas d'erreur
 
@+
Cirec


vendredi 7 décembre 2007 à 18:38:49 | Re : Fonction qui retourne un TStringList

florenth

Membre Club
Object function powaaa !

Sérieusement, je veux bien comprendre que la fonction incite plus à "oublier" de libérer mais de là à généraliser, il en va autrement. y'a des fois où c'est imparable ce genre de fonction (dans la VCL, y'en a pas mal).

Bref, ça doit sûrement être un préjugé delphiste....

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]



Cette discussion est classé dans : fonction, liste, tstringlist, handlecaptureprocessus, structureprocessus


Répondre à ce message

Sujets en rapport avec ce message

manipulation tstringlist [ par loicbernard ] bonjour tout le monde, J'ai fait une petite fonction qui renvoit un TStringList. Mais je me demande comment je dois m'y prendre pour créer et libérer liste des fonction delphi??? [ par needle ] Alors voila, je me demandais, tous simplement, ou est-ce qu'on pourrait trouver une liste des fonctions de bases. Avec, si possible, une explication d Fonction renvoyant une TStringList. [ par Caribensila ] Salut à tous.Je voudrais utiliser une fonction renvoyant une TStringList, mais ça me donne toujours un message d'erreur "EAccesViolation".Voici un exe Liste de nom de TImage [ par petitripol ] Bonjour tout le monde!Je suis ... troublé, j'ai besoin de prendre un moment....Bon j'explique mon petit prob auquel je ne trouve pas de solutions peut Existe t'il une fonction pour retirer des caractères [ par hysteria74 ] Bonjour,je voudrais savoir s'il existe une fonction sous Delphi 7 pour retirer les trois derniere lettre d'un chemin connu.je m'expliqueExpandFileName probleme avec la fonction length [ par informatixo ] J'ai réalisé une fonction EstNumerique en m'inspirant d'une solution que delphiprog avait donné dans un post, donc ne vous étonnez pas de ce nom. Je Fonction SUCC [ par Isabelle31 ] Bonjour a  tous,J'ai un petit problème d'utilisation de cette fonction en effet je veux l'utiliser sur un STRING mais j'ai une erreur.Mon code :    st fonction AllEqual? [ par akhria ] Salut je voulais savoir comment se servir de la fonction AllEqual?D'ailleurs est ce c'est la bonne fonction pour dire :Si tout mes TTypes.proriétébool Détecter (et modifier) des liens dans des documents via Visual Basic. [ par DPhBxl ] Bonjour,Voici mon problème: En partant d'un répertoire de départ, j'établis la liste de tous les documents (y compris dans les sous-répertoires) afin String pour appeler variable simple [ par lebdenat ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.