cxLookupCombobox实现两列模糊查询

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即可。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值