C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[898] [Forms] Form에서 Close와 Hide차이는?
장성호 [nasilso] 10873 읽음    2009-06-30 01:23
TCustomForm 클래스에는 Form을 닫을때 쓰는 메소드로 Hide() 와 Close()라는게 있습니다.
문론 그밖에 다른방법도 있겠죠..

개인적으로 Close()를 많이 쓰는데..
Hide를 쓰는분도 가끔 있더군요..

이 두 함수의 차이점에 대해 살펴보겠습니다.

먼저 VCL소스를 보면 다음과 같습니다.

procedure TCustomForm.Hide; 
begin 
  Visible := False; 
end; 

procedure TCustomForm.Close; 
var 
  CloseAction: TCloseAction; 
begin 
  if fsModal in FFormState then 
    ModalResult := mrCancel 
  else 
    if CloseQuery then 
    begin 
      if FormStyle = fsMDIChild then 
        if biMinimize in BorderIcons then 
          CloseAction := caMinimize else 
          CloseAction := caNone 
      else 
        CloseAction := caHide; 
      DoClose(CloseAction); 
      if CloseAction <> caNone then 
        if Application.MainForm = Self then Application.Terminate 
        else if CloseAction = caHide then Hide 
        else if CloseAction = caMinimize then WindowState := wsMinimized 
        else Release; 
    end; 
end; 



Hide는 그냥 Visible=false 코드밖에 없습니다.

그런데 Close함수는 소스가 좀 기네요

Normal Form이 Show되어있는 상태에서 Close하면

1. QueryQuery를 호출한후에 ..
2. OnClose이벤트 핸들러가 걸려있으면 호출하고..
3. OnClose이벤트 Action결과값이 따라 동작합니다.
   OnClose이벤트 핸들러 함수가 걸려있지 않거나
   OnClose이벤트에서 Action을 수정하지 않으면  Hide를 호출합니다.
  
   Hide호출후에는 똑같겠죠  


여기까지는 많이들 아는 사실이구

자 이제 Close와Hide함수의 잘 모르는 부분을 살펴 보겠습니다.
Form이 ShowModal일경우
위 TCustomForm.Close함수를 잘 보면
FormState가 Modal일경우 다르게 동작합니다.

즉 ShowModal일경우 Form의 CloseQuery나 OnClose이벤트가 뜨지 않는다는것이죠 그리고 ModalResult값을 Default로 mrCancel을 return해 줍니다.

Button을 ModalResult를 이용하지 않고 Coding으로 Close하면서 ModalResult를 주려면
바로밑에 팁에 썼듯이 주의해야합니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=897

//다음과 같이 하면 안되고.. 
procedure TForm2.Button2Click(Sender: TObject); 
begin 
  ModalRsult:=mrYes; 
  Close; 
end; 

//다음과 같이 Close를 호출한뒤에 ModalResult값을 설정해줘야 합니다. 
procedure TForm2.Button2Click(Sender: TObject); 
begin 
  Close; 
  ModalRsult:=mrYes; 
end;        
  


TCustomForm의 ShowModal함수의 코드를 보면

메세지루프에서 빠져나오는 조건이 ModalResult값이 0 이 아닌경우에 빠져나옵니다.

(메세지루프에서 빠져나온다는것은 Disable된 폼들을 모두 Enabled시킨다는 뜻이고 함수를 종료한다는 뜻..)


그런데 폼이 ShowModal인 상황에서 Hide()로 폼을 닫으면 어떻게 될까요?
ModalResult를 주지 않았기때문에..
Diable된 폼은 여전이 Disable된 상태이구..
Forground폼은 visible=false되어버린다.

이렇게 되면 마우스로 아무폼도 접근할수 없는 상황에 빠지게 된다.


그럼..

+ -

관련 글 리스트
898 [Forms] Form에서 Close와 Hide차이는? 장성호 10873 2009/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.