You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:40:16