본문 바로가기

Development/Delphi

Form 생성 및 해제

@ 첫번째 질문 -  Form생성방법의 차이점에 대해  
먼저 첫번째와 두번째에서 size조절부분은 빼고 생각하겠습니다.

1) 첫번째 
NewApp := TForm_Second.Create(Main_Form);

2) 두번째
Application.CreateForm(TForm_Second, Form_Second);

[공통점]
  - 먼저 공통좀은 둘다 TForm_Second 라는 클래스를 생성하는 합니다.
  뭐 이건 잘 아실테구..

[차이점들..]
   차이점은 의외로 여러개 있습니다.

  1) 첫번째는 NewApp 라는 변수에 생성된 폼이 할당되구
     두번째는 Form_Second라는 변수에 생성된 폼이 할당되는것이 다릅니다.

  2) 그리고 첫번째는 폼의 Owner가  Main_Form이구
     두번째는 Owner가 Application이 됩니다.

     VCL에서 Owner의 의미는 주인을 의미하며 주인이 죽으면 하인도 같이 생매장 하던 옛날 어느 나라의 풍습처럼
     첫번째의 경우 Main_Form이 free될때 생성한 Form_Second(NewApp)도 같이 free됩니다.
     둘째는 Application이 free될때 free되구요

  3) 또다른 차이점이 있는데..
     Application.CreateForm( ...  로 폼을 생성하는 경우
     앞서 Application.CreateForm(...로 생성된 폼이 없으면 그폼이 
     Application.Mainform이 됩니다.


@ 두번째 질문 - Form의 Onclose이벤트 핸들러에서
Action:=cafree 로 할경우에 대해..
TCloseAction는 Forms유닛에 다음과 같이 선언되어있습ㄴ디.
TCloseAction = (caNone, caHide, caFree, caMinimize);

기본저긍로 Action은 caHide로 되어서 넘어옵니다.   
Action 값을 건들지 않으면, 폼은 그냥  Hide됩니다.( 메인폼이 아닌경우에..)

caNone  => 아무동작하지 않음 ( 즉 폼이 닫히지 않음)
caHide   =>  폼이 Hide됨
caMinimize  =>    폼이 minimize됨
caFree           =>   폼이 free됨

폼이 Style과 관계없이 Form의 OnClose이벤트에서 
CloseAction을 caFree로 하면 폼이 자동으로 free됩니다.

[동작메커니즘에 대해 살짝 소개하면..]
// TCustomForm.Close함수 코드 일부 

procedure TCustomForm.Close;
  .....
      DoClose(CloseAction);       // OnClose이벤트 함수 호출
      if CloseAction <> caNone then                                                      // Action값이 None가 아닌데
        if Application.MainForm = Self then Application.Terminate   //현재폼이 메인폼이면  프로그램 종료
        else if CloseAction = caHide then Hide                                  //  Action이 caHide이면 폼을 visible=false시킴 
        else if CloseAction = caMinimize then WindowState := wsMinimized  // 폼을 minimize시킴
        else Release;        //Action=caFree이경우   폼을 free시킴 
      end;

  ......

end;


       1)   TCustomForm에서는 Form이 Close하고자 할때

              OnClose이벤트 핸들러가 등록되어있으면 OnClose이벤트 함수를 호출합니다.

              

             이때 TCloseAction 값을 Call By Reference 로 넘겨주는데 기본값을 caHide로 해서 넘깁니다.



        2)  OnClsoe이벤트 핸들러가 없으면 그냥 caHide로 동작하구요

              OnClose이벤트 핸들러에서 CloseAction값을 바꾸면 그값을 보고 동작을 달리하게 됩니다.

  

        3)  그냥에 caFree로 Action이 설정된경우에는 롬을 free시킵니다.

              위코드에서 procedure TCustomForm.Release; 함수에 가보면



           prcedure TCustomForm.Release;

           begin

                  PostMessage(Handle, CM_RELEASE, 0, 0);

           end;



         PostMessage로  자신에게 CM_RELEASE 메세지를 보냅니다.



        4) CM_RELEASE메세지 핸들러를 보면 다음과 같이 free 하고 있습니다.

              procedure TCustomForm.CMRelease;

              begin

                  Free;

              end;



       폼이 여러개 뜨더라고 각 폼이 Close될때 CloseAction에 caFree로 해주면 해당 폼은 자동 free됩니다.

       만약 에러창이 뜬다면 그것은 다른 문제일것입니다.

       (혹은 이미 free된것을 또다시 free하려고 할경우일수도 있구..)

'Development > Delphi' 카테고리의 다른 글

TComboBox/TDBComboBox.AddObject Integer, String, Object  (0) 2015.09.04
로컬 IP 가져오기  (0) 2015.08.25
TDataSet 관련 (TQuery, TFDQuery)  (0) 2015.08.24
프로퍼티, property  (0) 2015.08.21
DateUtils.pas 날짜함수  (0) 2015.08.13