2011-07-01 5 views
7

J'ai une liste TObject (FileEventObjects := TObjectList.Create(True);) contenant un ou plusieurs objets. Les objets doivent rester dans la liste jusqu'à ce qu'ils soient traités. (La liste d'objets existe pour la durée de l'application.)Delphi Supprimer un objet d'une TObjectList

Je ne suis pas entièrement sûr de la façon de supprimer un objet traité de la liste.

Est-ce que l'objet soit « libéré » si je FileEventObjects.Delete(i)

Y at-il des liens vers des exemples utiles de TObjectLists en action?

Cordialement, Pieter.

+1

Si jamais vous êtes curieux de savoir si un objet est libéré se, ajoutez cette ligne au destructeur: OutputDebugString ('Freeing TMyclassName'); Vous le verrez dans le journal des événements chaque fois qu'il est appelé. Ou définissez un point d'arrêt dans TMyclassName.Destroy. Vous pouvez même activer le détecteur de fuite de mémoire de Fast MM, et vous serez averti des objets qui n'ont pas été libérés correctement. –

Répondre

12

Si vous passez True au constructeur TObjectList (il est également True par défaut), la liste libère un objet dès que vous retirez de la collection, peu importe si vous utilisez Delete, Remove ou Clear. En plus de cela, TObjectList peut être utilisé comme TList.

+0

J'avais peur de répondre à celle-ci, car je ne savais pas si elle l'avait libérée lorsque vous utilisiez ces fonctions. Merci d'effacer cela, +1 :) – Jeff

+15

Vous pouvez utiliser '.Extract()' pour supprimer un objet de la liste sans le libérer. –

+0

Merci pour la réponse rapide. –

4

toujours se souvenir de la boucle arrière comme

for i := Pred(objectlist.Count) downto 0 do 
begin 
    objectlist.items[i].process; 
    objectlist.delete(i); 
end; 

si vous boucle de 0 à -1 compter la suppression des éléments alors que vous obtiendrez des violations d'accès

+2

Oui, je l'ai trouvé à la dure hier !! –

Questions connexes