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

C++빌더 Q&A
C++Builder Programming Q&A
[54733] Re:감사합니다. 그런데 한가지 더 문제가..
장성호 [nasilso] 1255 읽음    2008-10-01 17:06
음.. 그런문제가 있었군요
미처 그것은 확인못해 봤네요

[폼의 Close 이벤트 발생순서]
윈도우 캡션의 X 버튼을 클릭하면 WM_CLOSE 메세지가 발생합니다.

TForm은 이 메세지(WM_CLOSE)를 받아서 CloseQuery 를 호출하고

통과하면
OnClose이벤트가 발생시키고

통과하면
실제로 Close됩죠


[해결방법]
그러므로 폼에서  WM_CLOSE메세지를 잡으면 OnCloseQuery가 호출되기 직전이겠죠

// *.h 클래스 선언에서
class TForm1 : public TForm
{
    ......

    void __fastcall WndProc(TMessage &Msg);

};



// *.cpp 에서
void __fastcall TForm1::WndProc(TMessage &Msg)
{
    if(Msg.Msg==WM_CLOSE)  //WM_CLOSE 메세지를 잡아서 
    {
        for(;this->MDIChildCount>0;) //mdi child 폼을 모두 delete시킴
            delete this->MDIChildren[0];       
    }

    inherited::WndProc(Msg);
}



그럼...


펭귄 님이 쓰신 글 :
: 감사합니다. 그런데 한가지 더 문제가 있는게.
:
: 세가지 방법중에 적절히 하나를 써서 차일드를 먼저 없애는 것은 알겠습니다.
:
: 그런데 버튼을 누르지 않고 윈도우 우측상단에 X를 눌러서 종료하는 경우는 어떻게 해야하나요
:
: 장성호 님이 쓰신 글 :
: : 저도 질문을 잘못 이해 했군요
: :
: : 님께서 지금 MDI프로젝트에서 하는것이네요
: :
: : MDI 에서는 Main폼이 Close될때
: : MDIChildForm들에 OnCloseQuery를 모두 날려서 확인해본후에
: : 모두 OK하면 Close됩니다.
: :
: : 그럼 메인폼이 Close될때 프로그램이 바로 종료하는 방법은?
: :
: : 1. MDIChildForm에 CloseQuery를 호출하지 않게 하기
: :    ; MDIChildForm의 OnCloseQuery이벤트 핸들러에 NULL을 넣어주는 방법
: :
: : 2. MDIChildForm을 MainForm의 Close를 호출하기 전에 모두 delete시기는 방법
: :
: :
: : 3. 그냥 바로 Application을 terminate시키는 방법
: :
: : 등이 있겠네요
: :
: :
: : //방법1  OnCloseQuery이벤트가 MDIChidl폼에서 발생하지 않게 하는 방법
: : void __fastcall TForm1::Button3Click(TObject *Sender)
: : {
: :     for(int i=0;iMDIChildCount;i++)
: :     {
: :         this->MDIChildren[0]->OnCloseQuery=NULL;
: :     }
: :     Close();
: : }
: : //---------------------------------------------------------------------------
: : //방법2 메인폼이 Close되기전에 모든 MDIChildForm을 delete시키는 방법
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: :     for(;this->MDIChildCount>0;)
: :     {
: :         delete this->MDIChildren[0];
: :     }
: :     Close();
: : }
: : //---------------------------------------------------------------------------
: : //방법3. 그냥 프로그램을 바로 종료하는 방법
: : void __fastcall TForm1::Button4Click(TObject *Sender)
: : {
: :     Application->Terminate();
: : }
: : //---------------------------------------------------------------------------
: : 
: : 

: :
: : 방법3이 가장 심플하지만 상황에 맞게 사용하세요
: :
: : 그럼..
: :
: : 펭귄 님이 쓰신 글 :
: : : 아 제가 말을 좀 잘못했는데
: : :
: : : 메인에서 버튼을 누르면 실행되는건
: : :
: : : Close() 하나입니다.
: : :
: : : ShowMessage를 넣어서 확인해봤더니 차일드폼 OnCloseQuery에서 열리고 끝입니다.
: : :
: : :
: : :
: : : 좀 더 자세히 설명해드리면
: : :
: : : 차일드 폼의 OnCloseQuery()를 보면
: : :
: : : if(){....
: : : Timer1->enabled=true;
: : : CanClose=false;
: : : }
: : : else{
: : : CanClose=true;
: : : }
: : :
: : : 이런 식으로 되어있고
: : : Timer1는 기타 변수들을 바꿔준다음 다시 false로 되고
: : : 해당 차일드폼을 Close()해주는 식으로 되어있습니다.
: : :
: : : 차일드폼이 열려있을 때 처음 OnCloseQuery로 오면 CanClose 값이 false가 됩니다.
: : : 여기서 Timer1를 통해서 다시 Close()를 받아서(이 때는 CanClose가 true) 해당 차일드 폼은 닫히고 거기서 끝이더군요.
: : :
: : : 여기서 CanClose 값을 항상 true로 해봤는데 이 때는 종료에는 문제가 없더군요(수정해야할 값들이 수정이 안되겠지만).
: : :
: : : 설명이 난잡하군요.... -_-;
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 종료 누르면
: : : :
: : : : 차일드 폼을 먼저 닫는다고 했는데...
: : : :
: : : : 그냥 메인폼만 Close하세요
: : : : 그러면 차일드폼은 알아서 Close됩니다.
: : : :
: : : :
: : : : TCustomForm의 소스를 보면
: : : :
: : : : 현재 Close되는 폼이 Application->MainForm 일때
: : : :      Application->Terminate(); 를 호출합니다.
: : : :
: : : : Application->Terminate(); 는 프로그램을 종료한다는 뜻이죠
: : : :
: : : : 그럼..
: : : :
: : : :
: : : : 펭귄 님이 쓰신 글 :
: : : : : 안녕하세요
: : : : :
: : : : : 프로그램을 손보고 있는데
: : : : :
: : : : : 차일드폼이 열려있는 상태에서 프로그램 종료 버튼을 누르면 프로그램 종료가 되지 않네요.
: : : : :
: : : : : 살펴보니까
: : : : :
: : : : : 종료를 누르면 차일드 폼을 먼저 닫는데
: : : : :
: : : : : 차일드 폼의 onclosequery에서
: : : : :
: : : : : canclose가 false가 되는 경우 거기서 끝나네요.
: : : : :
: : : : : 원래 이렇게 되는건가요?
: : : : :
: : : : : 이걸 메인에서 종료를 하면 차일드폼이 다 닫히고 프로그램까지 종료가 되게 하고 싶은데
: : : : :
: : : : : 차일드폼 쪽에서 close()되기 전에 더 먼저 불러지는 함수같은건 없나요

+ -

관련 글 리스트
54728 차일드폼이 열려있을때 프로그램 종료 문제가... 펭귄 1197 2008/10/01
54729     Re:차일드폼이 열려있을때 프로그램 종료 문제가... 장성호 1233 2008/10/01
54730         Re:Re:차일드폼이 열려있을때 프로그램 종료 문제가... 펭귄 1354 2008/10/01
54731             Re:Re:Re:차일드폼이 열려있을때 프로그램 종료 문제가... 장성호 1366 2008/10/01
54732                 감사합니다. 그런데 한가지 더 문제가.. 펭귄 1145 2008/10/01
54733                     Re:감사합니다. 그런데 한가지 더 문제가.. 장성호 1255 2008/10/01
54734                         감사합니다. 해결됐습니다.^^(냉무) 펭귄 1469 2008/10/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.