|
방태윤 님이 쓰신 글 :
: 동적으로 버튼을 생성하는 방법을 알고 싶습니다.
:
: 새로운 폼 Form1 을 생성했다고 하고
:
: TForm1 *Form1;
:
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
: }
:
: void make_button();
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: make_button();
: }
:
:
: Tbutton *a;
:
: void __fastcall TForm1::A_func(TObject *Sender)
: {
: ShowMessage("A")
: }
: void __fastcall B_func(TObject *Sender)
: {
: ShowMessage("B")
: }
:
: void make_button()
: {
: a=new TButton(Form1);
:
: a->Top=10;
: a->Left=10;
: a->Width=100;
: a->Height=20;
: a->Visible=true;
: a->Parent=Form1;
: a->Caption="test";
: **********************
: a->OnClick=A_func;
: or
: a->OnClick=B_func;
:
: 음 여기서 부터 막히는군요..
: A_func 는 되는데 B_func 은 안되는군요.
: 근데 제가 사용하고자 하는 건
: a->OnClick=B_func; 인데 컴파일 에러입니다.
: 영원히 안되는게 당연한건지 잘 모르지만
: B 형태로 사용할려면 어떻게 해야 되는지
: 고수님들의 한수 지도 부탁합니다.
:
: }
:
: 감사합니다...끝.
:
안녕하십니까?
한꼬맹이 입니다.
1. a->OnClick=A_func;
2. a->OnClick=B_func;
1번은 되는데.. 2번이 왜 안돼냐하면 버턴의 OnClick이벤트는 TNotifyEvent형으로 선언되어
있기 때문입니다. 즉 4바이트짜리 두개 짜리 포인트가 대입되어야 제대로 돌아갑니다.
빌더에서 일반함수의 주소는 4바이트짜리 주소하나로 표현되지만 클래스내의 멤버함수는
4바이트짜리 두개의 주소로 표현됩니다. 그래서 2.번의 경우 제대로 돌아가지 않는 겁니다.
void __fastcall B_func(TObject *Sender) 일반 함수를 클래스 멤버함수로 바꾸어 주시면
아무문제 없이 잘 돌 아 갈겁니다.
그럼 참고하세요
|