Fonction renvoyant une TStringList. [Résolu]

Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 8 mai 2005 à 15:46 - Dernière réponse : Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention
- 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
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 8 mai 2005 à 19:46
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.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 8 mai 2005 à 21:57
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.