我总是这样做(而且我经常这样做):
我有一个包含列表框项目的array of string 或TStringList。然后,在 Edit1Change 中清除 Items 属性并仅添加与编辑框中的文本匹配的字符串。
字符串数组
如果您使用字符串数组,例如
var
arr: array of string;
以某种方式初始化,如
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(arr, 3);
arr[0] := 'cat';
arr[1] := 'dog';
arr[2] := 'horse';
end;
那你就可以了
procedure TForm1.Edit1Change(Sender: TObject);
var
i: Integer;
begin
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear;
if length(Edit1.Text) = 0 then
for i := 0 to high(arr) do
ListBox1.Items.Add(arr[i])
else
for i := 0 to high(arr) do
if Pos(Edit1.Text, arr[i]) > 0 then
ListBox1.Items.Add(arr[i]);
ListBox1.Items.EndUpdate;
end;
这将只显示数组中包含 Edit1.Text 的那些字符串;字符串不需要以Edit1.Text开始。为此,请替换
Pos(Edit1.Text, arr[i]) > 0
与
Pos(Edit1.Text, arr[i]) = 1
TStringList
如果是TStringList,如
var
arr: TStringList;
和
procedure TForm1.FormCreate(Sender: TObject);
begin
arr := TStringList.Create;
arr.Add('cat');
arr.Add('dog');
arr.Add('horse');
end;
你可以的
procedure TForm1.Edit1Change(Sender: TObject);
var
i: Integer;
begin
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear;
if length(Edit1.Text) = 0 then
ListBox1.Items.AddStrings(arr)
else
for i := 0 to arr.Count - 1 do
if Pos(Edit1.Text, arr[i]) = 1 then
ListBox1.Items.Add(arr[i]);
ListBox1.Items.EndUpdate;
end;
区分大小写
上面的代码使用区分大小写的匹配,例如“bo”不会匹配“Boston”。为了让代码对大小写不敏感,写
if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(arr[i])) > 0 then
而不是
if Pos(Edit1.Text, arr[i]) > 0 then