C ++ Builder控制台应用程序:链接到基于__closure的方法

时间:2018-03-16 03:11:50

标签: closures console-application c++builder

首先,请原谅我的头衔。不确定如何提出这个问题:

我有一个应用程序需要转换为控制台应用程序(请注意,该应用程序可以作为VCL样式的Windows应用程序运行良好)。该应用程序使用一些具有回调函数的第三方小部件。但是,当我尝试编译它时,我无法转换......'错误,像这样:

  

无法转换' void(Tobject *,TErrorEventParams *)' to' TErrorEvent'

TErrorEvent定义为:

typedef void __fastcall (__closure* TErrorEvent)(System::TObject* Sender, TErrorEventParams *e);

导致错误的行是:

handler->OnError = errorHandler;

errorHandler的代码是:

void __fastcall errorHandler(System::TObject* Sender, TErrorEventParams *e)
{
    memoLine = e->Description;
    updateLog();
}

2 个答案:

答案 0 :(得分:2)

__closure类型是指向非静态类方法的指针。编译器不允许您在期望__closure的情况下分配独立的非类函数。它需要一个指向类对象方法的指针。 Karem的回答向您展示了实现这一目标的一种方法。

然而, IS 是一种使用非类函数的方法,使用帮助器TMethod结构(这是在幕后实现__closure的方式)。

首先,添加一个明确的'这个'事件处理程序的参数:

void __fastcall errorHandler(void *This, TObject* Sender, TErrorEventParams *e)
{
    memoLine = e->Description;
    updateLog();
}

然后像这样分配事件处理程序:

TMethod m;
m.Code = &errorHandler
m.Data = NULL; // any value you want to pass to the 'This' parameter...
handler->OnError = reinterpret_cast<TErrorEvent&>(m);

答案 1 :(得分:1)

查看此文档:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Closure

简而言之:

TErrorEvent被定义为指向类成员函数的指针。因此errorHandler必须声明为类成员函数。

实施可能看起来像这样:

class TMyClass
{
private:
    TMyHandler* handler;
    void __fastcall errorHandler(System::TObject* Sender, TErrorEventParams *e);
public:
    __fastcall TMyClass();
} my_dummy_class;

__fastcall TMyClass::MyClass()
{
    //handler has to be created
    handler->OnError = errorHandler; 
}

void __fastcall TMyClass::errorHandler(System::TObject* Sender, TErrorEventParams *e)
{
    memoLine = e->Description;
    updateLog();
}