【问题标题】:how to write a function Click() for dynamic created button?如何为动态创建的按钮编写函数 Click()?
【发布时间】:2010-01-22 11:49:16
【问题描述】:

尝试为教育目的编写一个简单的 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){}”内部?

我会很感激任何输入,一些关键字也适用于谷歌。

【问题讨论】:

  • 把它放在 TForm1 类里面。不要假设动态生成方法是可能的。
  • 但是我怎样才能引用在'formQuiz'上动态创建的按钮,它也是动态创建的?

标签: c++ c++builder vcl


【解决方案1】:

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

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

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

【讨论】:

  • // 找出按下了哪个按钮: TButton btn = dynamic_cast(Sender);这不会告诉你按下了哪个按钮,如果 Sender 是/other than/ TButton,它只会为 NULL
  • 那么在这种情况下没有按下按钮对吗? :) 此外,如果您将此函数添加为非按钮对象的 OnClick 事件,我想您会在代码中处理它。我提到的那一行确实告诉你哪个对象触发了事件,如果是按钮,它会告诉你哪个按钮触发了事件。据我所知,答案是正确的。
【解决方案2】:

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

示例:

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

通过标签或名称引用按钮。我通常使用一组动态创建的按钮。始终通过投射来检查您的“发件人”。还有其他方法可以从对象中获取信息,但它们是令人心痛的途径……哈哈。

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多