Fonction renvoyant une TStringList. [Résolu]

Signaler
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
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.

2 réponses

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
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.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Merci beaucoup Delphiprog.

C'est très clair. Comme d'hab' ...