在数据库开发中,有时候需要通过用户ID对用户查找,不过由于ID不好用,人们一般采取要求用户输入用户名,但用程序转化为ID。我想采取这样一种策略:在下拉列表框中,输入人名简写比如名称中各个字的开头字母,然后下拉框中显示出对应此简称的用户的相应信息,在用户选择后,把被选择用户的ID返回。
我想通过改进下拉列表框来实现,不过具体怎么做,还不清楚,大家能否给些建议?

解决方案 »

  1.   

    我一般是在edit后边放一个dockbutton;点击后弹出一个动态生成的窗体;
    该窗体有一个edit用来输入你说的【用户开头字母】之类的;
    下面是一个dbedit;其显示值由你在edit中输入的字母过虑组成;
      

  2.   

    从汉字来得到首字母的方法,你再扩展一下应就可以满足你的需求了.unit Unit1;interfaceuses
      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.
      

  3.   

    看了大家的回复,很有启发,再次谢谢大家!
    不过,我感觉大家没有完全明白我的意思。我创建了一张person表,用于存储用户信息,其中与此问题相关的有3个字段:用户名,用户ID,用户名简拼。当然,一个简拼有可能对应多个用户,所以我这么设计:让用户输入用户名简拼,然后出来一个窗口,里面显示对应此用户简拼的所有用户信息,然后让使用者选择,在使用者选择后,把被选用户的ID记录下来!
      

  4.   

    to  47522341(睡到8:30) 
    你的想法与我的比较接近,但我想在你的基础上作如下改动:
    1)在edit控件,当使用者输入完,按回车时,自动显示你所说的动态窗口,在用户选择结束时,此动态窗口自动关闭。
    2)动态窗口的显示位置要挨着edit控件。最好在其下方,看起来像一个下拉列表框。
    3)动态窗口只采用一个dbGrid控件,这样可以显示用户各种相关信息,以方便选择。并且,显示内容与上面edit控件的内容有关。
    你觉得如何,你的实现方案的代码,可否让我参考一下?
      

  5.   

    to pankun(剑神一笑) 
    用户的信息会很多,为了使用者选择,原有的列表只能显示一列,不太合适吧?
      

  6.   

    to whitetiger8(蜗牛[我要一步一步往上爬]) 
    我也这么想,不过要重写那些事件不清楚呀!谁可以在这方面指导我一下?
      

  7.   

    我现在弄过一个类似的,但是我没有用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()定位。
      

  8.   

    接上面,在ComboBox的OnPress事件中限制只能输入字母或者可以删除已有的字母:
    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;