loicbernard
Messages postés16Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention15 juin 2005
-
13 juin 2005 à 12:28
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
14 juin 2005 à 15:28
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 l'objet TStringList. voici ma fonction:
function BodyMsgDemarrage: TStringList;
begin
Result := TStringList.Create;
Result.Clear;
Result.Add('Le serveur a été démarré avec la configuration suivante');
Result.Add('Port : ' + FPort);
Result.Add('Client TimeOut : ' + FClientTimeout );
Result.Add('Timeout interval : ' + FTimeoutInterval );
end;
Mon problème est donc de savoir où faire le create et faire le free... pour l'instant je fais donc mon create dans la fonction elle-meme. mais je ne fais jamais de free...
je suppose que ce n'est pas bon mais je ne sais pas comment m'y prendre ... pourriez vous me donner votre avis sur la question?
merci d'avance
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 juin 2005 à 12:57
Tu ne peux pas libérer result, sinon tu retournes un pointeur ne valant
plus rien de concret... C'est donc l'appelant qui doit le libérer.
Tu ne peux donc pas utiliser de fonction renvoyant une TStringList.
Cependant, tu as la possibilité de faire une procédure, qui, plutôt que
de renvoyer un résultat, modifie une
variable :
var
MaVarTStringList : TStringList; // La variable qui sera utilisée
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 juin 2005 à 17:33
Tes résultats rejoignent donc ce que j'ai dit dans mon post précédent,
la variable n'est pas vraiment libérée... Je ne vois aucun autre moyen
de procéder que d'utiliser une procédure...
@+
Bonne Prog'
Nico
<hr>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
loicbernard
Messages postés16Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention15 juin 2005 13 juin 2005 à 14:02
merci de ta réponse rapide
oui j'ai pensé à cette solution...
maisj'aimerais vraiment que ce soit une fonction qui renvoit le tstringlist pour une facilité d'utilisation et parceque si ca marche ca doit etre plsu joli...
voici ma procedure qui utilise ma fonction tstringlist...
procedure maprocedure();
begin
...
Sendmail('mon titre', BodyMsgDemarrage
)
//BodyMsgDemarrage.free;
...
end
tu dis qu'on ne peut pas utiliser de fonction renvoyant un tstringlist ... je veux bien te croire mais comme elle est écrite ma fonction fonctionne() ... le seul truc c'est que je veux savoir si je dois "libérer ma fonction" après utilisation ou non (ligne en commentaire ... et ca marche aussi quand elle est pas en commentaire)
une autre solution serait ceci mais j'aime pas non plus ... (en fait c'est ma première solution que je trouve la plus pratique(sans le free) mais je crains que la libération ne se fasse pas tout seul)
function BodyMsgDemarrage: TStringList;
begin
Result.Clear;
Result.Add('Le serveur a été démarré avec la configuration suivante');
Result.Add('Port : ' + FPort);
Result.Add('Client TimeOut : ' + FClientTimeout );
Result.Add('Timeout interval : ' + FTimeoutInterval );
end;
procedure maprocedure();
begin
bodymsgdemarrage := tstringlist.create;
Sendmail('mon titre', BodyMsgDemarrage
)
bodymesgdemarrage.free;
end
Vous n’avez pas trouvé la réponse que vous recherchez ?
loicbernard
Messages postés16Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention15 juin 2005 13 juin 2005 à 17:24
tiens j'ai l'impression que je suis tout seul sur ce coup là
bon ben voilà j'ai fait quelques tests...
je peux déjà vous dire que
procedure maprocedure();
begin
bodymsgdemarrage := tstringlist.create;
Sendmail('mon titre', BodyMsgDemarrage
)
bodymesgdemarrage.free;
end
ca marche pas... la partie de gauche n'est pas affectable...
et en plus
ma première idée semble TRES mauvaise...avec ou sans le free :
procedure maprocedure();
begin
...
Sendmail('mon titre', BodyMsgDemarrage
)
//BodyMsgDemarrage.free;
...
end
j'ai fait une petite boucle qui apelle 20000 fois la fonction bodydemsgdemarrage et en regardant avce le gestionnaire de tache... je vois que l'occupation mémoire de mon processus explose...(meme avec le free!!!)
d'où je suis revenu à l'idée de départ (celle de ni69)... suis un peu décu qu'on puisse pas faire une fonction qui renvoit un objet mais bon je n'en mourrai pas...
si quelqu'un a néanmoins une bonne idée sur le sujet n'hésiter pas
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 juin 2005 à 17:28
Je te comprends quand tu dis préférer utiliser une fonction, effectivement, ça fait plus propre dans le code
Quand je disais qu'on ne pouvait pas utiliser de fonction renvoyant une
TStringList, c'était que je ne voyais aucun moyen de libérer la
TStringList renvoyée par la fonction... Mais apparement, je me suis
trompé , désolé...
J'ai regardé la méthode de japee, effectivement, elle marche, mais cependant, j'émets un doute : je ne suis pas sûr que la StringList renvoyée par la fonction appelée la première fois [ListBox1.Items.Assign(Transfert(Memo1))] soit libérée, car pour effectuer l'appel de la méthode Free, on appelle une deuxième fois la fonction [Transfert(Memo1).Free;], ce qui crée une deuxième StringList, donc au final, on libère la deuxième StringList, mais pas la première... (du moins c'est ce que je crois...)
Si quelqu'un pouvait nous éclairer sur les différents détails de ce
code et/ou sur la meilleure façon de procéder, j'en serais ravi !
@+
Bonne Prog'
Nico
<hr>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 13 juin 2005 à 17:46
Oui ni69, la réponse que m'a donné Japee est fausse: comme tu le dis,
la fonction est rapellée une deuxième fois et c'est cette deuxième
instance qui est libérée, pas la 1ere ...
Il faut donc passer par un parametre dans une procéduree ou une fonction de la sorte:
function MaFunc: TStringList;
begin
Result: =TStringList.Create;
Result.Add('Ma chaine');
end;
que l'on appelle ainsi:
procedure MaProc;
var
Sl: TStringList;
begin
Sl: =MaFunc;
Sl.Free;
end;
@ ++
Florent
Si tu ne te plantes pas ......
tu ne poussera jamais
loicbernard
Messages postés16Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention15 juin 2005 14 juin 2005 à 12:48
merci du dévouement de chacun...
florent :
oui mais mon problème c'est ma fonction sendmail(mybodymessage) remplit la propriété body(c'est un TStrings) du composants IdMessage(composant indy) ...et je ne vois pas comment appliquer ta solution dans ce cas là...
japee:
le problème est que comme je l'expliquais ci dessus au final je dois remplir un TStrings...
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 14 juin 2005 à 15:28
Loïc > C'était uste un exemple pour te montrer que c'est possible.
Nico > A ce compte là, ma fonction convient aussi (de même qu'une
procedure avec param variable) puisqu'il faut quand même déclarer une
variable pour s'en servir. Et en plus, il faut que l'appelant la crée
et la libère ...
Japee > Mais pourquoi pas ? On s'embette vraiment pour rien ...
Mais il faut savoir que, même si c'est transparant, que Delphi, lui, alloue et libère la memoire associée à un type string.
C'est pas grave si tu t'es trompé en me répondant sur l'autre message. Parce que
Si tu ne te plantes pas ......
tu ne poussera jamais (eh oui)