Libération des objets associés aux Items d'un TListView

Résolu
thierrybo Messages postés 15 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 12 novembre 2010 - 9 oct. 2010 à 17:44
thierrybo Messages postés 15 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 12 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.

1 réponse

thierrybo Messages postés 15 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 12 novembre 2010 1
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;
3
Rejoignez-nous