Я всегда делаю так (и делаю это довольно часто):
У меня есть 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
person
Andreas Rejbrand
schedule
13.07.2010