yvescollet
Messages postés55Date d'inscriptionmardi 26 août 2003StatutMembreDernière intervention22 janvier 2006
-
23 sept. 2004 à 20:28
jinh68
Messages postés215Date d'inscriptionmardi 29 juillet 2003StatutMembreDernière intervention 1 septembre 2006
-
23 sept. 2004 à 22:02
hello, voila le code que j'emploi pour obtenir une TList de catégories. j'essaie de détruire cette liste lorsque je quitte l'application, mais j'ai toujours une erreur de pointeurs. quelqu'un pourrait-il m'aider par rapport à la destruction de la liste. merci
P.S. (la function getAllCategories renvoie une TList et est appelée dans une autre unité, mais bref, le problème n'est pas la).
---------------------------------------------------------
var
ListeCategories : TList;
server : TAppServer;
implementation
uses U_Application;
{$R *.dfm}
procedure TFGestionArticles.FormShow(Sender: TObject);
begin
server := TAppServer.Create;
ListeCategories := server.getAllCategories;
end;
{******************************************************************************}
procedure TFGestionArticles.MenuItem2Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to ListeCategories.Count - 1 do
begin
TCategories(ListeCategories[i]).Free;
end;
ListeCategories.Free;
server.Free;
end;
end.
Loulibier
Messages postés309Date d'inscriptionjeudi 6 juin 2002StatutMembreDernière intervention24 septembre 20082 23 sept. 2004 à 20:37
salut,
ton problème est tout simple tu détruis tes composants en commençant par l'index le plus petit. hors il faut faire l'inverse car lorsque tu détuis un TList, l'index diminue.
essai plutôt ça :
procedure TFGestionArticles.MenuItem2Click(Sender: TObject);
var
i : integer;
begin
for i := ListeCategories.Count - 1 downto 0 do
begin
TCategories(ListeCategories[i]).Free;
end;
ListeCategories.Free;
server.Free;
end;
end.
procedure TFGestionArticles.MenuItem2Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to ListeCategories.count - 1 do
begin
TCategories(ListeCategories[i]).Free;
end;
ListeCategories.Free;
server.Free;
end;
end.
*************************************************
dans ce cas, je n'avais pas d'erreur (d'ailleurs la destruction
de la TList fonctionnait), mais maintenant que je ne fais plus
de "ListeCategories.create", et bien j'ai ces problèmes
d'adresses de pointeur.
jinh68
Messages postés215Date d'inscriptionmardi 29 juillet 2003StatutMembreDernière intervention 1 septembre 2006 23 sept. 2004 à 21:14
Premièrement il faut éviter de faire des fonctions qui renvoit des TList, cela gaspille la mémoire et ce n'est pas optimal pour la libération.Donc tu passes ListCategories en paramètre de la fonction GetAllCategories.
et pour libérer
If Assigned(ListCategories) then FreeAndNil(ListeCategories);
yvescollet
Messages postés55Date d'inscriptionmardi 26 août 2003StatutMembreDernière intervention22 janvier 2006 23 sept. 2004 à 21:38
si je vous dis que je suis un peu forcé de faire comme cela (donc avec une TList), pourriez-vous m'aider à résoudre mon problème. comme je pense, le truc c'est que je fais plus de .create et c'est qqch de nouveau pour moi, alors je sais pas quoi faire.
yvescollet
Messages postés55Date d'inscriptionmardi 26 août 2003StatutMembreDernière intervention22 janvier 2006 23 sept. 2004 à 21:49
c'est un peu la merde, parce qu'il y'a une base de données et tout...
mais mis a part les 2 procedures que je vous ai écrit, j'ai une autre unité "U_TAppServer" qui a une fonction getAllCategories:
function getAllCategories() : TList;
var
ListeCategories : TList;
UneCategorie : TCategories;
begin
Datamodule1.ibquery1.clear;
datamodule1.ibquery1.sql.add('select * from categories');
datamodule1.ibquery1.active := true;
ListeCategories := TList.create;
while not datamodule1.eof do
begin
UneCategorie := TCategories.create;
ListeCategories.add(UneCategorie);
datamodule1.ibquery1.next;
end;
result := ListeCategories;
end;
jinh68
Messages postés215Date d'inscriptionmardi 29 juillet 2003StatutMembreDernière intervention 1 septembre 2006 23 sept. 2004 à 22:02
procedure getAllCategories(ListCategories: TList);
var
UneCategorie : TCategories;
begin
if Not Assigned(ListCategories) then Exit;
datamodule1.ibquery1.clear;
datamodule1.ibquery1.sql.add('select * from categories');
datamodule1.ibquery1.active := true;
while not datamodule1.eof do
begin
UneCategorie := TCategories.create;
ListeCategories.add(UneCategorie);
datamodule1.ibquery1.next;
end;
procedure TFGestionArticles.MenuItem2Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to ListeCategories.Count - 1 do
TCategories(ListeCategories[i]).Free;