Wenn du ein Object erzeugst wird dynmisch Speicher dafür angefordert und du kommst einen Pointer zurück geliefert (die Objectinstanz). Das heißt irgendwo im Speicher liegen die Daten und du hast immer nur einen Pointer darauf der sich für dich als eine Objectinstanz darstellt.
Egal wieviel Pointer du jetzt hast zeigen diese immer auf die selbe Stelle, das heißt sie haben auch immer den selben Wert.
Self innerhalb des Objectes hat also den gleichen Wert wie die Objectinstanz in der Liste und überall anders. Entsprechend kannst du im Destructor mit Liste.IndexOf(Self) den Index innerhalb der Liste ermitteln.
Das sinvollste ist es jedoch eine neue Liste zu schreiben und deinem Object beim erzeugen als Parent diese Liste zu übergeben. Dann musst du nicht mit einer globalen Liste arbeiten sondern kannst mit hilfe des übergebenen Parents arbeiten:
Delphi-Quellcode:
type
TDeinObject = class(TIrgendwas)
private
fParent: TObjectListeOderAbleitung;
[...]
public
constructor Create(AParent: TObjectListeOderAbleitung);
destructor Destroy(); override;
[...]
end;
[...]
constructor TDeinObject.Create(AParent: TObjectListeOderAbleitung);
begin
inherited Create();
fParent := AParent;
end;
destructor TDeinObject.Destroy();
begin
fParent.Delete(fParent.IndexOf(Self));
//oder: fParent.Remove(Self);
inherited Destroy();
end;