在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>0) 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:=0; 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:=0; 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>0) 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.0、5.0下均调试通过。
(编辑:aniston)
|