2016-03-01 12 views
0

Я пытаюсь отфильтровать список в Delphi с помощью поля «Редактировать», но он не работает. Вот мой код, основанный на событии OnChange в поле «Редактировать».Фильтрация списка с помощью поля «Редактировать»

procedure TReportDlgForm.FilterEditOnChange(Sender: TObject); 
var 
    I: Integer; 
begin 
    ListBox1.Items.BeginUpdate; 
    try 
    for I := 0 to ListBox1.Items.Count - 1 do 
     ListBox1.Selected[I] := ContainsText(ListBox1.Items[I], FilterEdit.Text); 
    finally 
    ListBox1.Items.EndUpdate; 
    end; 
end; 

Я надеюсь, что когда я наберу в своем поле редактирования, что элементы списка будут фильтроваться.

+0

* Фильтр * каким образом именно? Все, что вы делаете, - это выделение элементов в зависимости от соответствия текста. У вас есть MultiSelect включен в ListBox? Чего вы действительно пытаетесь достичь? Возможно, вы на самом деле пытаетесь скрыть несоответствующие элементы? Если это так, вам нужно будет оставить свой основной список строк отдельно от самого ListBox, тогда вы можете «Очистить»() 'ListBox и' Add() 'соответствующие элементы к нему по мере необходимости. Или сохраните отфильтрованные результаты в отдельном списке и используйте ListBox в виртуальном режиме, чтобы отобразить этот список. –

+0

@Remy - У меня нет MutiSelect включен в ListBox. Я хотел бы, чтобы пользователь вводил строку в поле «Редактировать», что отображаются только записи, содержащие эту строку, и несогласованные записи скрыты в ListBox. Например, предположим, что у меня изначально было 40 записей, отображаемых в ListBox. По мере того, как пользователь вводит в поле редактирования, количество записей в ListBox уменьшается, чтобы показывать только соответствующие записи в зависимости от того, что пользователь ввел в поле редактирования. – Hackbrew

ответ

2

Вы должны сохранять значения из своего списка в некоторой переменной и выполнять поиск в этой переменной, а не в элементах ListBox! В ListBox мы будем показывать результат поиска.

type 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    ListBox1: TListBox; 
    procedure Edit1Change(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    FList: TStringList; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

uses 
    System.StrUtils; 

{$R *.dfm} 

procedure TForm1.Edit1Change(Sender: TObject); 
var 
    I: Integer; 
    S: String; 
begin 
    ListBox1.Items.BeginUpdate; 
    try 
    ListBox1.Clear; 
    if Edit1.GetTextLen > 0 then begin 
     S := Edit1.Text; 
     for I := 0 to FList.Count - 1 do begin 
     if ContainsText(FList[I], S) then 
      ListBox1.Items.Add(FList[I]); 
     end; 
    end; 
    finally 
    ListBox1.Items.EndUpdate; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FList := TStringList.Create; 
    FList.Assign(ListBox1.Items); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    FList.Free; 
end;