2016-03-01 78 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

*以什麼方式完全過濾*您所做的只是基於它們是否與文本匹配來突出顯示項目。你在ListBox上啓用了'MultiSelect'嗎?你真的想完成什麼?也許你實際上試圖隱藏不匹配的項目呢?如果是這樣,你將不得不保持你的主要字符串列表與列表框本身分開,那麼你可以根據需要'清除'列表框和'添加()'匹配項。或者,將過濾的結果存儲在單獨的列表中,並使用ListBox以虛擬模式顯示該列表。 –

+0

@Remy - 我沒有在列表框中啓用MutiSelect。我希望用戶在編輯框中鍵入一個字符串,只有包含該字符串的條目出現,並且不匹配的條目隱藏在列表框中。例如,假設我最初有40個條目顯示在列表框中。當用戶在編輯框中鍵入內容時,列表框中的條目數將減少,僅顯示與用戶在編輯框中鍵入內容相匹配的條目。 – 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;