Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

Wozu dient TList.Delete ??

  Alt 26. Sep 2014, 15:50
Delphi-Version: XE
Hallo zusammen,

ich muss gestehen, ein wenig verwirrt zu sein, nachdem ich in der Hilfe über den folgenden Satz (zu TList.Delete) gestolpert bin:
Zitat:
Note: Delete does not free any memory associated with the item. The object can be freed by overriding the Notify method.
Klar ist also, dass Delete(Index : Integer) das Element mit dem Index aus der Liste entfernt, aber NICHT freigibt?

Es gibt ja die folgenden Methoden, die "in etwa" dasselbe machen, nämlich ein Element aus der Liste zu entfernen.
Delphi-Quellcode:
function Extract(Item: TObject): TObject;
function Remove(AObject: TObject): Integer;
procedure Delete(Index: Integer);
Alle drei jedoch geben (nach einem Blick in den SourceCode) das jeweilige Element nicht frei. Das macht natürlich bei Extract Sinn, will man doch das Element weiterverwenden, nur eben nicht mehr in der Liste, sondern getrannt davon verwalten.

Wozu aber Remove und Delete? Beide entfernen das Element aus der Liste, geben es aber nicht frei und geben auch keine Referenz darauf zurück. Meines Verständnisses nach erzeugt man sich doch damit lustig Speicherlecks?

Sieht die Lösung wirklich so aus, dass ich TList.Notiy überschreiben muss?

Delphi-Quellcode:
type TDeletingList<T> = class TList<T>
  protected
    procedure Notify(const Item: T; Action: TCollectionNotification); override;
end;

procedure TDeletingList<T>.Notify(const Item: T; Action: TCollectionNotification);
begin
  if Action = cnRemoved then
    Item.Free
  else
    inherited;
end;
Wenn ich keine Ableitung von TList bzw. TObjectList anlegen will, könnte ich mir alternativ auch so helfen (um das erste Element der List zu löschen), oder:
FList.Extract(FList.Items[0]).Free; Wenn das so ist, ist für mich die Verwendung dieser Methoden extremst kontra-intuitiv, nämlich, dass die Elemente eben NICHT gelöscht (sondern "nur" aus der Liste entfernt werden).

Zumal ist den oben genannten Hinweis aus der Hilfe auch nicht überall finde: In meiner Hilfe (XE) steht dieser Hinweis nämlich nur in dem Hilfe-Artikel zu "Classes.TList.Delete", nicht aber zu "Generics.Collections.TList.Delete". Gut, dass die Hilfe (zumindest in den ersten XE-Versionen) manchmal nicht hilfreich ist, steht wieder auf einem anderen Blatt.

Einen verwunderten "man-lernt-nie-aus" Gruß in die Runde
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat