환경: RAD Studio 2009 ( C++ Builder 2009)
답변 주셔서 감사합니다.
왜 그런 지는 모르겠지만.. OnDestory() 가 진행된 후 OnResize()를 타는 것은 확실한데요..
특이점이라면 MDIMain이라는 것 밖에 없는데요..
각 이벤트의 함수는 아래와 같습니다.
//---------------------------------------------------------------------------
// Form Close Event
void __fastcall TFormMain::FormClose(TObject *Sender, TCloseAction &Action)
{
// Clear Point List
m_PointList.ClearAllPoint();
// Serial port close
ApdComPort->Open = false;
// Resource released
if (m_pFormTest) { delete m_pFormTest; m_pFormTest = NULL; }
// Queue Empty
while ( G_pSoundQueue->Count() > 0 )
delete (CSoundMessage *) G_pSoundQueue->Pop();
m_bSoundThread = false;
G_pSoundEvent->SetEvent();
Sleep(100); // wait until all thread is terminated
delete G_pSoundQueue;
delete G_pSoundEvent;
Action = caFree;
}
//---------------------------------------------------------------------------
// Form Destory Event
void __fastcall TFormMain::FormDestroy(TObject *Sender)
{
// nothing to do..
//heaven2
OutputDebugString("MainForm FormDestory------------------------------------\n");
}
void __fastcall TFormMain::FormResize(TObject *Sender)
{
// Main Form Resize Check
if ( this->Width < MAINFORM_MIN_WEIDTH ) this->Width = MAINFORM_MIN_WEIDTH;
if ( this->Height < MAINFORM_MIN_HEIGHT) this->Height = MAINFORM_MIN_HEIGHT;
if ( m_pFormTest != NULL )
::SendMessage(m_pFormTest->Handle, WM_SIZE, NULL, NULL);
if ( m_pFormQuery != NULL )
::SendMessage(m_pFormQuery->Handle, WM_SIZE, NULL, NULL);
//heaven2
OutputDebugString("MainForm OnResize-------------------------------------\n");
}
//---------------------------------------------------------------------------
위의 실행 결과는 종료될 때 이런 로그를 찍어 냅니다.
Debug Output: DM Destory------------------------------------- Process NEOSCORE.exe (2240)
Debug Output: MainForm FormDestory------------------------------------ Process NEOSCORE.exe (2240)
Debug Output: MainForm OnResize------------------------------------- Process NEOSCORE.exe (2240)
알고보니 죽는 이유는 다른 곳에서이지만.. 이렇게 폼이 Destory된 후에도 OnResize()이벤트를 타는 게 조까
찜찜합니다.
장성호 님이 쓰신 글 :
: 기본적으로 OnDestory 이후에 OnResize이벤트가 발생하지 않는데 왜 발생하죠?
: 이상하네요
:
: bcb6도 rad2007도 Rad2010도 그렇지 않는데.. 2009만 그런가요?
: 2009안써봐서...
:
:
: 그리고 이미 ChildWindow가 없어졌다면 SendMessage로 메세지를 보낸들 받을수 있나요?
: 없어진 윈도우로 SendMessage한다고 해서 ..
: 메세지를 못받으니 아무 의미없는 동작이 될뿐이지 죽지는 않을텐데...
: 죽는다는것 또한 이상하네요
:
: 결론적으로 님의 코드와 아래 설명이 맞지 않느것 같습니다.
:
: 다시 코드와 함께 질문해 봐주세요
:
:
: 앗참 그리고
: Form에는 MDIChildCount와 MDIChildren이라는 프로퍼티가 있습니다.
: 저넘을 통해접근하면 SendMessage를 쓰지 않아도 될듯..
:
: 그럼..
:
:
: 땅주인 님이 쓰신 글 :
: : 환경: C++ Builder 2009
: :
: : MDI Main과 MDI Child 형태로 개발 중인데요..
: : MDI Main Form에서 화면 사이즈이 변화가 일어나면...
: : MDI Child에도 반영되게 하려고.. MDI Main의 OnResize 이벤트에서
: : MDI Child에 SendMessage()로 이벤트를 보내도록 해 놓았는데요...
: : 잘 돌아가기는 잘 되는데..
: :
: : MDI Main에서 프로그램 종료를 시키면 OnDestory()까지 잘 되고..
: : 왜? 왜? 왜.. OnResize()를 다시 한 번 호출을 하는 지..
: : 이미 없어진 MDI Child에 SendMessage를 하니.. 당연히 뒈지십니다..
: :
: : 왜 OnDestory()하고 난 다음에 OnResize()가 발생을 하는 지요?
: :
: : 축구 보느라...
: : 디버깅 하다가 졸다가.. 졸다가 디버깅하고..
: : 오후 내내 디버깅하면서 알아낸 게 이런 현상인데..대체 왜 이렇게 동작하는 지?
: : 설명을 좀...
: :
: : 감사합니다.