每个人都可能知道我的意思,但澄清控制需要:
那么,是否有这样的Delphi编辑/组合控件?
答案 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在他的回答中描述的那样。后来我看到TComboBoxEx
有AutoCompleteOptions
属性,我将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/
或