Fonction renvoyant une TStringList. [Résolu]

Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- - Dernière réponse : Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 8 mai 2005 à 21:57
Salut à tous.
Je voudrais utiliser une fonction renvoyant une TStringList, mais ça me donne toujours un message d'erreur "EAccesViolation".
Voici un exemple (qui plante) de ce que je voudrais faire:

function CreerListe(Long : Integer) : TStrings;
var i : Integer;
MaListe : TStrings;
begin
MaListe := TstringList.create;
try
for i := 1 to Long do MaListe.Add(Inttostr(i));
result := MaListe;
finally
MaListe.Free;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var UneListe : TStrings;
i:Integer;
begin
UneListe := TstringList.create;
try
UneListe.Assign(CreerListe(10));
Edit1.Text:=UneListe[5];
finally
UneListe.Free;
end;
end;

Quelqu'un peut-il m'expliquer pourquoi ça plante, et la façon de s'y prendre?
Merci.
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
25
3
Merci
Tu m'étonnes que ça plante !
Quand tu affectes MaListe à Result dans ta fonction, si tu détruis ta liste de chaines aussitot après, Result vaut alors Nil.
De retour dans ta procédure Button1Click, tu essaies de copier le contenu d'une référence nulle !

Il est un principe de base (mais Borland ne l'a pas toujours respecté lui même) qui dit que :
C'est celui qui crées un objet qui est responsable de sa destruction.
Si l'on met en oeuvre ce principe ici, alors c'est dans Button1Click qu'il faut déclarer et instancier ta liste de chaines :
procedure TForm1.Button1Click(Sender: TObject);
var
UneListe : TStrings;
i:Integer;
begin
UneListe := TStringList.create;
try
CreerListe(10, UneListe));
Edit1.Text:=UneListe[5];
finally
UneListe.Free;
end;
end;
Puis tu passes une référence sur ta liste de chaines à ta fonction qui n'a pas à s'occuper de l'instanciation. La fonction peut alors devenir une procédure :
procedure CreerListe(Long : Integer; AList: TStrings);
var
i : Integer;
begin
for i := 1 to Long do
AList.Add(Inttostr(i));
end;
Chacun occupe son rôle et tout va pour le mieux dans le meilleur des mondes possibles
Pour éviter tout confusion, il vaudrait même mieux renommer CreerListe en RemplirListe.


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
0
Merci
Merci beaucoup Delphiprog.

C'est très clair. Comme d'hab' ...
Commenter la réponse de Caribensila

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.