Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 博尔兰c++;:将OnChange分配给另一个函数时出错?_C++_Function_Onchange_C++builder_Vcl - Fatal编程技术网

C++ 博尔兰c++;:将OnChange分配给另一个函数时出错?

C++ 博尔兰c++;:将OnChange分配给另一个函数时出错?,c++,function,onchange,c++builder,vcl,C++,Function,Onchange,C++builder,Vcl,我尝试将OnChange函数分配给另一个函数,如: XComp->OnChange = SycnroChange(prgManVoltageSet_SB->Address); 但编译器给出了错误:“不允许类型。” 我该怎么办?我不能这样分配吗?IIRC您可以在->onChange=xyz;其中xyz是另一个具有正确签名的函数(或成员函数)。你不能绑定参数之类的东西 因此,您应该首先更改SynchroChange签名(大多数事件处理程序只需要一个通用的TObject*Sender),

我尝试将OnChange函数分配给另一个函数,如:

XComp->OnChange = SycnroChange(prgManVoltageSet_SB->Address);
但编译器给出了错误:“不允许类型。”


我该怎么办?我不能这样分配吗?

IIRC您可以在->onChange=xyz;其中xyz是另一个具有正确签名的函数(或成员函数)。你不能绑定参数之类的东西


因此,您应该首先更改SynchroChange签名(大多数事件处理程序只需要一个通用的TObject*Sender),然后在该函数中查找prgManVoltageSet(除非可以从参数“Sender”中强制转换,但我没有足够的上下文)

根据您所说,我知道您的意图是希望在
XComp
更改时执行
SycnroChange(prgManVoltageSet\u SB->Address)
。 因此,我认为您可以使用带有
boost::signal2::signal
boost::bind
的回调函数,例如
boost::bind(&SycnroChange,this,_1)

XComp
更改时,您可以调用
回调(prgManVoltageSet\u SB->Address)
来触发并获取一个int。我希望这些可以帮助您。

您正在调用
SycnroChange()
并将其返回值分配给
OnChange
OnChange
事件需要一个指向符合
TNotifyEvent
签名的对象方法的指针:

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
SycnroChange()
的返回值为
void
。这就是错误

对于您正在尝试的内容,必须使用一个单独的事件处理程序方法,该方法在内部调用
SycnroChange()


什么是SychroChange?它只是一个函数,获取int
SychroChange
返回一个
int
?什么类型是
XComp->OnChange
?函数指针?XComp是spinedit,syncrochange是void,我的意思是什么都不返回。我只是希望当XComp更改时,必须触发SyncroChange。好的,您现在所做的是调用
SyncroChange
,并将
prgManVoltageSet\u SB->Address
作为参数,然后尝试将该调用的结果分配给
XComp->OnChange
。我尝试了XComp->OnChange=SyncroChange;就像这个和SyncroChange(TObject*发送者)。但发送方将为空:(你有权访问prgManVoltageSet_SB吗?如果有,你不需要强制转换Sender。在这种情况下,我建议查看OnChange的文档,看看它期望/需要什么。
XComp->OnChange=SycnroChange;
是正确的,但是
SycnroChange
必须更改为类中的这个声明:
void\u fastcall SycnroChange(TObject*Sender)
Sender
不应为空,因为每个组件(包括
TCSpinEdit
)将其
this
指针作为
Sender
值传递,这是该参数的全部用途。这允许您将相同的方法分配给多个事件,并知道哪个组件触发每个事件。这是正确的想法,但实现错误,因为您无法对VCL事件处理程序使用绑定函数。
__fastcall TGenerator::TGenerator(TComponent *Owner)
    : TForm(Owner)
{
    ...
    // FYI, you can assign this at design-time instead of in code...
    XComp->OnChange = &XComChanged;
    ...
}

void __fastcall TGenerator::XComChanged(TObject *Sender)
{
    SycnroChange(prgManVoltageSet_SB->Address);
}