Siedzę nad tym jakiś czas i co bym nie wymyślił to nie działa tak jak chcę. A chcę aby było tak:
Mam listę obiektów (TList), tworzę obiekt i dodaję go do listy. Obiekt sobie żyje swoim własnym życiem, aż w pewnym momencie w jednym z jego zdarzeń chcę go usunąć, bo przestał być potrzebny. Przy okazji, żeby usunął się z tej listy. Najgorsze jest to, że wszelkie akcje na tych obiektach są podejmowane w pętli po liście, więc jak obiekt sam siebie zniszczy i wypisze z listy to psuje się pętla.
TObiekt = class;
TMenedzerObiektow = class
private
FObiekty: TList;
procedure DodajObiekt(AObiekt: TObiekt);
procedure UsunObiekt(AObiekt: TObiekt);
public
constructor Create;
destructor Destroy; override;
procedure RobCos;
end;
TObiekt = class
private
FOwner: TMenedzerObiektow;
public
constructor Create(AOwner: TMenedzerObiektow);
destructor Destroy; override;
procedure RobCos;
end;
constructor TMenedzerObiektow.Create;
begin
FObiekty := TList.Create;
end;
destructor TMenedzerObiektow.Destroy;
var
n: Integer;
begin
for n := 0 to FObiekty.Count - 1 do
TObiekt(FObiekty[n]).Free;
FObiekty.Free;
inherited;
end;
procedure TMenedrzeObiektow.DodajObiekt(AObiekt: TObiekt);
begin
FObiekty.Add(AObiekt);
end;
procedure TMenedrzeObiektow.UsunObiekt(AObiekt: TObiekt);
begin
FObiekty.Remove(AObiekt);
end;
procedure TMenedrzeObiektow.RobCos;
var
n: Integer;
begin
for n := 0 to FObiekty.Count - 1 do
TObiekt(FObiekty[n]).RobCos;
end;
constructor TObiekt.Create(AOwner: TMenedzerObiektow);
begin
FOwner := AOwner;
FOwner.DodajObiekt(Self);
end;
destructor TObiekt.Destroy;
begin
inherited;
FOwner.UsunObiekt(Self);
end;
procedure TObiekt.RobCos;
begin
// coś tam tutaj robię i w pewnym momencie chcę usunąć ten obiekt
// załóżmy, że odpowiada za to "Warunek"
if Warunek then Self.Free;
end;
W momencie usunięcie elementu z listy rozwala się pętla i wywala out of bounds, wiadomo. Próbowałem oznaczać obiekt do usunięcia poprzez zmienną i po pętli z RobCos sprawdzałem kolejną pętlą, ale od ostatniego do pierwszego czy obiekt jest oznaczony i wtedy go usuwałem (wtedy usunięcie elementu nie wpływa na resztę listy, której pętla nie objęła), ale działy się dziwne rzeczy :|
Ma ktoś jakiś pomysł na taką listę?