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

解决方案 »

  1.   

    你可以用一下DevExpress控件试试,那里面包括的控件可以实现你所要求的功能,你可以试一下。
      

  2.   

    把style设为csDropDown。procedure TMainForm.UpdateComboBox(MyComboBox: TCustomComboBox;
      MyADODataSet: TADODataSet; MyFieldName: String);//刷新ComboBox里的内容(从数据
                                                        集里取)
    begin
      if MyADODataSet.Active then
        MyADODataSet.Close;
      MyADODataSet.Active:= true;  MyComboBox.Clear;
      MyADODataSet.First;
      While not MyADODataSet.Eof do
        begin
          MyComboBox.Items.Add(MyADODataSet.FieldValues[MyFieldName]);
          MyADODataSet.Next;
        end;
    end;在窗体OnShow的时候初始化一下
    UpdateComboBox(ComboBox1, 数据集名称(TADODataSet), 字段名);procedure TMainForm.ComboBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      TFlatComboBox(Sender).DroppedDown:= true;
    end;
      

  3.   

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

  4.   

    to  HappyLifqd(姜福寿) 
    你用的是Delphi6吗?我在delphi6的控件集里,没有找到你所说的DevExpress控件,你能说的具体点吗?
      

  5.   

    我弄过一个类似的,直接一个ComboBox下拉列表style为csDropDown
    然后控制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()函数定位。在ComboBox的OnPress事件中限制只能输入字母或者可以删除已有的字母:
    同时为了控制姓名的简写全为大写或者小写,可以设置ComboBox的CharCase为
    ecLowerCase或者是ecUpperCase;
    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;