Objet.Free (help please)

yvescollet Messages postés 55 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 22 janvier 2006 - 23 sept. 2004 à 20:28
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Derniè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.

8 réponses

Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
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. 


Bonne Prog,

Olivier.
0
yvescollet Messages postés 55 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 22 janvier 2006
23 sept. 2004 à 21:04
merci, mais c'est pas ça le problème. en fait, j'avais
"la mauvaise" habitude d'écrire :

var
ListeCategories : TList;

implementation

procedure TFGestionARticles.FormShow(Sender: TObject);
begin
ListeCategories := TList.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.

*************************************************
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.
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Derniè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);
0
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
23 sept. 2004 à 21:16
:blush) j'ai mal lu ton code j'ai cru que tu gérais un tableau de TList, et j'ai pas cherché à comprendre. Honte à moi :-p
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yvescollet Messages postés 55 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 22 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.

merci de votre aide.
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
23 sept. 2004 à 21:41
Ben en fait TList est un pointeur et une fonction qui renvoit un pointeur mmmmh... :sad)

Si tu veux envoie ton projet sur jerome.m@tv-com.tv je te fais l'exemple et te le commente pour bien que tu comprennes ;).

j!nH
0
yvescollet Messages postés 55 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 22 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;

voila, c'est tout.
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Derniè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;

end;

////////////////////////////////////////////////////////////////////////

procedure TFGestionARticles.FormShow(Sender: TObject);
begin
ListeCategories := TList.create;
server.GetAllCategories(ListeCategories);
end;

////////////////////////////////////////////////////////////////////////

procedure TFGestionArticles.MenuItem2Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to ListeCategories.Count - 1 do
TCategories(ListeCategories[i]).Free;

FreeAndNil(ListeCategories);
server.Free;
end;

Ajoute ça dans les bons units et c'est bon ;)

j!nH
0
Rejoignez-nous