E2193错误问询:调用TComponent::GetComponent参数不足问题排查
问题描述
我尝试通过以下代码以编程方式从父容器中移除选中的组件(我可能错误使用了found,欢迎相关建议):
void __fastcall TScrollControlsListContainer::RemoveItem(TWinControl* ctrl) { // find control in vector containing TWinControl(s) std::vector<TWinControl*>::iterator found = std::find_if(FWinControls.begin(), FWinControls.end(), IsCtrl(ctrl)); if(found != FWinControls.end()) { Components->RemoveComponent(dynamic_cast<TComponent*>(found)); //[bcc32 Error] ScrollControlsListContainer.cpp(208): E2193 Too few parameters in call to '_fastcall TComponent::GetComponent(int)' Full parser context FWinControls.erase(found); } }
我对该错误感到困惑,因为根据以下帮助文档示例,RemoveComponent仅需一个参数:
void __fastcall TForm1::Button1Click(TObject *Sender) { int I; TComponent *Temp; Memo1->Lines->Add("Components removed: "); Form2->Memo1->Lines->Add("Components added: "); for (I = ComponentCount - 1; I >= 0; I--) { Temp = Components[I]; // Move only the components that are not controls. if (dynamic_cast<TControl *>(Temp) == NULL) { RemoveComponent(Temp); Memo1->Lines->Add(Temp->Name); Form2->InsertComponent(Temp); Form2->Memo1->Lines->Add(Temp->Name); } } }
我忽略了什么?
问题解答
错误的核心原因是你把迭代器found直接当成指针传入RemoveComponent,但迭代器本身不是指向元素的指针,必须对迭代器解引用,才能拿到容器中存储的TWinControl*对象。
修改后的代码如下:
void __fastcall TScrollControlsListContainer::RemoveItem(TWinControl* ctrl) { std::vector<TWinControl*>::iterator found = std::find_if(FWinControls.begin(), FWinControls.end(), IsCtrl(ctrl)); if(found != FWinControls.end()) { // 解引用迭代器拿到实际的TWinControl指针,再转成TComponent* Components->RemoveComponent(dynamic_cast<TComponent*>(*found)); FWinControls.erase(found); } }
额外补充几个注意点:
- 你代码里的
std::vector<FWinControl*>应该是笔误,实际应该写成std::vector<TWinControl*>,否则会因找不到FWinControl类型报错。 - 要确保
IsCtrl谓词函数实现正确,它需要接收TWinControl*参数并和传入的ctrl做比较,示例实现如下:struct IsCtrl { TWinControl* Target; IsCtrl(TWinControl* ctrl) : Target(ctrl) {} bool operator()(TWinControl* elem) const { return elem == Target; } }; - 由于
TWinControl是TComponent的子类,若能确定FWinControls中存储的都是有效TWinControl对象,可把dynamic_cast换成更高效的static_cast。
内容的提问来源于stack exchange,提问作者user16458899
相关产品推荐
相关产品推荐

