C++ Builder 10.3中TAdvMemo/TScrMemo调用FindTextInMemo报E2285错误求解
解决C++ Builder 10.3中TScrMemo::FindTextInMemo的E2285匹配错误问题
问题重现
我在C++ Builder 10.3的窗体中使用TScrMemo组件实现文本查找功能时,遇到了如下编译错误:
[bcc32 error] Unit2.cpp (159): E2285 No match found for 'TScrCustomMemo :: FindTextInMemo (UnicodeString, TFindOptionEx)'
我的初始实现代码是这样的:
void __fastcall TForm2::BtnSearchClick(TObject *Sender) { String FSearch = EdtSearch->Text; Scripter->FindTextInMemo(FSearch,frDown); }
已知FindTextInMemo有两个重载签名:
int __fastcall FindTextInMemo(System::UnicodeString SearchStr, Vcl::Dialogs::TFindOptions Options)/* overload */; int __fastcall FindTextInMemo(System::UnicodeString SearchStr, TFindOptionsEx Options)/* overload */;
错误原因
问题的核心在于Delphi集合类型在C++中的处理差异:
frDown本质是Delphi集合TFindOptions的一个成员,但在C++中直接传递单个枚举值frDown时,编译器会尝试将其匹配到TFindOptionEx类型的参数(因为单个枚举值和这个类型的签名更“形似”)。- 但我们实际需要调用的是接受
Vcl::Dialogs::TFindOptions集合类型的重载,所以编译器找不到匹配的方法,就抛出了E2285错误。
解决代码
在C++中,需要显式构建TFindOptions集合对象,通过位操作符<<将frDown添加到集合中,这样就能匹配到正确的重载方法了。修正后的可编译代码如下:
void __fastcall TForm2::BtnSearchClick(TObject *Sender) { String FSearch = EdtSearch->Text; TFindOptions fn; fn = TFindOptions() << frDown; Scripter->FindTextInMemo(FSearch,fn); }
内容的提问来源于stack exchange,提问作者inapathtolearn
相关产品推荐
相关产品推荐

