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, 0, 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_BACK end; 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组合框功能.