안녕하십니까?
폼을 동적생성합니다.
Form2 := TForm2.Create(Self);
그런데 위에 Create의 인자중에 Self, Application, Nil 이 들어가는 걸루 알고 있습니다...
예전에 "소유주"을 나타낸다고 사이트에서 읽었습니다..
그런데 실제루 어떤 차이가 있는지...
메인폼에서 Form2를 동적생성하구 Form2에서 또다른 폼을 동적생성하면서 Form2를 닫으면 Form2까지 같이 닫힙니다.
아래 소습니다.
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
Form3.Show;
Form2.close;
end;
그런데 Self를 Application으루 바꾸면 Form2는 닫히고 또 다른 폼이 제대로 동적생성됩니다....
어떤 이유인지 자세한 설명 부탁드립니다.
> 안녕하십니까?
> 폼을 동적생성합니다.
> Form2 := TForm2.Create(Self);
> 그런데 위에 Create의 인자중에 Self, Application, Nil 이 들어가는 걸루 알고 있습니다...
> 예전에 "소유주"을 나타낸다고 사이트에서 읽었습니다..
> 그런데 실제루 어떤 차이가 있는지...
> 메인폼에서 Form2를 동적생성하구 Form2에서 또다른 폼을 동적생성하면서 Form2를 닫으면 Form2까지 같이 닫힙니다.
> 아래 소습니다.
>
> procedure TForm2.Button1Click(Sender: TObject);
> begin
> Form3 := TForm3.Create(Self);
> Form3.Show;
> Form2.close;
> end;
>
> 그런데 Self를 Application으루 바꾸면 Form2는 닫히고 또 다른 폼이 제대로 동적생성됩니다....
>
> 어떤 이유인지 자세한 설명 부탁드립니다.
컴포넌트의 Create에 넣는 AOwner는 자신을 누가 소유할것인가를 정해주는것으로써
일단 소유자가 정해지면 그 컴포넌트의 Free는 신경쓰지 않아도 됩니다.
Form2 := TForm2.Create(Self);
이렇게 작성하셨다면 From2의 소유는 Self 즉, Self에 해당하는 폼이 되며
그폼이 가령 Form1이라면 Form1이 제거될때 Form2도 같이 제거 됩니다.
AOwner로 nil을 넣는경우는 거의 없으며 만약 nil을 넣는다면 free가 정확하게
수행되도록 직접 작성해줘야 합니다.
Application은 델파이의 숨겨진 메인윈도우로 기본폼은 Application의 소유입니다.
즉, Application이 제거되면 모든 폼이 제거된다는 뜻이지요.
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
Form3.Show;
Form2.close;
end;
위 소스에서 Self는 TForm2의 인스턴스입니다. 위에서 TForm2의 인스턴스로
사용된것은 Form2 뿐이고 Form3 은 Form2의 소유이므로 Form2가 닫힐때 Form3도
같이 닫히는것입니다.