首先,请原谅我的头衔。不确定如何提出这个问题:
我有一个应用程序需要转换为控制台应用程序(请注意,该应用程序可以作为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();
}
答案 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();
}