Мне всегда нравится это (и я делаю это довольно часто):
У меня есть array of string
или TStringList
, содержащий элементы списка.Затем в Edit1Change
я очищаю свойство Items и добавляю только те строки, которые соответствуют тексту в поле редактирования.
Array Of String
Если вы работаете с массивом строк, такиекак
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" не будет соответствовать "Бостону"", например.Чтобы код не был чувствителен к регистру, введите
if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(arr[i])) > 0 then
вместо
if Pos(Edit1.Text, arr[i]) > 0 then