如何使用Delphi TComboBox自动完成和限制列表
假设我想从英国城镇的大列表中选择“伦敦” 背景如何使用Delphi TComboBox自动完成和限制列表,delphi,combobox,autocomplete,Delphi,Combobox,Autocomplete,假设我想从英国城镇的大列表中选择“伦敦” 背景 Combo1.AutoComplete := true; Combo1.Style := csDropdown; 如果我先键入“l”,再键入“o”,再键入“n”,则首先选择以“l”开头的第一个项目,然后选择以两个字母“lo”开头的第一个项目,然后选择以“lon”开头的第一个项目。这正是我想要的行为——这是好的 然而,我也可以输入任何我喜欢的文本,无论它是否在列表中-这是糟糕的 背景 Combo1.AutoComplete := true; Com
Combo1.AutoComplete := true;
Combo1.Style := csDropdown;
如果我先键入“l”,再键入“o”,再键入“n”,则首先选择以“l”开头的第一个项目,然后选择以两个字母“lo”开头的第一个项目,然后选择以“lon”开头的第一个项目。这正是我想要的行为——这是好的
然而,我也可以输入任何我喜欢的文本,无论它是否在列表中-这是糟糕的
背景
Combo1.AutoComplete := true;
Combo1.Style := csDropdownList;
我不能输入任何我喜欢的文本,但只能从列表中选择一个项目-这很好
但现在,如果我键入“l”,后跟“o”,后跟“n”,它首先选择以“l”开头的第一个项目,然后选择以“o”开头的第一个项目和以“n”开头的第一个项目,而不是使用所有三个字母并选择以“lon”开头的第一个项目
我怎样才能同时做到这两件事
ie我想被限制在从列表中选择项目,但也能够开始打字,并让它选择我迄今为止键入的所有字母 下面是一个小技巧,用于在代码中控制组合框中的文本:
uses ... StrUtils;
...
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
var
s, t: string;
i, l: Integer;
f: Boolean;
begin
// Skip functional keys
if Key < ' ' then
Exit;
// Get text which can be in the combo after key pressed
i := ComboBox1.SelStart;
l := ComboBox1.SelLength;
t := ComboBox1.Text;
s := Copy(t, 1, i) + Key + Copy(t, i + l + 1, Length(t));
// Check is this text corresponds to the values list
f := False;
for i := 0 to ComboBox1.Items.Count - 1 do
if StrUtils.StartsStr(s, ComboBox1.Items[i]) then
begin
f := True;
Break;
end;
// If not - cancel key
if not f then
Key := #0;
end;
PS:用于组合1。样式:=csDropdown;案例使用第二个选项
Combo1.AutoComplete := true;
Combo1.Style := csDropdownList;
并将自动完成延迟从默认值500增加到稍大一点,以便用户有时间在自动完成开始之前键入第二个和第三个etc字符。添加一个onexit事件,检查itemindex>0,如果不通知用户,则通知用户?抱歉,我看不出这有什么帮助。如果选择了某个项目,则ItemIndex将始终大于0如果样式为csDropdown,用户可以输入任何他想要的内容,检查ItemIndex以查看他是否从列表中选择了某个项目?我将作为项目0,因此如果combobox1.ItemIndex=-1,则放置Combobobox1.ItemIndex:=0;在OnExit事件中。某种程度上可以工作,但不是很令人满意,因为用户仍然可以输入任何内容。我真的希望忽略非列表项。您的选项2适合我。我把它放在csDropDownList中,然后开始输入lon,它会转到以lon开头的任何地方。我用的是D7。你用的是什么版本?谢谢,但我想我可能会坚持加布里埃尔的评论,然后把我的评论回复给他。这个联合体有大约40000个城镇,所以整个目标是快速到达一个特定的城镇。让它在每次按下一个键时搜索所有40000个城镇,以及让组合框的内部做同样的事情可能会有点慢。