cxLookupCombobox这个第三方控件固然好用,但是不能多列模糊查询,输入关键字后全选的设定也很不人性。
在用Delphi开发的过程中几乎所有的查询界面都需要用到这个控件,但是由于上面所说的缺点造成用户的体验超级不好而想放弃这个控件,但是求助度娘也没找到更好的控件,因此百度了一下这个控件的多列模糊查询,找到唯一一个说实现模糊查询的,实践后发现体验依旧不好,而且不能多列模糊查询。经过对源码的理解后,终于修改实现两列模糊查询的效果。下面是具体的步骤。
第一,利用Everything等快速搜索工具搜索cxCustomData.pas这个文件,然后用Delphi打开它,也可以用Notepad等其他文本编辑工具打开,这个文件具体位置是:Developer Express Inc\ExpressDataController\Delphi 7\Sources 。打开文件后,定位到implementation下,uses StrUtils ,因后面用到AnsiContainsText这个字符查找函数。
CTRL+F查找DoIncrementalFilterRecord该函数,位于11769行,修改为如下代码:
function TcxCustomDataController.DoIncrementalFilterRecord(ARecordIndex: Integer): Boolean;
var
S1,S2: string;
begin
S1 := GetInternalDisplayText(ARecordIndex, Fields[0]);
S2 := GetInternalDisplayText(ARecordIndex, Fields[1]);
Result := AnsiContainsText(S1, FIncrementalFilterText);
Result := Result or AnsiContainsText(S2, FIncrementalFilterText);
end;
修改保存后,编译同目录下的cxDataD7.dpk
第二,搜索cxLookupEdit.pas这个文件,打开,然后CTRL+F查找Locate这个函数,481~492行的代码中,注释掉两行,如下所示:
if ARecordIndex <> -1 then
begin
DataController.ChangeFocusedRecordIndex(ARecordIndex);
DoSetCurrentKey(ARecordIndex);
Result := True;
S := DataController.DisplayTexts[ARecordIndex, AItemIndex];
// AText := Copy(S, 1, Length(AText));
// ATail := Copy(S, Length(AText) + 1, Length(S));
DoSetKeySelection(True);
end
else
DoSetKeySelection(False);
修改保存后,编译同目录下的cxEditorsVCLD7.dpk
第三,进入Developer Express Inc目录,双击运行SetupAllRuntimePackage.bat,以更新该控件的bpl
第四,打开Delphi7,拖一个cxLookupCombobox到界面,然后设置DropDownListStyle为lsEditList即可。