在C++ Builder(FMX)中创建、触发和处理自定义事件的实现求助
C++ Builder(FMX) 自定义事件实现方案
首先明确核心问题:你误用了TEvent——它是线程同步对象(用于多线程间信号通知),和UI组件的事件回调机制完全无关,不能用来实现自定义事件。正确的自定义事件需要用C++ Builder特有的__closure类型来定义成员函数回调,这是VCL/FMX框架事件的标准实现方式。
1. Foo类的正确实现
#include <System.Classes.hpp> class Foo { public: // 定义事件类型:遵循FMX标准事件签名,__closure用于绑定对象实例 typedef void __fastcall (__closure *TBarEvent)(TObject* Sender); // 用__property封装事件,和原生组件事件用法对齐 __property TBarEvent Bar = {read=FBar, write=FBar}; Foo() : FBar(nullptr) {} private: TBarEvent FBar; // 存储事件回调的私有成员 // 触发事件的内部方法 void TriggerMethod() { // 触发前先检查事件是否已绑定,避免空指针调用 if (FBar) { // 传入当前Foo对象作为Sender,符合FMX事件惯例 FBar(this); } } };
2. FMX主窗体的事件绑定实现
// FMXMainForm单元的private区域 private: Foo* myFoobject = nullptr; // 事件处理方法:签名必须和Foo中定义的TBarEvent完全匹配 void __fastcall BarTender(TObject* Sender) { ShowMessage("Bar Mitzvah!"); // 通过Sender强转获取触发事件的Foo对象,可进一步处理逻辑 Foo* senderFoo = dynamic_cast<Foo*>(Sender); if (senderFoo) { // 此处添加针对Foo对象的处理逻辑 } } // 窗体构造函数 __fastcall FMXMainForm::FMXMainForm(TComponent* Owner) : TForm(Owner) { myFoobject = new Foo(); // 直接绑定事件:__closure会自动关联当前Form实例 myFoobject->Bar = &BarTender; } // 窗体销毁时释放Foo对象,避免内存泄漏 __fastcall FMXMainForm::~FMXMainForm() { delete myFoobject; }
额外说明
- 如果需要传递自定义数据,可以修改事件类型的签名,例如:
typedef void __fastcall (__closure *TBarEvent)(TObject* Sender, int CustomData);,触发时传入对应值即可。 - 所有事件处理方法必须遵循
__fastcall调用约定,这是VCL/FMX框架的标准要求。
内容的提问来源于stack exchange,提问作者Makaveli84
相关产品推荐
相关产品推荐

