标签:
我们在百度时,输入部分内容,即可获得输入项选择列表,从而大大减少录入,用户的体验很好,下面是用delphi 模拟这种效果的设计
定义
DataLst: TStringList;
用于存放供选择的数据。
Edt1:TEdit;
用于接收用户录入
lbSerach: TListBox;
用于显示提示列表
procedure FillData(DataLst: TStringList );
begin
......
end;
// 在选择列表中的按键处理
procedure TForm1.lbSerachKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i: Integer;
begin
if Key = 13 then // 回车键
begin
for i := 0 to lbSerach.Items.Count - 1 do // 查找用户选取的数据项
begin
if lbSerach.Selected[i] then
begin
edt1.Text := lbSerach.Items[i];
lbSerach.Visible := False;
edt1.SetFocus;
Exit;
end;
end;
end else
if Key = VK_UP then // 回到编辑框
begin
if lbSerach.ItemIndex = 0 then
begin
lbSerach.ItemIndex := -1; // 不起作用
lbSerach.Selected[0] := False; // 不起作用
edt1.SetFocus;
end;
end;
end;
// 编辑框内容变化处理
procedure TForm1.edt1Change(Sender: TObject);
var
i: Integer;
str: string;
begin
str := TEdit(Sender).Text;
lbSerach.Items.BeginUpdate;
lbSerach.Clear; // 清除以前的内容
for i := 0 to DataLst.Count - 1 do // 从可用数据中选出 匹配项 最多 15个
begin
if pos(str, DataLst[i]) > 0 then
begin
lbSerach.Items.add(DataLst[i]);
if lbSerach.Items.Count > 15 then
Break;
end;
end;
lbSerach.Items.EndUpdate;
lbSerach.Visible := lbSerach.Items.Count>0;
end;
// 编辑框按键处理
procedure TForm1.edt1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if lbSerach.Visible then
begin
if Key = VK_DOWN then
lbSerach.SetFocus;
lbSerach.Selected[0] := True;
end;
end;
标签:
原文地址:http://my.oschina.net/u/582827/blog/496743