在C ++ Builder XE5中重载事件处理程序

时间:2014-04-25 23:32:55

标签: event-handling overloading c++builder

我想创建一个矩形按钮字段(使用列表)。 "细胞"在这个领域基本上是按钮,我唯一需要改变的是OnClick事件处理程序(我希望它检查一些按钮属性并根据它们采取一些行动)。 我之前在MSVS 2013中做了类似的事情,使用C ++ / CLR,我只是编写了我想用作事件处理程序的方法,将事件处理程序变量添加到" cell"构造函数,并将其指定为新的事件处理程序,同时填充"列表。 它看起来像这样:

·H

cell(<...>, System::EventHandler^ eh) : {
        <...>;
        Click += eh;
    }

的.cpp

List^ list = gcnew List(<...>, gcnew System::EventHandler(^Form1, &Form1::cell_Click));

先生。谷歌告诉我,在C ++ Builder中,托管对象的继承不仅仅是在类声明后写一个冒号,而是一个名为&#34;创建组件&#34;的过程。

由于我不需要重复使用这一小段代码,因此我不想创建任何软件包或使用现有软件包。所以我创建了一个单元。

问题是:

  1. header中编写事件处理程序声明的位置?
  2. .cpp file中编写事件处理程序实现的位置?
  3. 如何在我添加的项目中实际使用书面单位?我的意思是,我可以在项目文件中声明自定义继承类型的变量吗?

1 个答案:

答案 0 :(得分:1)

C ++ Builder使用C ++作为语言,而不是“托管C ++”。没有^指针类型,没有gcnew或“托管对象”。

要轻松创建事件处理程序,请在表单编辑器中选择该控件,然后按F11。这将打开Object Inspector。选择“事件”选项卡,然后双击要创建的处理程序。这将创建您需要的代码,您只需填写函数体。

如果双击该控件,它就是为该对象创建最常见的事件处理程序的快捷方式(实际上是OnClick的按钮,因此您只需双击按钮)。

(在旧版本的C ++ Builder中,如果你在函数体中输入任何东西之前保存了你的项目,它会非常友好地删除处理程序,这非常令人讨厌 - XE5不再这样做了。)

我不太明白你在一些帖子中谈到的是什么 - 你为什么要继承这个按钮?我从你的开头段落中想到,你只想在运行时创建一堆按钮,并实现OnClick处理程序。

如果你的意思是你只是想在运行时创建很多按钮,那么就可以这样做:

TButton *b = new TButton(this);   // 'this' will be responsible for deleting the button
b->Parent = this;    // `this` will be responsible for displaying the button
b->Caption = "hello";
b->OnClick = Button1->OnClick;
// set other properties

AFAIK没有简单的克隆按钮的方法。您必须创建一个这样的新按钮,然后从另一个按钮复制您想要的值。您未设置的属性将具有默认值。

如果您使用此方法(即在表单编辑器中生成Button1,然后将其OnClick复制到其他按钮),这很简单。实际上,您可以在使用它来自动生成OnClick处理程序并为您提供正确的函数签名后删除Button1

您还可以将指针存储到列表中的每个按钮,例如std::list<TButton *>。在执行此操作时请注意按钮生命周期:按钮的所有者是表单的事实意味着表单将在表单销毁期间删除它们。您不应该尝试自己删除这些指针,并且不应在表单销毁期间或之后使用它们。

在OnClick处理程序中,您可以通过执行以下操作获取指向其Button的指针:

TButton *b = dynamic_cast<TButton *>(Sender);

然后您可以使用按钮的b->Tag或其他属性来识别单击了哪个按钮。