在数据库开发中,有时候需要通过用户ID对用户查找,不过由于ID不好用,人们一般采取要求用户输入用户名,但用程序转化为ID。我想采取这样一种策略:在下拉列表框中,输入人名简写比如名称中各个字的开头字母,然后下拉框中显示出对应此简称的用户的相应信息,在用户选择后,把被选择用户的ID返回。
我想通过改进下拉列表框来实现,不过具体怎么做,还不清楚,大家能否给些建议?
我想通过改进下拉列表框来实现,不过具体怎么做,还不清楚,大家能否给些建议?
该窗体有一个edit用来输入你说的【用户开头字母】之类的;
下面是一个dbedit;其显示值由你在edit中输入的字母过虑组成;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function getpy(hzchar:string):char;
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.getpy(hzchar: string): char;
begin
case WORD(hzchar[1])shl(8)+WORD(hzchar[2]) of
$B0A1..$B0C4 : result:='A';
$B0C5..$B2C0 : result:='B';
$B2C1..$B4ED : result:='C';
$B4EE..$B6E9 : result:='D';
$B6EA..$B7A1 : result:='E';
$B7A2..$B8C0 : result:='F';
$B9C1..$B9FD : result:='G';
$B9FE..$BBF6 : result:='H';
$BBF7..$BFA5 : result:='J';
$BFA6..$C0AB : result:='K';
$C0AC..$C2E7 : result:='L';
$C2E8..$C4C2 : result:='M';
$C4C3..$C5B5 : result:='N';
$C5B6..$C5BD : result:='O';
$C5BE..$C6D9 : result:='P';
$C6DA..$C8BA : result:='Q';
$C8BB..$C8F5 : result:='R';
$C8F6..$CBF9 : result:='S';
$CBFA..$CDD9 : result:='T';
$CDDA..$CEF3 : result:='W';
$CEF4..$D188 : result:='X';
$D189..$D4D0 : result:='Y';
$D4D1..$D7F9 : result:='Z';
else
result:=char(0);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s:=getpy('新')+getpy('闻')+getpy('频')+getpy('道');
showmessage(s);
end;end.
不过,我感觉大家没有完全明白我的意思。我创建了一张person表,用于存储用户信息,其中与此问题相关的有3个字段:用户名,用户ID,用户名简拼。当然,一个简拼有可能对应多个用户,所以我这么设计:让用户输入用户名简拼,然后出来一个窗口,里面显示对应此用户简拼的所有用户信息,然后让使用者选择,在使用者选择后,把被选用户的ID记录下来!
你的想法与我的比较接近,但我想在你的基础上作如下改动:
1)在edit控件,当使用者输入完,按回车时,自动显示你所说的动态窗口,在用户选择结束时,此动态窗口自动关闭。
2)动态窗口的显示位置要挨着edit控件。最好在其下方,看起来像一个下拉列表框。
3)动态窗口只采用一个dbGrid控件,这样可以显示用户各种相关信息,以方便选择。并且,显示内容与上面edit控件的内容有关。
你觉得如何,你的实现方案的代码,可否让我参考一下?
用户的信息会很多,为了使用者选择,原有的列表只能显示一列,不太合适吧?
我也这么想,不过要重写那些事件不清楚呀!谁可以在这方面指导我一下?
直接一个ComboBox下拉列表
然后控制ComboBox的输入长度为姓名的缩写的最大长度,并且智能输入字母,也就是姓名的简写。然后在过滤出来的表中检索,得到对应名字的ID;建议建一个全局变量
var
XMSX:string;
用来存放缩写已用来下次找ID时使用具体如下:
//在ComboBox中添加姓名
procedure TForm1.ComboBox4DropDown(Sender: TObject);
var
XM:string;
i,j:integer;
begin
ComboBox4.Items.Clear;
j:=length(Trim(ComboBox4.Text));
XM:=Trim(ComboBox4.Text);
XMSX:=XM;
if j<>0 then
with Query_Name do
begin
Close;
SQL.Clear;
SQL.Add('Select * from Name where 缩写:=Sx');
ParamByName('Sx').AsString:=XM;
Open;
First;
while not Eof do
begin
ComboBox4.Items.Add(FieldByName('姓名').AsString);
Next;
end;
Close;
end;
end;
//检索ID在ComboBox的Select事件中写
procedure TForm1.ComboBox4Select(Sender: TObject);
var
IDofYours:String;
begin
with Query_Name do
begin
Close;
SQL.Clear;
SQL.Add('Select * from Name where 缩写:=Sx');
ParamByName('Sx').AsString:=XM;
Open;
Locate('姓名',ComboBox4.text,[loCaseInsensitive]);
IDofYours:=FieldByName('ID').AsString;
Close;
end;
end;IDofYours便是每个姓名所对应的缩写;在Select事件中,也可以选取所有的记录,然后使用Locate()定位。
procedure TForm_1.ComboBox4KeyPress(Sender: TObject; var Key: Char);
begin
if (not(key in ['A'..'Z']))and(not (key in ['a'..'z']))and(not(key=#8))then
key:=#0;
end;