首页 > 其他分享 >delphi dev cxLookupComboBox 模糊搜索

delphi dev cxLookupComboBox 模糊搜索

时间:2023-11-19 10:12:55浏览次数:35  
标签:cxLookupComboBox end delphi begin DataController FEdit dev Properties KeyIndex

//不是过滤DATASET,适合用在下拉数据很多的情况。过滤的必须是下拉有添加的列
procedure cxLookupComboBoxLikeSearchInitPopup(Sender: TObject);
var
 FEdit: TcxLookupComboBox absolute Sender;
 i: integer;
begin
// if FEdit.Properties.IncrementalSearch then
//  FEdit.Properties.IncrementalSearch := False;
 with FEdit.Properties.DataController, Filter do
 begin
  Clear;
  Options := [fcoCaseInsensitive]; //不区分大小写
  Root.BoolOperatorKind := fboOR;
  if Root.IsEmpty then
  begin
   //提前加载过滤条件
   for i := 0 to FEdit.Properties.ListColumns.Count -1 do
    Root.AddItem(FEdit.Properties.ListColumns[i], foLike, '', '');
  end;
  Active := False;
 end;
end;

procedure cxLookupComboBoxLikeSearchChange(Sender: TObject);
var
 FEdit: TcxLookupComboBox absolute Sender;
 i: integer;
 InputText :string;
 KeyIndex: integer;
begin
 if FEdit.Tag = 1 then
  Exit;
 InputText := FEdit.Text;
 with FEdit.Properties.DataController, Filter do
 begin
  if (InputText = '') then
  begin
   Active := False;
   Exit;
  end;
  if not Root.IsEmpty then  //第一次用滚轮的话没有触发 oninit所以不能执行下面的
  begin
   try
    //要加beginupdate endupdate 不然下面获取相关FocusedIndex 不会刷新
    FEdit.Properties.Grid.BeginUpdate;
    Active := False;
    for i := 0 to FEdit.Properties.ListColumns.Count -1 do
     TcxFilterCriteriaItem(Root.Items[i]).Value := '%'+FEdit.Text+'%';
    Active := True;
   finally
    FEdit.Properties.Grid.EndUpdate;
   end;
   //过滤有符合条件的数据
   if FEdit.Properties.DataController.RowCount > 0 then
   begin
    //没有选中,重新找一下keyindex 比如1584- 有匹配到数据,然后退格删掉-  这时就没有选中了。这个是BUG这里要处理一下
    if FEdit.Properties.DataController.GetSelectedCount = 0 then
    begin
     //重新找一下
     KeyIndex := FEdit.Properties.DataController.FindRecordIndexByText(0, FEdit.Properties.ListFieldIndex,InputText, True, False, True);
     {
     说明:

     FEdit.Properties.DataController.FocusedDataRowIndex
     //可以理解为表格看得见的焦点index,表格有可能会过滤。FocusedDataRowIndex 目前看到的效果是等价FocusedRowIndex
     FEdit.Properties.DataController.FocusedRowIndex
     //所有数据的焦点index,拿数据用这个。如果要拿表格当前视图的就可以
     FEdit.Properties.DataController.FocusedRecordIndex

     获得的KeyIndex是所有记录的index这里过滤了所以要转换成过滤后的index
     比如222# 在没有过滤的情况index=10 过滤出来只有5条记录他是排在第2条
     这里设置的FocusedRowIndex 是基于过滤出来的数据,所以应该设置2才对
     需要通过 FilteredIndexByRecordIndex 转换一下

     }
     if KeyIndex <> -1 then
     begin
      KeyIndex := FEdit.Properties.DataController.FilteredIndexByRecordIndex[KeyIndex];
      //设置回焦点行,同步一下
      FEdit.Properties.DataController.FocusedRowIndex := KeyIndex;
      FEdit.Properties.Grid.SyncSelected(True);
     end;
    end
    else
     KeyIndex := FEdit.Properties.DataController.FocusedRowIndex;
    //DEV内部处理 FEdit.Properties.Grid.TopRowIndex 的有问题,上面都是定位到FocusedRecordIndex
    //但是没有显示选中,是因为看不见。这里重新去调用处理一下
    FEdit.Properties.Grid.MakeRowVisible(KeyIndex);
   end;
  end;
 end;
end;

procedure cxLookupComboBoxLikeSearchCloseUp(Sender: TObject);
var
 FEdit: TcxLookupComboBox absolute Sender;
begin
 //没有数据行,又有内容.过滤失败
 if (FEdit.Properties.DataController.RowCount = 0) and (FEdit.Text <> '') then
 begin
  FEdit.Tag :=1;
  FEdit.Text := '';
  //这里可以写上修改ado的值 这里只是写个模板而已
  FEdit.Tag := 0;
 end;
 FEdit.Properties.DataController.Filter.Active := False;
