모든 TCustomForm을 상속받은 폼은
TCustomForm의 생성자에서 TScreen의 Forms에 추가되고
TCustomForm의 소멸자에서 TScreen의 Forms에 Remove됩니다.
MDIChildCount 는 TScreen->Forms에서 FormStyle이 fsMDIChild 인것의 Count를 Return해주는것이죠
그렇다면 만약 MDIChild 폼인 TForm2가 있다고 할때
TForm2의 생성자에서 TForm(Owner)호출되면 TScreen->Forms에 생성된 폼이 추가되겠고
TForm2가 완전히 소멸되기 직전에 TScreen->Forms에서 빠지겠죠
폼에 있는 대부분이 이벤트는 TScreen->Forms에
Form이 Add 와 Remove 사이에 나옵니다.
FormActivate , FormDeactivate , FormDestroy 등등등
그러므로 Child폼에서 나는 이벤트에서는 MDIChildCount는 자신을 뺏 숫자가 나오지 않죠
-------------------------------------------------------------------------------
[해결방법]
방법 1. FormDestroy 이벤트에서 처리할때...
현재 Form만 빼고 철기하면 되겠죠 ..
void __fastcall TForm2::FormDestroy(TObject *Sender)
{
TForm *MDIForm=(TForm *)Owner;
for(int i=0,j=1;i<MDIForm->MDIChildCount;i++)
{
TForm *frm=MDIForm->MDIChildren[i];
if(frm==this)continue; //자신인 경우 처리하지 않는다..
frm->Caption="Child "+IntToStr(j++);
}
}
방법2. FormDestroy 이벤트에서 PostMessage로 MDI폼에다가 Message를 날려주세요
//MDI Child폼
void __fastcall TForm2::FormDestroy(TObject *Sender)
{
TForm *frm=(TForm *)Owner;
PostMessage(frm->Handle,WM_USER+1,0,0); //SendMessage가 아니라 PostMessage라는것이 중요함
}
//---------------------------------------------------------------------------
//MDI Parent폼
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER+1,TMessage,ChildDestoryed);
END_MESSAGE_MAP(TForm)
void __fastcall TForm1::ChildDestoryed(TMessage &Msg)
{
//여기서는 숫자가 제대로 remove된 숫자가 나옵니다.
for(int i=0;i<MDIChildCount;i++)
{
TForm *frm=this->MDIChildren[i];
frm->Caption="Child "+IntToStr(i+1); //처리
}
}
두번째 방법을 권합니다.
그럼
정성훈.해미 님이 쓰신 글 :
: 안녕하세요.
: 정성훈.해미입니다.
:
: 정말 오랜만에 질문 올립니다...^^*
:
: MDI 어플리케이션을 만들고 있는데
: 풀리지 않는 문제로 고민중이어서 도움을 요청합니다.
:
: MDIChildCount는 자식폼이 생성될때 카운트가 증가하고 자식폼이 제거된 후 카운트가 감소하더군요.
: ActiveMDIChild도 마찮가지로 자식폼이 생성된후 액티브되면서 해당 자식폼을 가리키고
: 액티브된 자식폼이 제거된후 변경됩니다.
:
: [고민]
: 자식폼이 액티브될때는 이미 MDIChildCount, ActiveMDIChild가 처리된 후라서 상관없는데.
: 자식폼이 제거될때는 MDIChildCount, ActiveMDIChild값을 사용하기가 좀 애매합니다.
:
: 제거된 후 변경되기때문에 이벤트 내에서 MDIChildCount, ActiveMDIChild값을 참고하여 사용할 수 가 없네요.
:
: 이 고민의 발단이된건
:
: 부모폼에 있는 액션중의 일부(50%)를 액티브된 자식폼에서만 활성화 시킬려고하는 것 때문입니다.
:
: 현재는 부모폼에 액션활성화 함수를 만들고
: 자식폼 액티브 이벤트와 디액티브이벤트에서 호출하게 해놨는데
: 액티브 이벤트에서는 잘되지만
: 디액티브 이벤트에서는 MDIChildCount, ActiveMDIChild값이 변하기전이라 원하는 동작이 나오지 않습니다.
:
: 부모폼에서 자식폼이 닫힌 후 발생하는 이벤트가 있을까요??
:
: 아시는 분 지식 조금만 나눠조세요~~~~~.
:
: 지금까지 두서없는 글 읽어주셔서 감사합니다.
:
: //----------------------------------------
: // ┏┓
: // ┣┻┓┏ ┃┃ 작은 생각이 세상을 바꾼다
: // ┃♡┃┣ ┣┫┏┓
: // ┗━┛┗ ┃┃┣┫┏┓┏┓ - 정성훈.해미
: // ━━━━━━━━━┣┛┣┛┗┫━━━━━━
: // Web Site:
http://www.hemistory.net
: // e-mail: sage5nor@chol.com
: //----------------------------------------