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
[54732] 감사합니다. 그런데 한가지 더 문제가..
펭귄 [] 1144 읽음    2008-10-01 15:52
감사합니다. 그런데 한가지 더 문제가 있는게.

세가지 방법중에 적절히 하나를 써서 차일드를 먼저 없애는 것은 알겠습니다.

그런데 버튼을 누르지 않고 윈도우 우측상단에 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                 감사합니다. 그런데 한가지 더 문제가.. 펭귄 1144 2008/10/01
54733                     Re:감사합니다. 그런데 한가지 더 문제가.. 장성호 1255 2008/10/01
54734                         감사합니다. 해결됐습니다.^^(냉무) 펭귄 1469 2008/10/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.