[Delphi] Wskaźnik do zmiennej trzymającej obiekt

0

Witam,
Mam taki problem. Mam w aplikacji sporo klas które "komunikują" się ze sobą, inaczej - są ze sobą w jakiś sposób powiązane. We własnym konstruktorze przesyłam wskaźnik do obiektu, dzięki czemu obiekt docelowy może wywołać jakąś metodę obiektu pierwszego itd. Jednak czasami ciężko nad wszystkim zapanować, np. gdy jakiś obiekt zostaje zwolniony z pamięci a inny chce sie do niego odwolac to dostaje AV (mimo że zrobilem FreeAndNil(Zmienna), to obiekt podrzędny dalej pamięta wskaźnik i odwołuje się do niego. Zamiast dodawać kolejne moduły do uses żeby odwoływać się do zmiennych trzymających wskaźnik do obiektów, chciałbym sprawdzać czy ów zmienna jest różna od nil ale nie odwołując się bezpośrednio do niej. Troche zakręciłem, ale już późno. Bardzo prosty przykład:

type
TObject1 = class
  public
    procedure JakasProcedura;
end;

type
TObject2 = class
  private
    FObject1: TObject1;
    procedure InnaProcedura;
  public
    constructor Create(in_Object1: TObject1);
end;

var
  Object1: TObject1;
  Object2: TObject2;

constructor TObject2.Create(in_Object1: TObject1);
begin
  inherited Create;

  FObject1 := in_Object1;
end;

procedure TObject2.InnaProcedura;
begin
  //żeby tu mi nie wybuchalo
  if Assigned(FObject1) then
    FObject1.JakasProcedura;
end;

//przyklad:
  Object2 := TObject2.Create(Object1);

I teraz, jeżeli gdzieś zostanie zwolniony FreeAndNil(Object1), to żeby w lini:

procedure TObject2.InnaProcedura;
begin
  //żeby tu mi nie wybuchalo
  if Assigned(FObject1) then
    FObject1.JakasProcedura;
end;

...object2 wiedział że object1 już nie istnieje (obecnie w FObject1 zostaje wskaźnik do obiektu). Nie zawsze wygodnie jest się bezpośrednio odwołać do zmiennej zadeklarowanej w var. Nie mogłem wymyśleć lepszego przykładu, ale chyba wiadomo o co chodzi?

0

Nie wiem czy dobrze zrozumiałem problem, ale próbowałeś może przy tworzeniu obiektu w konstruktorze przekazywać obiekt składowy przez referencję?:

    constructor Create(var in_Object1: TObject1);

Może to pomoże?

0

Chyba by pomogło (jestem w pracy, nie mam jak sprawdzić), ale jak taką referencje zapamiętać w obiekcie żeby inne procedury mogły sprawdzać czy nie jest nilem?

0

jesli obiekt wszedzie bedzie przekazywany przez referencje to wtedy bez problemu bedziesz mogl sprawdzic czy obiekt jest "nilem", mozesz tez uzyc wskanika do obiektu, choc ogolnie mi sie wydaje ze powinienes tak tworzyc obiekty by bylo z gory wiadome ze obiekt istniej badz nie, ale wszystko zalezy od Ciebie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1