delphi – 需要一个带过滤的ComboBox

delphi – 需要一个带过滤的ComboBox,第1张

概述我需要某种类型的ComboBox,它可以从DB加载它的项目.当我输入一些文本时,它应该过滤它的列表,只留下那些将我的文本放在某处(开头,中间……)的项目.并非我的所有DataSet都具有过滤功能,因此无法使用它们.有没有准备好使用具有这种能力的组件?我试图在JVCL中搜索,但没有运气. 您可以尝试自定义常规ComboBox的自动完成功能.从数据库加载项目很简单: ComboBox1.Items.C 我需要某种类型的ComboBox,它可以从DB加载它的项目.当我输入一些文本时,它应该过滤它的列表,只留下那些将我的文本放在某处(开头,中间……)的项目.并非我的所有DataSet都具有过滤功能,因此无法使用它们.有没有准备好使用具有这种能力的组件?我试图在JVCL中搜索,但没有运气.解决方法 您可以尝试自定义常规ComboBox的自动完成功能.从数据库加载项目很简单:

ComboBox1.Items.Clear;       while not table1.Eof do begin      ComboBox1.Items.Addobject( table1.FIEldByname('Company').Asstring,TObject(table1.FIEldByname('CustNo').AsInteger) );      table1.Next;       end;

对于单词匹配的自动完成,您可以尝试调整this code.通过将autoComplete设置为true,可以启用在项目文本开头匹配的功能,并且需要在关闭之前关闭尝试编写自己完成的OnChange事件处理程序.我建议您可以更安全地在输入键上进行匹配和选择,因为尝试在运行中进行 *** 作会使事情变得非常毛茸茸,因为下面的代码将向您显示:

这是我的基本版本:使用带有onKeyDown的常规组合框和onChange事件,并将autoComplete设置为false,使用上面的代码填充它,以及这两个事件

procedure TForm2.ComboBox1Change(Sender: TObject);var  SearchStr,FullStr: string;  i,retVal,Foundindex: integer;  ctrl:TComboBox;begin  if fLastKey=VK_BACK then       exit;  // copy search pattern  ctrl := (Sender as TComboBox);  SearchStr := UpperCase(ctrl.Text);  Foundindex := -1;  if SearchStr<>'' then  for i := 0 to ctrl.Items.Count-1 do begin    if Pos(SearchStr,UpperCase(ctrl.Items[i]))>0 then    begin       Foundindex := i;       fsearchkeys := ctrl.Text;       break;    end;  end;  if (Foundindex>=0) then  begin    retVal := ctrl.Perform(CB_SELECTSTRING,LongInt(PChar(ctrl.Items[Foundindex]))) ;    if retVal > CB_Err then    begin      ctrl.ItemIndex := retVal;      ctrl.SelStart := Pos(SearchStr,UpperCase(ctrl.Text))+Length(SearchStr)-1;      ctrl.SelLength := (Length(ctrl.Text) - Length(SearchStr));    end; // retVal > CB_Err  end; // lastKey <> VK_BACKend;procedure TForm2.ComboBox1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);begin  fLastKey := Key;end;

假设列表的内容是“DavID Smith”和“Mark Smithers”.在DavID Smith中键入S并且它匹配姓氏的第一个字母.现在它显示DavID Smith未选择“DavID S”部分,并选择“mith”部分(以便您键入的下一个字符将替换自动完成部分,标准自动完成技术).请注意,上面的代码必须为您键入的S添加前缀,而不是您键入的“DavID”部分.如果你比我聪明得多,你可以找到一种方法来记住用户键入“s”然后,可能是“m”,然后是更多的字母,最后输入“Smithe”,匹配史密瑟斯,而不是大卫史密斯.另请注意,您只能设置SelStart和SelLength来选择连续长度的字符串.

我提供的代码仅在项目列表从不包含任何重复的子字符串时才起作用. windows Common Control组合框“自动完成”功能仅适用于前缀匹配,而不适用于中间字符串匹配,这是有充分理由的.

因为任何实现中间字符串匹配的东西都应该绘制你未键入的部分,并且由于未选择的部分将位于中间字符串中,你可能需要从头开始编写自己的控件而不依赖于TComboBox基本代码及其基础MS Common Controls组合框功能.

总结

以上是内存溢出为你收集整理的delphi – 需要一个带过滤的ComboBox全部内容,希望文章能够帮你解决delphi – 需要一个带过滤的ComboBox所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1243074.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存