OrangeUI

ListBox过滤的思路如下:
遍历ListBox中的每个列表项,如果符合过滤条件,那么把列表项的Visible设置为True,反之,如果不符合过滤条件,就把列表项的Visible设置为False.
 
先准备如下界面,顶部放一个Panel,
上面放一个Edit用于输入过滤关键字,再在Edit上放一个ClearEditButton,
底下放一个ListBox,用于显示过滤结果,

接下来设置Edit的ReturnKeyType为Search,表示回车键上的字母设置为”Search”,
Edit的KillFocusByReturn设置为True,表示按回车键,Edit就失去焦点,隐藏虚拟键盘,
 
再写一个DoFilter方法,用于关键字过滤,
在方法中遍历每个列表项,判断关键字是否在列表项的Caption中,
如果存在,则设置这个列表项显示,如果不存在,则不显示,
并且加入简拼过滤的功能,在工程中用HzSpell.pas,
在OrangeProjectCommon\HzSpell目录中,
代码如下:

procedure TFrameListBox_FilterItems.DoFilter;
var
I: Integer;
AFilter:String;
AListBoxItem:TSkinListBoxItem;
begin
AFilter:=Trim(Self.edtFilter.Text);
 
//过滤
Self.lvGoodsList.Properties.Items.BeginUpdate;
try
 
for I := 0 to Self.lvGoodsList.Properties.Items.Count-1 do
begin
//名称过滤
Self.lvGoodsList.Properties.Items[I].Visible:=(
//没有输入过滤关键字,则全部显示
(AFilter='')
//关键字符合过滤条件
or (Pos(AFilter,Self.lvGoodsList.Properties.Items[I].Caption)>0)
//关键字符合过滤条件-简拼
or (Pos(LowerCase(AFilter),GetHzPy(Self.lvGoodsList.Properties.Items[I].Caption))>0)
);
end;
 
finally
Self.lvGoodsList.VertScrollBar.Prop.Position:=0;
Self.lvGoodsList.Properties.Items.EndUpdate;
end;
end;
 
 
然后在Edit的OnChange事件和OnChangeTracking事件中调用这个过滤方法DoFilter,

procedure TFrameListBox_FilterItems.edtFilterChange(Sender: TObject);
begin
DoFilter;
end;
 
procedure TFrameListBox_FilterItems.edtFilterChangeTracking(Sender: TObject);
begin
DoFilter;
end;
 
再在Edit.OnKeyUp事件中,也调用DoFilter,

procedure TFrameListBox_FilterItems.edtFilterKeyUp(Sender: TObject;
var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Key=vkReturn then
begin
//搜索
DoFilter;
end;
end;
 
然后我们运行一下这个示例:
初始状态下所有列表项都是显示的,

输入百威,效果如下:

输入简拼A,效果如下:

输入简拼bgz,白瓜子的简拼,效果如下: