저도 질문을 잘못 이해 했군요
님께서 지금 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()되기 전에 더 먼저 불러지는 함수같은건 없나요