2010-01-22 112 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();'功能,但我不知道我應該把它放在哪裏。

'void __fastcall TForm1::Button1Click(TObject *Sender){}'裏面?

我會很感激任何輸入,一些關鍵字谷歌太。

+0

把它放在TForm1類中。不要認爲動態生成方法是可能的。 – 2010-01-22 11:53:24

+0

但是我怎樣才能引用按鈕,這是動態創建'formQuiz',這也是動態創建的? – qlf00n 2010-01-22 12:02:47

回答

3

你可以做兩件事情,你既可以創建一個動作,並將其與按鈕相關聯,或者你可以做一個函數,像這樣:

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). 
    } 
} 

將其綁定到按鈕實例設置的OnClick財產btnDecToBin->OnClick = DynButtonClick請注意,該函數是在窗體Form1中。這將由於閉包的性質(編譯器特定的附加)而起作用。如果您在formQuiz之前刪除Form1而不刪除對單擊事件的引用,則會出現問題。在很多情況下,在這種情況下使用Action可能是一個更乾淨的解決方案。

編輯:在其他的方式來做到這一點,如果你有一個標準佈局爲您quizforms,你可以做一個自定義的TQuizForm類從TForm繼承。這樣,每次創建表單時都不必綁定事件。

+0

//找出哪個按鈕被按下: TButton * btn = dynamic_cast (Sender); 這不會告訴你哪個按鈕被按下了,如果發件人是/ a/TButton * – 2010-02-03 22:14:47

+0

那麼它就會是NULL那麼在那種情況下沒有按鈕被按下的權利? :)除了如果你添加這個函數作爲不是按鈕的對象的OnClick事件,我想你會在代碼中處理它。我提到的這一行確實告訴你哪個對象觸發了該事件,並且在按鈕的情況下它會告訴你哪個按鈕是這樣做的。答案就我所知道的正確。 – 2010-02-03 23:12:44

0

所有按鈕都具有正常的「事件」,您只需將它們引用到將要處理事件的方法即可。

例如:

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

- 並添加一個額外的方法來.CPP

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); 

參考由標籤或名稱的按鈕或者。我通常使用動態創建的一組按鈕。始終通過投射來檢查您的「發件人」。還有其他方法可以從對象中竊取信息,但它們是通向心痛的途徑......大聲笑。