좀전에 Q&A게시판에 질문이 올라와서 답변해 드렸는데요...
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=59248
[Form위에 Control들이 Components[]배열에 없는경우]
Form의 Componet 및 Control들은
Form클래스에 있는 Components[] 배열에 대부분있습니다.
하지만
1) Form위에 있지만 Components[]배열에 없는 경우도 있구
2) 현재 Form위에 없고 다른 Form위에 있지만 현재Form의 Components[]배열에 있을수도 있습니다.
1번 경우는
동적생성을 할때 Owner를 Form으로 주지 않고 NULL이나 다른 Component를 줄때 발생하구요
TEdit *edt=new TEdit(NULL); // 이렇게 Control을 동적생성할때 생성자인자인 Owner를 form이 아닌경우
TEdit *edt=new TEdit(Panel1); //
edit->Parent = Panel1;
2번의 경우는
동적생성할때 Owner로 Form을 주었지만 다른 Form위에 Control을 올린경우에 발생합니다.
TEdit *edt=new TEdit(Form1); // 이렇게 생성후
edit->Parent = Form2->Panel1 ; //이런식으로 Owner인 Form1과같지 않는 다른 Form위에 올린경우..
이경우 Form2 입장에서는 자신의 Child인 Panel1위에 Edit가 있지만
Form2의 Components[]배열에는 없게되구
Form1의 입장에서는 자신의 Components[]배열에는 있지만
자신의 Form위에는 Edit가 없죠
[Form위의 모든 Control 일 순회]
위와같은 문제를 피하여서 Form위의 모든 Control을 일 회순 하면서 특정 class의 Control을 찾고자 한다면..
TWinControl에 있는 Controls[] 배열을 이용해서 찾으시면 됩니다.
아래코드는 특정 WinControl 부터 그 child 에서 TEdit를 찾아서 Text를 설정해주는 함수입니다.
//아래와 같이 재귀루프를 돌면서 찾아야 정확합니다.
void __fastcall SetEditText(TWinControl *ParentCtrl , String str)
{
if(ParentCtrl==NULL)return;
if(ParentCtrl->InheritsFrom(__classid(TEdit)))
{
((TEdit *)ParentCtrl)->Text=str;
}
for(int i=0;iControlCount ;i++)
{
if(ParentCtrl->Controls[i]->InheritsFrom(__classid(TEdit)))
{
((TEdit *)ParentCtrl->Controls[i])->Text=str;
}
else if(ParentCtrl->Controls[i]->InheritsFrom(__classid(TWinControl)))
{
SetEditText((TWinControl *)ParentCtrl->Controls[i],str);
}
}
}
//---------------------------------------------------------------------------
//다음과 같이 사용하면 됩니다.
void __fastcall TForm1::Button11Click(TObject *Sender)
{
SetEditText(this,"잘되나?");
//이렇게 하면 현재 폼위에 올려진 모든 TEdit 의 Text를 바꿔줍니다.
}
//---------------------------------------------------------------------------
[Form위의 모든 Control 일순회 2]
위 SetEditText 함수는 TEdit Control만 찾는 함수입니다.
좀더 범용적으로 특정 class를 찾고자 한다면 ..
다음과 같이 TMetaClass를 이용하시면 될것입니다.
//---------------------------------------------------------------------------
void __fastcall FindAllChildControl(TWinControl *ParentCtrl , TMetaClass *metaclass,TNotifyEvent CallBackFunc)
{
TNotifyEvent tvt;
if(ParentCtrl==NULL)return;
if(ParentCtrl->InheritsFrom(metaclass))
{
CallBackFunc(ParentCtrl);
}
for(int i=0;iControlCount ;i++)
{
if(ParentCtrl->Controls[i]->InheritsFrom(metaclass))
{
CallBackFunc(ParentCtrl->Controls[i]);
}
else if(ParentCtrl->Controls[i]->InheritsFrom(__classid(TWinControl)))
{
FindAllChildControl((TWinControl *)ParentCtrl->Controls[i],metaclass,CallBackFunc);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ControlOnFind1(TObject *Sender)
{
TEdit *edt=(TEdit *)Sender;
edt->Text="이쪽으로도 잘 오는가?";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ControlOnFind2(TObject *Sender)
{
TMemo *mmo=(TMemo *)Sender;
mmo->Lines->Add("이건 TMemo ? ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
{
FindAllChildControl(this,__classid(TEdit),ControlOnFind1);
FindAllChildControl(this,__classid(TMemo),ControlOnFind2);
}
위와같은 식으로 해서 ...
그럼...
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=393