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