You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:21:16