감사합니다. 그런데 한가지 더 문제가 있는게.
세가지 방법중에 적절히 하나를 써서 차일드를 먼저 없애는 것은 알겠습니다.
그런데 버튼을 누르지 않고 윈도우 우측상단에 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()되기 전에 더 먼저 불러지는 함수같은건 없나요