C++ 博尔兰c++;:将OnChange分配给另一个函数时出错?
我尝试将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),
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);
}