delphi 使用编辑框筛选列表框

rsl1atfo  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(252)

我试图在 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;

我希望当我在编辑框中键入内容时,列表框中的项将被筛选。

gijlo24d

gijlo24d1#

您必须将列表框中的值保存在某个变量中,并在该变量中进行搜索,而不是在列表框项中!在列表框中,我们只显示搜索结果。

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;
yqkkidmi

yqkkidmi2#

TlistBoxItemItemData.detail中添加要搜索的值,然后调用以下代码:

procedure TmyForm.FilterLst(Astr: string);  
begin  
  MyListBox.FilterPredicate := function(X: string): Boolean  
    begin  
      var  
        str: String := Astr;  
      Result := Trim(str).IsEmpty or X.ToLower.Contains(str.ToLower);  
    end;  
end;

相关问题