Q&A

  • TForm.Create(nil), TForm.Create(Self), TForm.Create(Application)
Form1 : 메인폼이고 Form2는 서브폼(메인폼이 아닌 폼)이라 가정하고
Form1의 버튼 이벤트에서 Form2를 실시간으로 Create하고 Show해서 사용한다고 가정합니다.

1. AOwner를 nil로 설정.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(nil);
  Form2.Show;
end;

2. AOwner를 Self(Form1)으로 설정.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Show;
end;

3. AOwner를 Application으로 설정.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Application);
  Form2.Show;
end;

무엇이 가장 좋을 까요? 제 생각에는 1번은 지양해햐 하지 않나 하는 생각을 해 봅니다.

1번은 프로그래머가 알아서 해당 객체(Form2)를 명시적으로 Free해 줘야 합니다.
명시적으로 Free를 해 주지 않을 경우는 Create만 하고 Free가 되지 않은 상태에서 Application이 종료되기 때문에
응가하고 똥 안 닦은 상태에서 화장실을 나오는 것과 같다는 생각이 듭니다.
요즘은 OS가 좋아 져서 Free되지 않은 객체를 알아서 지워주기는 하지만,
(엄밀히 말해서 OS차원에서는 객체가 아니고 메모리겠지요)
예전에 DLL에서 폼 만들어서 사용할 때 명시적으로 Free를 안해 줘서 애를 먹었던 기억이 있습니다.

2번은 Form1이 Free될 때 Form2이 자동으로 Free됩니다.
가장 무난할 것 같습니다.

3번은 Application이 Free(종료?)될 때 Form2가 자동으로 Free됩니다.

2번과 3번의 뜻이 좀 헷갈립니다. 정확한 의미를 아시는 분이 있는지요?
1  COMMENTS
  • Profile
    타락천사 2003.04.23 18:34
    안녕하세여. 타락임다.

    잘 아실텐데, 2번은 보통 메인폼 을 owner 로 생성하는 경우 입니다. 프로젝트에서 첫번째 CreateForm() 을 호출한 폼이 메인폼 입니다.

    여러개의 폼(Window)을 가진 Application 에는 메인폼이 하나 존재 하므로
    2번과 3번은 거의 동일하게 작동합니다..

    다만, 콘솔프로그램과 같이 폼(Window)을 안가지고 있는 Application 에서는 메인폼이 없으므로, 2번과 3번이 다르게 작동할겁니다.

    또한 해당 폼에서 발생한 메세지가 3번은 Application 메세지 처리기로 갈테고, 2번은 TForm1의 메세지큐를 거쳐 Application 메세지 처리기로 가겠죠.

    즐푸하세여..

    타락천사..