用DbGrid制作edit录入时的下拉提示框

来源:互联网 发布:麻瓜编程简书 编辑:程序博客网 时间:2024/05/16 19:24
    http://www.week5.net   2004年12月01日  

在Delphi语言中提拱了不少数据输入的方法,如可从数据库中选择或人工输入的控件有:DBListBox、DBComboBox、DBLookupListBox、DBLookupComboBox等。但对于这样一个例子:数据库名为dm.db,其中有两个字段:
    代码:Code
    名称:Name
要求根据用户输入的代码,去获取该代码对应的名称。
 
    一般的用户并不知道代码和名称的对应关系,如让用户输入代码,选出对应的名称,由于上述的控件不能使操作人员看到代码和名称的对应关系,如让用户根据代码用下拉框去查找到对应的该条纪录的名称,将很难操作。
 
    根据这种情况,我编制了下面程序,把DBGrid做为Edit的下拉列表框辅助操作,在DBGrid中直观地显示出代码和名称的对应关系,并且能够根据用户录入代码的变化情况,随时更新DBGrid中的记录指针,使用户可以直观方便地点取所需要的名字,而且DBGrid是依据用户在Edit中输入代码时才显现,跳出Edit框即消失。这种方法既为用户录入提供了方便,又不影响界面的整体美观,效果不错。现把该程序提供给大家,你们可根据自己的需要,对程序进行加工处理,应用于程序开发中,希望起到抛砖引玉的作用。
 
【问题】:做这样一个小程序:让用户输入代码,然后将名称显示在窗体上。
 
1、首先我们可以建立一个Form,在此Form中增加控件:
 
Table : Table1,设置其属性对应代码库dm.db,并将Active置为True
DataSource : DataSource1, 设置其属性DataSet为Table1
Edit : CodeEdit,NameEdit分别对应代码输入框和名称显示框
DBGrid : DBGrid1, 设置其属性DataSource为DataSource1
并把CodeEdit的属性Text的值置空,NameEdit的属性Text的值置空。
 
2、对照以下语句,修改CodeEdit的OnEnter、OnExit、OnKeyDown、OnKeyUp事件:
 
  在CodeEdit的OnEnter事件如下:
  procedure TForm1.CodeEditEnter(Sender: TObject);
  begin
    if CodeEdit.text<>"" then
    begin
      CodeEdit.SelStart:=length(CodeEdit.text);
      Table1.locate("code", CodeEdit.text,[lopartialkey]);
    End;
  end;
 
  CodeEdit的OnExit事件如下:
  procedure TForm1.CodeEditExit(Sender: TObject);
  begin
  if activecontrol<>dbgrid1 then
  begin
    dbgrid1.Visible:=false;
    Table1.Locate("code",codeedit.text,[lopartialkey]);
    if Table1.Eof then
    begin
      dbgrid1.Visible:=true;
      exit;
    end;
    if not Table1.Eof then
    begin
      codeedit.Text:=Table1.fieldbyname("code").asstring;
      NameEdit.Text := Table1.fieldbyname("name").asstring;
    end;
  end;
  end;
 
CodeEdit的OnKeyDown事件如下:
Procedure Tform1.CodeEditKeyDown(Sender: TObject;var Key: Word;Shift: TShiftState);
var
  i:integer;
begin
  if (Table1.RecordCount>) then
  begin
    case key of 48..57:
    begin
      dbgrid1.Visible:=true;
      Table1.Locate("code",CodeEdit.text,[lopartialkey]);
    end;
    vk_next:
    if dbgrid1.Visible then
    begin
      i:=;
      while (not Table1.Eof) and (i<11) do
      begin
        Table1.Next;
        i:=i+1;
      end;
      CodeEdit.Text:=Table1.fieldbyname("code").asstring;
    End;
    vk_prior:
    if dbgrid1.Visible then
    begin
      i:=;
      while (not Table1.Bof) and (i<11) do
      begin
        Table1.prior;
        i:=i+1;
      end;
      CodeEdit.Text:=Table1.fieldbyname("code").asstring;
    end;
    vk_down:
    if dbgrid1.Visible then
    begin
      if not Table1.Eof then
      begin
        Table1.Next;
        CodeEdit.Text:=Table1.fieldbyname("code").asstring;
      end;
    end;
    vk_up:
    if dbgrid1.Visible then
    begin
      if not Table1.Bof then
      begin
        Table1.Prior;
        CodeEdit.Text:=Table1.fieldbyname("code").asstring;
      end;
    end;
  end;
  end
  else
    dbgrid1.Visible:=false;
  CodeEdit.SelStart:=length(CodeEdit.text);
end;
 
CodeEdit的OnKeyUp事件如下:
procedure Tform1.CodeEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Table1.RecordCount>) then
  begin
    if ((key>=48) and (key<=57)) then
      Table1.Locate("code",codeedit.text,[lopartialkey]);
    if (key=VK_back) and (codeedit.text<>"") then
      Table1.Locate("code",codeedit.text,[lopartialkey]);
    if (key=VK_BACK) and (codeedit.text="") then
      Table1.First;
    if (key=vk_down) or (key=vk_up) or (key=vk_prior) or (key=vk_next) then
      if dbgrid1.Visible then
        codeedit.Text:=Table1.fieldbyname("code").asstring;
  end
  else
    dbgrid1.Visible:=false;
    codeedit.SelStart:=length(codeedit.text);  
end;
 
本程序在Windows98+Delphi4.、5.下均调试通过。  


原创粉丝点击