我正在使用列表框来显示简单的文件名列表。我还有一个编辑组件,允许我通过简单的搜索这些项目:
procedure TForm1.Edit1Change(Sender: TObject);
const
indexStart = -1;
var
search : array[0..256] of Char;
begin
if edit1.Text='' then exit;
StrPCopy(search, Edit1.Text) ;
ListBox1.ItemIndex := ListBox1.Perform(LB_SELECTSTRING, indexStart, LongInt(@search));
end;
现在,有没有办法“有选择地”显示列表框中的项目?我的意思是,如果我搜索以“你好”开头的项目,那么只会显示那些将要打开的项目,或者显示那些而不是显示或者显示:=完全错误。 有没有办法用列表框执行此操作?
谢谢!
哦,这是Delphi 7 ......
答案 0 :(得分:7)
我总是喜欢这样(我经常这样做):
我有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
的字符串;字符串不需要以<{1}}开始。为此,请替换
Edit1.Text
与
Pos(Edit1.Text, arr[i]) > 0
如果是Pos(Edit1.Text, arr[i]) = 1
,则在
TStringList
和
var
arr: TStringList;
你可以做到
procedure TForm1.FormCreate(Sender: TObject);
begin
arr := TStringList.Create;
arr.Add('cat');
arr.Add('dog');
arr.Add('horse');
end;
上面的代码使用区分大小写的匹配,因此“bo”与“Boston”不匹配。要使代码对案例不敏感,请写
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;
而不是
if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(arr[i])) > 0 then
答案 1 :(得分:1)
您可以通过将标准Win32 API IAutoComplete接口连接到标准TEdit来实现您所要求的,不需要TListBox。将TStrings对象连接到IAutoComplete并不太困难,因此它知道哪些字符串可用于搜索。