在网上看到以下文章,可能对财务的某个需求用帮助,先收藏起来慢慢学习
在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下均调试通过。