thierrybo
Messages postés15Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention12 novembre 2010
-
9 oct. 2010 à 17:44
thierrybo
Messages postés15Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention12 novembre 2010
-
9 oct. 2010 à 23:20
Bonjour,
J'ai plusieurs Form avec des TListView dont certains items ont des Objets associés. Comme pour les objets ajoutés aux Items d'un TListBox ou TComboBox, TListView ne les libère pas quand il est détruit.
Donc dans le FormDestroy j'ajoute :
FreeListViewObjects(ListView1.Items);
et
procedure FreeListViewObjects(const AListItems: TListItems);
var idx: integer;
begin
for idx := 0 to Pred(AListItems.Count) do
begin
TObject(AListItems.Item[idx].Data).Free;
AListItems.Item[idx].Data := nil;
end;
end;
Çà marche bien quand je ferme les Forms concernées ou leur parents, le seul problème est quand je ferme directement la form principale. L'évènement FormDestroy des forms secondaires est bien appelé, mais dans ce cas précis AListItems.Count vaut 0 et j'ai une fuite mémoire correspondant à ces objets associés.
Il semblerait que le listview existe toujours mais qu'il n'y ai plus aucun Items associé. Je reprécise que ça ne fait ça que lors de la fermeture de la form principale.
Thierry B.
A voir également:
Libération des objets associés aux Items d'un TListView
thierrybo
Messages postés15Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention12 novembre 20101 9 oct. 2010 à 23:20
Bon j'ai trouvé,
Il ne faut pas laisser Delphi fermer toutes les forms lui même mais le faire soi-même dans CloseQuery, et là plus de fuite ! :
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i: integer;
begin
for I := 1 to -1 + Screen.FormCount do
Screen.Forms[I].Close;
end;