end;

procedure cxLookupComboBoxLikeSearchEditValueChanged(Sender: TObject);
var
 FEdit: TcxLookupComboBox absolute Sender;
 KeyIndex: integer;
 InputText: string;
begin
 if FEdit.Tag =1 then
  Exit;
 try
  FEdit.Tag := 1;
  KeyIndex := -1;
  if FEdit.Text <> '' then
   KeyIndex := FEdit.Properties.DataController.FocusedRecordIndex;
//  Value1 := '';
//  Value2 := '';
  if KeyIndex <> -1 then
  begin
   //这里只写示例,取第一列,第二例的值。
//   Value1 := FEdit.Properties.DataController.Values[KeyIndex, 0];
//   Value2 := FEdit.Properties.DataController.Values[KeyIndex, 1];
  end
  else
    FEdit.Text := '';
  //同步修改ado的值
//  ADOQuery2.Edit;
//  ADOQuery2.FieldByName('xx').Value := Value1;
//  ADOQuery2.FieldByName('xx').Value := Value2;
//  ADOQuery2.Post;
 finally
  FEdit.Tag := 0;
 end;
end;

用之前请设置 Properties.IncrementalSearch,不要开启gridmode

适合场景为:下拉数据很多的情况下,一般下拉的数据来源都是用dataset。
当下拉数据有3W条时,非常卡。

DEV版本为: devcl20120105

标签:cxLookupComboBox,end,delphi,begin,DataController,FEdit,dev,Properties,KeyIndex
From: https://www.cnblogs.com/BTag/p/17841658.html

相关文章

  • 小甲鱼Delphi教程37课《读写修改记录型文件》源码
    说明:本程序用delphi10.4重写编写一、最后效果二、源码1unitUnit1;23interface45uses6Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,7Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,V......
  • vscode devcontainer 配置方法
    在vscode中,可以在.devcontainer内使用配置文件设定项目应该使用什么类型的容器进行开发。官方教程DevelopinginsideaContainerusingVisualStudioCodeRemoteDevelopment配置方法左下角OpenaRemoteWindow——添加开发容器配置文件——接下来是一些细节选......
  • delphi:传递参数的几种方式(转载)
     原文地址:https://www.delphitop.com/html/chengxu/2732.html一、默认方式以值方式传递参数 procedure TForm1.ProcNormal(Value: string);   begin   OrigNum:=Value+' Me';   lblReturn.Caption:=OrigNum;//OrigNum为'Hello Me'   lblOrig.Caption:=Val......
  • /usr/bin/perl: symbol lookup error: Devel/Size/Size.so: undefined symbol: Perl_
     001、perl报错如下:/usr/bin/perl:symbollookuperror: Devel/Size/Size.so:undefinedsymbol:Perl_xs_apiversion_bootcheck 002、 ......
  • Can't locate Devel/Size.pm in @INC (you may need to install the Devel::Size modu
     001、perl模块报错如下:Can'tlocateDevel/Size.pmin@INC(youmayneedtoinstalltheDevel::Sizemodule) 002、解决方法:安装该模块(base)[b20223040323@admin1003_annotation]$cpan-iDevel::Size##使用cpan安装 003、检测一下文档:(base)[b20......
  • vs2022安装dev控件工具箱不显示
    我的vs版本是2022的,然后第一次安装dev控件我下的是20.2版本的。安装完了之后工具箱中一直没有显示dev相关控件。然后我尝试过修复,还是没有达到目的。试过网上的办法“ToolboxCreator.exe/ini:toolboxcreator.ini”,还是没用。我以为版本太新了,然后我网上找了个15.2的安装。安装完......
  • dev 新增se权限
    使用情景:使用指令抓取avclog,在对应.te文档下对应添加se权限当untrustedapp_30.te新增以上权限,编译出现unknowntype,则考虑在untrustedapp_all.te下添加se权限以上方法尝试后仍出现以下报错提示;则考虑新增设备节点se权限类型 device/device.te定义tt......
  • DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(上)
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。DevExpressReports—跨平台报表组件,允许用户在针对任何基于.NET平台的应用程序中生成......
  • delphi 路径操作函数
    路径操作函数System.SysUtils.AnsiCompareFileName根据当前语言环境比较文件名。在Windows下不区分大小写,在MACOS下区分大小写。在不使用多字节字符集(MBCS)的Windows区域设置下,AnsiCompareFileName与AnsiCompareText相同。在MACOS和Linux下,AnsiCompareFile......
  • Log4Delphi日志学习
    转载请注明出处:https://www.cnblogs.com/coder163/p/9309717.htmlhttps://log4delphi.sourceforge.net/tutorial.htmlLog4D下载:官网地址导入Delphi:Tool-->Options-->EnvironmentOptions--->DelphiOptions--Library-->Librarypath 三个目录使用载入配置文件菜单--->P......