尝试编写一个简单的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的任何输入,一些关键字。
答案 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);
通过标签或名称引用按钮。我通常使用动态创建的按钮数组。总是通过施放来检查你的“发件人”。还有其他方法来破解对象的信息,但它们是一条心痛的道路......大声笑。