2010-01-22 5 views
0

목적을 교육하기위한 간단한 VCL 프로그램 작성 (동적으로 생성 된 양식, 컨트롤 등).함수 작성 방법 동적 생성 버튼()을 클릭 하시겠습니까?

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    TForm* formQuiz = new TForm(this); 
    formQuiz->BorderIcons = TBorderIcons() <<biSystemMenu>> biMinimize >> biMaximize; 
    formQuiz->Position = TPosition::poDesktopCenter; 
    formQuiz->Width = 250; 
    formQuiz->Height = 250; 
    formQuiz->Visible = true; 

    TButton* btnDecToBin = new TButton(formQuiz); 
    btnDecToBin->Parent = formQuiz; 
    btnDecToBin->Left = 88; 
    btnDecToBin->Top = 28; 
    btnDecToBin->Caption = "Dec to Bin"; 
    btnDecToBin->Visible = true; 
} 

나는 내가 동적 생성 버튼에 대한 기능을 쓸 수있는 방법을 궁금해하기 때문에 버튼을 클릭 할 때 호출 할 것이다 : 같은 샘플 코드가 있습니다. 이 예제에서는 'btnDecToBin-> Click();'이 필요합니다. func하지만 어디서 배치해야할지 모르겠다.

인사이드 'void __fastcall TForm1::Button1Click(TObject *Sender){}'?

어떤 입력을 주시면 감사하겠습니다. google도입니다. 당신은 두 가지 일을 할 수

+0

TForm1 클래스 안에 넣습니다. 동적으로 메소드를 생성 할 수 있다고 가정하지 마십시오. –

+0

하지만 동적으로 생성되는 'formQuiz'에서 동적으로 생성 된 버튼을 어떻게 참조 할 수 있습니까? – qlf00n

답변

3

, 당신은 작업을 생성하고 버튼과 연결하거나 기능과 같이 만들 수있는 수 중 다음의 OnClick을 설정하여 버튼 인스턴스에 바인딩

void __fastcall TForm1::DynButtonClick(TObject *Sender) 
{ 
    // Find out which button was pressed: 
    TButton *btn = dynamic_cast<TButton *>(Sender); 

    if (btn) 
    { 
     // Do action here with button (btn). 
    } 
} 

속성 btnDecToBin->OnClick = DynButtonClick이 함수는 Form1 양식 안에 있음에 유의하십시오. 이것은 클로저 (컴파일러 특정 추가)의 특성으로 인해 작동합니다. 클릭 이벤트에 대한 참조를 제거하지 않고 formQuiz 전에 Form1을 삭제하면 문제가 발생합니다. 이 경우에는 여러 가지면에서 Action을 사용하는 것이 더 깨끗한 솔루션 일 수 있습니다.

편집 : 당신이 당신의 quizforms에 대한 표준 레이아웃이있는 경우이 작업을 수행하는 다른 방법에은, 당신은 TForm에서 상속 사용자 정의 TQuizForm 클래스를 만들 수 있습니다. 이 방법으로 양식을 작성할 때마다 이벤트를 바인드하지 않아도됩니다.

+0

// 어떤 버튼이 눌 렸는지 알아 내기 : TButton * btn = dynamic_cast (Sender); 송신 버튼이/TButton 이외의 버튼 인 경우 어떤 버튼이 눌려 졌는지 알려주지 않습니다. * –

+0

그럴 경우 버튼을 누르지 않았습니까? :) 게다가 단추가 아닌 개체에 대해이 함수를 OnClick 이벤트로 추가하면 코드에서 처리 할 것입니다. 내가 언급 한 라인은 실제로 어떤 객체가 이벤트를 트리거했는지 알려주고, 버튼의 경우 어떤 버튼이 그렇게했는지 알려줍니다. 대답은 내가 옳다고 말할 수있는 범위까지입니다. –

0

모든 버튼에는 이벤트를 처리 할 방법을 참조해야하는 일반적인 "이벤트"가 있습니다.

예 :

...  
btnDecToBin->Click() = &Test; 

- 및

void __fastcall TForm1::Test(TObject *Sender) 
{ 

    TButton *btn = dynamic_cast<TButton *>(Sender); 

    if (btn->name == "your_button_name"){   
    // Do action here with button (btn).  
    } 

} 

및 .H

void __fastcall TForm1::Test(TObject *Sender); 

기준에 태그 또는 이름 버튼 중 하나를 cpp를 추가하는 수단을 추가 . 보통 동적으로 생성하는 버튼 배열을 사용합니다. 전송자의 성격을 항상 캐스팅하여 확인하십시오. 객체로부터 정보를 해킹하는 다른 방법들이 있지만, 그것들은 상흔의 경로입니다 ... LOL.

관련 문제