c++ - 如何为动态创建的按钮编写函数 Click()?

标签 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->Click();' func 但我不知道我应该把它放在哪里。

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

我将不胜感激任何输入,一些 关键字 也适用于 google。

最佳答案

你可以做两件事,你可以创建一个 Action 并将它与按钮相关联,或者你可以像这样创建一个函数:

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 属性将其绑定(bind)到按钮实例 btnDecToBin->OnClick = DynButtonClick 请注意该函数位于表单 Form1 中。由于闭包的性质(编译器特定的添加),这将起作用。如果您在 formQuiz 之前删除 Form1 而不删除对单击事件的引用,则会出现问题。在许多方面,在这种情况下使用 Action 可能是更干净的解决方案。

编辑: 另一种方法是,如果您的测验表单有标准布局,您可以制作一个自定义的 TQuizForm 类继承自 TForm。这样您就不必在每次创建表单时都绑定(bind)事件。

关于c++ - 如何为动态创建的按钮编写函数 Click()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2116959/

相关文章:

delphi - 避免 SetFocus 引发异常

delphi - 识别鼠标光标下的组件不适用于 TImage 控件

c++ - 如何在项目编辑期间清除 QTreeView 中的背景?

c++ - 在 C++ Builder 10 中加载 DLL 时,变体或安全数组被锁定

c++ - 如何构建特定函数调用的图形?

C++ 构建器应用程序设置?

c++ - 如何通过双击处理文件打开,同时拒绝多个实例

c++ - unique_ptr<TStringList []> dsts(new TStringList[5]) 失败

c++ - 如何在cgal中加载COFF网格?

c++ - 有什么方法可以根据参数值进行函数签名匹配吗?