谷歌喜欢Delphi的编辑/组合控制?

时间:2010-01-06 10:26:42

标签: delphi autocomplete combobox

每个人都可能知道我的意思,但澄清控制需要:

  • 用户编辑文本时触发事件。该事件将提供SuggestionList:TStrings,您可以填写匹配/建议。
  • 如果SuggestionList不为空,则应显示下拉列表。
  • 与组合不同,控件不应尝试自动选择/自动完成或以其他方式影响编辑。

那么,是否有这样的Delphi编辑/组合控件?

5 个答案:

答案 0 :(得分:24)

使用所有Windows编辑控件内置的autocompletion feature

首先,根据需要填充TStrings对象。然后使用GetOleStrings创建一个TStringsAdapter来包装它。 (适配器不声明TStrings对象的所有权,因此您必须确保在适配器仍处于活动状态时不销毁它。)适配器为您提供IStrings接口,您可以使用它我需要,因为自动完成功能需要IEnumString接口来提供完成匹配。请致电_NewEnum

接下来,调用CoCreateInstance创建一个IAutoComplete对象。调用其Init方法将其与编辑控件的窗口句柄相关联。如果您使用的是组合框,请发送cbem_GetEditControl消息以查找基础编辑窗口。

您可以在此时停止,自动填充应自动生效。您可以根据需要禁用自动填充,也可以设置任意数量的autocompletion options

你说你不想要自动完成,但在操作系统术语中,我认为你真正不想要的是自动附加,其中字符串的其余部分输入到编辑中在用户输入时自动选中框,但选择此选项以便进一步输入将覆盖它,如果所需的值短于其中一个匹配项,则用户需要删除多余的文本。

还有自动建议,它会显示建议的下拉列表。

您可以启用其中一个或两个选项。您不需要自己过滤建议列表;自动完成对象自行过滤IEnumString列表。

答案 1 :(得分:4)

您可以使用标准TComboBox和快绳字符串库(用于stringMatches()功能)。

procedure TForm1.cbChange(Sender: TObject);
var
  s:Integer;
  tmpstr:string;
begin
  //suggestions: tstringlist
  cb.AutoComplete:=false;
  tmpstr:=cb.Text;
  cb.Items.Clear;
  for s:=0 to suggestions.Count - 1 do
    if StringMatches(suggestions[s],cb.Text+'*') then
      cb.Items.Add(suggestions[s]);
  cb.DroppedDown:=(cb.Items.Count<>0) and (Length(cb.Text)<>0);
  cb.Text:=tmpstr;
  cb.SelStart:=Length(cb.Text)
end;

答案 2 :(得分:3)

如果您只想显示文件或网址列表:

SHAutoComplete(GetWindow(eb_MyComboBox->Handle, GW_CHILD), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYS_DIRS);

答案 3 :(得分:2)

我首先实现了这个功能,就像Rob在他的回答中描述的那样。后来我看到TComboBoxExAutoCompleteOptions属性,我将acoAutoSuggest设置为True,将acoAutoAppend设置为False。 ComboBox现在在进行一些输入时过滤其项目列表并显示匹配的项目。

我使用的是RAD Studio 10 Seattle和XE2,但不知道旧版本是否提供此功能。

答案 4 :(得分:1)

对于您的问题的最后一点:“那么,是否有一个像这样工作的Delphi编辑/组合控件?”:

聚会晚了一点,但是可以,我编写了一个免费的开源组件,该组件实现了Google Place Autocomplete和Google Place Details API:

它确实继承自标准TComboBox,但是您可以修改代码以与任何TEdit一起使用

https://carbonsoft.co.za/components/

https://github.com/RynoCoetzee/TRCGPlaceAutoCompleteCombo