Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
8 mai 2005 à 15:46
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201333 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.