如何使用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个城镇,以及让组合框的内部做同样的事情可能会有点慢。