Konstrukcja with i tworzenie obiektu

0

Często tworze obiekty i zaraz po tym używam konstrukcji with żeby nadać początkowe wartości itp.
Wyglada to tak:

  ObTest := TTest.Create( nil );
  with ObTest do
  begin
     Parent := Form1;
     top      := 100;
     left     := 500;
  end;

znalazłem na 4programmers, że można to zrobić też w taki sposób:

 
  with TTest.Create( nil ) do 
  begin
    Parent := Form1;
    top := 40;
    left := 57;
  end;

spodobał mi sie ten sposób, ale mam pytanie.
Jak odwołać się do tego obiektu poza with'em?
np. jak go później zniszczyć?
x.Free?
można go jakoś przypisać do zmiennej ObTest?

1

Jak odwołać się do tego obiektu poza with'em?
np. jak go później zniszczyć?

Nie możesz się do niego odwołać poza instrukcją wiążącą, bo to właśnie ona trzyma referencję do tego obiektu i jeśli go nie zwolnisz - wyciek pamięci gotowy;

Ta kontrukcja nadaje się tylko wtedy, gdy w tej samej procedurze/funkcji/zdarzeniu tworzysz obiekt i go usuwasz - wtedy nie musisz nigdzie przechowywać referencji do utworzonego obiektu, ale musisz pamiętać, by po użyciu go zwolnić:

with TTest.Create(nil) do
try
  // instrukcje na liście
finally
  Free();
end;

Jeśli potrzebujesz mieć dostępną w kilku procedurach/funkcjach/zdarzeniach referencję do tego obiektu - musisz ją wpisać do zmiennej:

ObTest := TTest.Create(nil);
with ObTest do
begin
  // instrukcje
end;

ale po zakończeniu korzystania z obiektu musisz go zwolnić:

ObTest.Free(); { lub } FreeAndNil(ObTest);

Tylko zmienna ta musi być w takim miejscu, żeby była widoczna zarówno przy tworzeniu, jak i zwalnianiu z pamięci - inaczej dostaniesz błąd kompilacji undeclared identifier "ObTest".

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