Fonction renvoyant une TStringList.

Résolu
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 8 mai 2005 à 15:46
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 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.

2 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 mai 2005 à 19:46
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.
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
8 mai 2005 à 21:57
Merci beaucoup Delphiprog.

C'est très clair. Comme d'hab' ...
0
Rejoignez-nous