VCL에서 동적으로 Control생성하는것은 쉽다.
C++Builder에서는 new , Delphi에서는 Create 하면 된다.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TButton *btn=new TButton(this);
btn->Left=10;
btn->Top=10;
btn->Caption="버튼";
}
위 코드에 중요한것 2가지가 빠져있다.
첫째로는 위치좌표는 잘 잡아줬지만.. 보여질 Parent 를 정해주지 않았다.
동적컨트롤 생성시 Parent 할당
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TButton *btn=new TButton(this);
btn->Left=10;
btn->Top=10;
btn->Caption="버튼";
btn->Parent=Panel1;
}
동적생성 컨트롤의 이벤트 할당
두번째로
컨트롤을 생성하여 그냥 화면에 보여지기만 하면 되는 컨트롤이라면 상관없지만
Button처럼 클릭에 무엇인가 동작하게 하려면
이벤트 핸들러를 걸어줘야 한다.
문론 함수는 미리 만들어 둬야 하구..
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TButton *btn=new TButton(this);
btn->Left=10;
btn->Top=10;
btn->Caption="버튼";
btn->Parent=Panel1;
btn->OnClick= Button1Click ;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(((TButton*)Sender)->Caption+" 클릭!");
}
초보자의 경우 컨트롤은 new해서 생성한후에
Parent를 정해주지않아 화면에 안보이거나
이벤트를 걸어주지 못해 헤메는 경우를 왕왕 보곤한다.
추가 : 09-01-12
동적생성 Control에 대해 FindComponent 사용하기
앗참 만약에 동적으로 생성한 Component나 Control의 경우
FindComponent 로 찾으려고 할경우 그냥은 찾아 지지 않습니다.
왜냐하면 동적으로 생성할경우 Component의 이름이 정해지지 않기때문입니다.
이경우 직접 중복되지 않는 이름으로 정해주면 됩니다.
btn->Name = "Button1";
//또는
btn->Name = "Button_"+ IntToSTr(idx);
그리고 Form의 경우 자동으로 Name이 생성되기도 하는데
만약 class가 TForm2 인경우
Form2 , Form2_1 , Form2_2 , ...등으로 이름이 자동으로 정해집니다.
그럼..