C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[935] [VCL] Form위의 모든 Control 일순회
장성호 [nasilso] 8902 읽음    2009-11-26 19:24
좀전에 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);
}



위와같은 식으로 해서 ...

그럼...
장성호 [nasilso]   2009-12-07 03:58 X

+ -

관련 글 리스트
935 [VCL] Form위의 모든 Control 일순회 장성호 8902 2009/11/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.