如何编写一个函数Click()用于动态创建按钮?

时间:2010-01-22 11:49:17

标签: c++ c++builder vcl

尝试编写一个简单的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-&gt; Click();' func但我不知道我应该把它放在哪里。

在“void __fastcall TForm1::Button1Click(TObject *Sender){}”里面?

我会感谢Google的任何输入,一些关键字

2 个答案:

答案 0 :(得分: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窗体内。由于闭包的性质(编译器特定添加),这将起作用。如果您在Form1之前删除formQuiz而不删除对click事件的引用,则会出现此问题。在许多方面,在这种情况下使用Action可能是一个更干净的解决方案。

修改:除此之外,如果您的测验有标准布局,则可以创建一个继承自TQuizForm的自定义TForm类。这样,每次创建表单时都不必绑定事件。

答案 1 :(得分:1)

所有按钮都有正常的“事件”,您只需要将它们引用到您将处理事件的方法中。

示例:

...    
btnDecToBin->OnClick = &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);

通过标签或名称引用按钮。我通常使用动态创建的按钮数组。总是通过施放来检查你的“发件人”。还有其他方法来破解对象的信息,但它们是一条心痛的道路......大声笑。