§5.1 系统窗体模块组成
§5.2 数据模块窗体的设置
在编写数据库应用程序时,经常要遇到这样的情况,即好多组件、窗体同时访问相同的数据源,如果为每一个组件或者窗体都设置一个数据源将是十分耗时的工件,而且要保证这些数据源的确是相同的也需花一番功夫。那么,能不能将这些数据源集中管理,最好是做成一个统一的模块,需要时就将该模块引入而不必直接操作数据源本身呢?数据模块(DataModule)是解决这个问题最好的答案。简单说来,数据模块是用来集中管理数据源的一个窗体,该窗体可被需要的地方随时引入。
图5.2给出了本程序的数据模块(datamoduleform)窗体图,除报表窗体外所有的数据存取组件和数据源组件都在此数据模块中进行了定义。值得一提的是,设置了数据库Database组件,该组件引入了系统所需的唯一的数据库tsxs,Database组件的DatabaseName属性设置为tsckgl。tsxs数据库已在ODBC配置程序中进行了设置。其他的数据存取组件都是基于此数据库组件创建的,这样做的好处是,当数据库的别名或者其他信息改变之后,只需修改Tdatabase组件的AliasName属性即可。
另外,在本系统的数据模块窗体图中,我大多采用的AODQuery组件而没有采用BDE组,这主要是基于对ADO组件的了解。在Delphi的学习中我对ADO组件了解的更加清楚,使用也较BDE更为熟练,而且,ADO组件的功能也较BDE更为强大,所以在这里大多采用ADO组件来进行数据库联接。同时我也使用了BDE组件中的Table,因为在某些时候BDE有着其自身特有的优越性。 主窗体功能模块的实现
file://主窗体程序代码
public file://在程序的起始部分,定义快捷按钮点击事件
Procedure Popup1Handler(Sender:Tobject);
Procedure Popup2Handler(Sender:TObject);
**********************************************************************
procedure Tmainform.Popup1Handler(Sender: TObject);
begin file://快捷按钮1(点“按出版社分类”按钮产生)的点击事件
with datamoduleform.MainQuery do
begin file://打开数据模块窗体的MainQuery,对BookRecord表进行操作
close; file://关闭MainQuery
SQL.Clear; file://清除SQL属性中的SQL命令语句
SQL.Add(‘select * from BookRecord where Publisher=:Pub‘); file://添加新的SQL语句
Parameters.ParamByName(‘Pub‘).Value:=(Sender as TMenuItem).Caption;
open; file://重新打开MainQuery
end;
end;
**********************************************************************
procedure Tmainform.SpeedButton1Click(Sender: TObject);
Var s1,s2,s3,s4,s5 :String; file://设立5个变量以方便实现模糊查询
begin file://主窗口库存查询按钮事件
with datamoduleform.MainQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘);
SQL.Add(‘where BookID Like :BookID and BookName Like :Name and Author Like :Author and Publisher Like :pub and BookType Like :BookType‘);
file://使用Like语句来实现模糊查询
if Edit1.Text<>‘‘ then s1:=‘%‘+Edit1.Text+‘%‘ else s1:=‘%‘;
Parameters.ParamByName(‘BookID‘).Value:=s1; file://给变量s1赋值
if Edit2.Text<>‘‘ then s2:=‘%‘+Edit2.Text+‘%‘ else s2:=‘%‘;
Parameters.ParamByName(‘Name‘).Value:=s2; file://给变量s2赋值
if Edit3.Text<>‘‘ then s3:=‘%‘+Edit3.Text+‘%‘ else s3:=‘%‘;
Parameters.ParamByName(‘Author‘).Value:=s3; file://给变量s2赋值
if Edit4.Text<>‘‘ then s4:=‘%‘+Edit4.Text+‘%‘ else s4:=‘%‘;
Parameters.ParamByName(‘Pub‘).Value:=s4; file://给变量s2赋值
if Edit5.Text <>‘‘ then s5:=‘%‘+Edit5.Text+‘%‘ else s5:=‘%‘;
Parameters.ParamByName(‘BookType‘).Value:=s5; file://给变量s2赋值
open;
if FieldValues[‘BookID‘]=NULL file://判断是否找到记录
then begin
Messagedlg(‘没有找到你所需要的记录!‘,mtInformation,[mbOK],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit4.Text:=‘‘;Edit5.Text:=‘‘;
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘); file://这里相当于一个刷新功能
open;
end;end;
end;
**********************************************************************
procedure Tmainform.SpeedButton3Click(Sender: TObject);
begin file://库存表刷新按钮事件
with datamoduleform.MainQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘);
open;
end;
end;
**********************************************************************
procedure Tmainform.SpeedButton11Click(Sender: TObject);
var PopupItem:TMenuItem;
begin file://自动生成快捷按钮1的内容
with datamoduleform.BookQuery do
begin file://从数据库中选择出版社类型
close;
SQL.Clear;
SQL.Add(‘select distinct Publisher from BookRecord‘);
open;
PopupMenu1:=TPopupMenu.Create(Self); file://自动生成快捷菜单
PopupMenu1.AutoHotkeys:=maManual; file://自定义热键
while Not Eof do
begin file://根据出版社内容生成菜单子项
PopupItem:=TMenuItem.Create(Self);
PopupItem.Caption:=FieldByName(‘Publisher‘).AsString;
PopupMenu1.Items.Add(PopupItem);
PopupItem.onClick:=Popup1Handler; file://确定菜单子项的点击事件
Next;
end; end;
PopupMenu1.Popup(384,67); file://在指定位置显示快捷菜单1
end;
**********************************************************************
procedure Tmainform.FormActivate(Sender: TObject);
begin file://系统初始化,在进入mainform时自动添加数据源
mainform.DBGrid1.DataSource:=datamoduleform.MainSource;
mainform.DBNavigator1.DataSource:=datamoduleform.MainSource;
mainform.DBGrid2.DataSource:=datamoduleform.EmpSource;
mainform.DBNavigator2.DataSource:=datamoduleform.EmpSource;
mainform.DBGrid3.DataSource:=datamoduleform.ShopSource;
mainform.DBNavigator3.DataSource:=datamoduleform.ShopSource;
mainform.DBGrid4.DataSource:=datamoduleform.InSource;
mainform.DBNavigator4.DataSource:=datamoduleform.InSource;
mainform.DBGrid5.DataSource:=datamoduleform.OutSource;
mainform.DBNavigator5.DataSource:=datamoduleform.OutSource;
end;
**********************************************************************
procedure Tmainform.FormCreate(Sender: TObject);
begin file://系统初始化,定义界面大小,以适应不同分辩率
Width:=800;Height:=600;
end;
**********************************************************************
procedure Tmainform.Timer1Timer(Sender: TObject);
begin file://在状态栏显示时间
StatusBar1.Panels[2].Text:=DateToStr(Date);
StatusBar1.Panels[4].Text:=TimeToStr(Time);
end;
§5.4 入库、出库窗体模块的实现
图5.4 系统入库管理窗体
图5.5 系统出库管理窗体
procedure Tinoutform.SpeedButton4Click(Sender: TObject);
begin file://入库管理查找按钮事件
with datamoduleform.BookQuery do file://入库查询处理
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord where BookID=:BookID‘);
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
open;
if FieldValues[‘BookID‘]<>NULL
then
begin
Edit1.Text:=‘‘;
Edit1.ReadOnly:=true;Edit1.Color:=clMenu;
Edit6.Text:=FieldValues[‘BookName‘]; file://显示图书名
Edit6.ReadOnly:=true;Edit6.Color:=clMenu; file://设置显示框不可更改属性
Edit7.Text:=FieldValues[‘Author‘];
Edit7.ReadOnly:=true;Edit7.Color:=clMenu;
Edit8.Text:=FieldValues[‘Publisher‘];
Edit8.ReadOnly:=true;Edit8.Color:=clMenu;
Edit9.Text:=FieldValues[‘PubDate‘];
Edit9.ReadOnly:=true;Edit9.Color:=clMenu;
Edit10.Text:=FieldValues[‘Price‘];
Edit10.ReadOnly:=true;Edit10.Color:=clMenu;
Edit11.Text:=FieldValues[‘BookType‘];
Edit11.ReadOnly:=true;Edit11.Color:=clMenu;
Edit12.Text:=FieldValues[‘Number1‘];
Edit12.ReadOnly:=true;Edit12.Color:=clMenu;
If FieldValues[‘Addation‘]<>NULL
then Edit25.Text:=FieldValues[‘Addation‘]
else Edit25.Text:=‘‘;
Edit25.ReadOnly:=true;Edit25.Color:=clMenu;
end
else
begin file://在没有查找到的情况下,清空所有显示框
Edit1.ReadOnly:=false;Edit1.Text:=‘‘;Edit1.Color:=clMenu;
Edit6.ReadOnly:=false;Edit6.Text:=‘‘;Edit6.Color:=clMenu;
Edit7.ReadOnly:=false;Edit7.Text:=‘‘;Edit7.Color:=clMenu;
Edit8.ReadOnly:=false;Edit8.Text:=‘‘;Edit8.Color:=clMenu;
Edit9.ReadOnly:=false;Edit9.Text:=‘‘;Edit9.Color:=clMenu;
Edit10.ReadOnly:=false;Edit10.Text:=‘‘;Edit10.Color:=clMenu;
Edit11.ReadOnly:=false;Edit11.Text:=‘‘;Edit11.Color:=clMenu;
Edit12.ReadOnly:=false;Edit12.Text:=‘‘;Edit12.Color:=clMenu;
Edit25.ReadOnly:=false;Edit25.Text:=‘‘;Edit25.Color:=clMenu;
MessageDlg(‘没有找到你所需要的记录!‘,mtInformation,[mbOK],0);
Edit13.Text:=‘‘;Edit13.SetFocus;
end;
end;
with datamoduleform.InQuery do file://自动入库编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from InRecord where InID>=All(select InID from InRecord)‘);
open; file://找到入库编号中最大的一个
Edit26.ReadOnly:=false;
Edit26.Text:=FieldValues[‘InID‘]+1; file://最大的入库编号加1形成新的入库编号
Edit26.ReadOnly:=true;Edit26.Color:=clMenu; file://设置编号的不可更改性
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton1Click(Sender: TObject);
var s:integer;
begin file://入库管理添加按钮事件
if Edit1.Text<>NULL
then MessageDlg(‘请输入完整的入库信息和图书信息,然后单击确定按钮。‘,
mtInformation,[mbok],0)
else begin
if (Edit2.Text=‘‘) or (Edit3.Text=‘‘) or (Edit4.Text=‘‘) or (Edit5.Text=‘‘)
then begin
MessageDlg(‘请输入完整的入库信息!‘,mtInformation,[mbok],0);
Edit2.SetFocus;
end
else begin
with datamoduleform.InQuery do file://将找到的图书信息显示
begin
close;
SQL.Clear;
SQL.Add(‘insert into InRecord values(:InID,:BookID,:EmpID,:ShopID,
:Number,:InDate)‘); file://向入库信息表中插入记录
Parameters.ParamByName(‘InID‘).Value:=Edit26.Text; file://向Edit框取值
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit2.Text;
Parameters.ParamByName(‘ShopID‘).Value:=Edit3.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘InDate‘).Value:=Edit5.Text;
execSQL;
end;
Edit12.ReadOnly:=False;
S:=StrToInt(Edit12.Text)+StrToInt(Edit4.Text); file://计算入库后库存图书数量
Edit12.Text:=IntToStr(s); file://将修改后的库存图书数量显示
Edit12.ReadOnly:=true;
with datamoduleform.BookQuery do file://修改库存记录中图书数量
begin
close;
SQL.Clear;
SQL.Add(‘update BookRecord set Number1=:Number where
BookID=:BookID‘);
Parameters.ParamByName(‘Number‘).Value:=s;
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
execSQL; file://提交SQL语句
MessageDlg(‘记录已成功添加!‘,mtInformation,[mbOK],0);
Edit13.SetFocus;
end;
end;
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton2Click(Sender: TObject);
begin file://入库管理确定按钮事件
if (Edit2.Text=‘‘) or (Edit3.Text=‘‘) or (Edit4.Text=‘‘) or (Edit5.Text=‘‘)
or (Edit6.Text=‘‘) or (Edit7.Text=‘‘) or (Edit8.Text=‘‘) or (Edit9.Text=‘‘)
or (Edit10.Text=‘‘) or (Edit11.Text=‘‘) or (Edit25.Text=‘‘)
then begin file://判断输入信息的完整性
MessageDlg(‘请输入所需的全部入库信息!‘,mtInformation,[mbok],0);
Edit2.SetFocus;
end
else
begin
with datamoduleform.InQuery do file://入库信息添加
begin
close;
SQL.Clear;
SQL.Add(‘insert into InRecord values(:InID,:BookID,:EmpID,:ShopID,
:Number,:InDate)‘); file://向入库信息表中插入记录
Parameters.ParamByName(‘InID‘).Value:=Edit26.Text;
Parameters.ParamByName(‘BookID‘).Value:=Edit1.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit2.Text;
Parameters.ParamByName(‘ShopID‘).Value:=Edit3.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘InDate‘).Value:=Edit5.Text;
execSQL;
end;
with datamoduleform.BookQuery do
begin
close;
SQL.Clear; file://在完成入库信息的添加后,修改库存记录
SQL.Add(‘insert into BookRecord values(:BookID,:BookName,:Author,
:Publisher,:PubDate,:Price,:BookType,:Number,:Addration)‘);
Parameters.ParamByName(‘BookID‘).Value:=Edit1.Text;
Parameters.ParamByName(‘BookName‘).Value:=Edit6.Text;
Parameters.ParamByName(‘Author‘).Value:=Edit7.Text;
Parameters.ParamByName(‘Publisher‘).Value:=Edit8.Text;
Parameters.ParamByName(‘PubDate‘).Value:=Edit9.Text;
Parameters.ParamByName(‘Price‘).Value:=Edit10.Text;
Parameters.ParamByName(‘BookType‘).Value:=Edit11.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘Addration‘).Value:=Edit25.Text;
execSQL;
end;
MessageDlg(‘记录添加成功!‘,mtInformation,[mbok],0);
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton11Click(Sender: TObject);
begin file://新书入库按钮事件
Edit13.Text:=‘‘;Edit13.Color:=clMenu;
with datamoduleform.InQuery do file://自动入库编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from InRecord where InID>=All(select InID from InRecord)‘);
open;
Edit26.Text:=FieldValues[‘InID‘]+1;
Edit26.ReadOnly:=true;Edit26.Color:=clMenu;
end;
with datamoduleform.BookQuery do file://自动图书编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord where BookID>=All(select BookID from BookRecord)‘); file://找到库存图书编号中最大的一个
open;
Edit1.ReadOnly:=false;
Edit1.Text:=FieldValues[‘BookID‘]+1; file://显示自动生成的图书编号
Edit1.ReadOnly:=true;Edit1.Color:=clMenu;
end;
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit4.Text:=‘‘;Edit5.Text:=‘‘;
Edit6.ReadOnly:=false;Edit6.Text:=‘‘;Edit6.Color:=clWindow;
Edit7.ReadOnly:=false;Edit7.Text:=‘‘;Edit7.Color:=clWindow;
Edit8.ReadOnly:=false;Edit8.Text:=‘‘;Edit8.Color:=clWindow;
Edit9.ReadOnly:=false;Edit9.Text:=‘‘;Edit9.Color:=clWindow;
Edit10.ReadOnly:=false;Edit10.Text:=‘‘;Edit10.Color:=clWindow;
Edit11.ReadOnly:=false;Edit11.Text:=‘‘;Edit11.Color:=clWindow;
Edit12.ReadOnly:=false;Edit12.Text:=‘‘;Edit12.Color:=clMenu;
Edit25.ReadOnly:=false;Edit25.Text:=‘‘;Edit25.Color:=clWindow;
end;
procedure Tinoutform.SpeedButton22Click(Sender: TObject);
var s:integer;
begin file://出库管理确定按钮事件
if (Edit24.Text=‘‘) or (Edit27.Text=‘‘) or (Edit28.Text=‘‘)
then begin
MessageDlg(‘请输入完整的出库信息!‘,mtInformation,[mbok],0);
Edit24.SetFocus;
end
else begin
if Edit27.Text>Edit21.Text file://检查出库数量是否小于库存数量
then begin
MessageDlg(‘库存中的图书数量不够!‘,mtInformation,[mbok],0);
Edit27.Text:=‘‘;Edit27.SetFocus;
end
else begin
with datamoduleform.OutQuery do
begin
close;
SQL.Clear;
SQL.Add(‘insert into OutRecord values(:OutID,:BookID,:EmpID,
:Number,:OutTime)‘); file://添加出库记录
Parameters.ParamByName(‘OutID‘).Value:=Edit23.Text;
Parameters.ParamByName(‘BookID‘).Value:=Edit14.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit24.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit27.Text;
Parameters.ParamByName(‘OutTime‘).Value:=Edit28.Text;
execSQL;
end;
Edit21.ReadOnly:=False;
s:=StrToInt(Edit21.Text)-StrToInt(Edit27.Text); file://计算出库后库存图书数量
Edit21.Text:=IntToStr(s); file://显示出库后库存图书数量
Edit21.ReadOnly:=True;
with datamoduleform.BookQuery do
begin file://修改库存图书数量
close;
SQL.Clear;
SQL.Add(‘update BookRecord set Number1=:Number where BookID=:BookID‘);
Parameters.ParamByName(‘Number‘).Value:=s;
Parameters.ParamByName(‘BookID‘).Value:=Edit14.Text;
execSQL;
end;
MessageDlg(‘出库记录添加成功!‘,mtInformation,[mbok],0);
Edit14.Text:=‘‘;Edit14.SetFocus;
end;
end;
end;
§5.5 查询功能的实现
查询功能包括员工信息查询,供应商信息查询,入库信息查询和出库信息查询。由于每一个功能的实现都差不太多,而且其窗体也差不太多,所以在这里只给出员工信息查询窗体及其源代码。
图5.6 员工信息查询窗体
procedure Tfindempform.SpeedButton1Click(Sender: TObject);
Var s1,s2,s3 :String;
begin file://员工记录查询窗体查找按钮事件
with datamoduleform.EmpQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from Employee‘);
SQL.Add(‘where EmployeeID Like :EmpID and EmployeeName Like :Name and Grade Like :Grade‘); file://实现模糊查询功能
if Edit1.Text<>‘‘ then s1:=‘%‘+Edit1.Text+‘%‘ else s1:=‘%‘;
Parameters.ParamByName(‘EmpID‘).Value:=s1;
if Edit2.Text<>‘‘ then s2:=‘%‘+Edit2.Text+‘%‘ else s2:=‘%‘;
Parameters.ParamByName(‘Name‘).Value:=s2;
if Edit3.Text<>‘‘ then s3:=‘%‘+Edit3.Text+‘%‘ else s3:=‘%‘;
Parameters.ParamByName(‘Grade‘).Value:=s3;
open;
if FieldValues[‘EmployeeID‘]<>NULL
then findempform.Close file://在找到记录的情况下关闭查找窗口
else
begin
MessageDlg(‘没有找到你所需要的记录!‘,mtInformation,[mbOK],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
close; SQL.Clear;
SQL.Add(‘select * from Employee‘); file://刷新员工信息窗口
open;
end; end;
end;
§5.6 系统登陆窗体模块的实现
由于系统登陆窗体中有一幅彩图,在这里不便给出,而只给出了系统的实现。
var keyname: string; file://定义了一个全局变量,在key2中有调用
procedure Tkeyform.SpeedButton1Click(Sender: TObject);
var s:string; file://登陆窗口登陆按钮事件
begin
if (Edit1.Text=‘‘) then begin
MessageDlg(‘清输入登陆姓名和密码!‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
datamoduleform.KeyTable.Active:=true;
if not datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断登陆名是否存在
then begin
MessageDlg(‘登陆名错误,请重新输入!‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘; Edit1.SetFocus;
end
else begin
with datamoduleform.KeyQuery do
begin
close; SQL.Clear;
SQL.Add(‘select * from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
open;
s:=FieldValues[‘KeyNo‘];
end;
if s<>Edit2.Text file://判断登陆密码是否正确
then begin
MessageDlg(‘登陆密码错误,请重新输入!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘; Edit2.SetFocus;
end
else begin
keyname:=Edit1.Text;
keyform.Hide;
mainform.Show;mainform.WindowState:=wsMaximized;
end; end; end;
end;
§5.7 用户管理功能的实现
5.7.1 用户管理主窗体
图5.7 用户管理主窗体
5.7.2 密码修改窗体模块的实现
图5.8 密码修改窗体
procedure Tkey2form.SpeedButton1Click(Sender: TObject);
begin file://密码修改窗口修改按钮事件
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)or(Edit3.Text=‘‘)
then begin
MessageDlg(‘请输入完整的信息。‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyNo‘,Edit1.Text,[])
then begin
MessageDlg(‘原密码输入错误,不能修改新密码!‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.Text<>Edit3.Text
then begin
MessageDlg(‘两次密码输入不同,请重新输入新密码!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin file://在数据库中修改密码
with datamoduleform.KeyQuery do
begin
close; SQL.Clear;
SQL.Add(‘update key set KeyNo=:KeyNo where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=keyname;
Parameters.ParamByName(‘KeyNo‘).Value:=Edit2.Text;
execSQL;
MessageDlg(‘密码修改成功!‘,mtInformation,[mbok],0);
key2form.Close;
end; end; end; end;
end;
5.7.3 用户注册窗体模块的实现
图5.9 用户注册窗体
procedure Tkey3form.SpeedButton1Click(Sender: TObject);
begin file://用户注删窗口注删按钮事件
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)or(Edit3.Text=‘‘)
then begin
MessageDlg(‘请输入完整的信息!‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断用户名是否存在,系统不允许用户名重复
then begin
MessageDlg(‘用户名已存在,请输入新的用户名和密码!‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.Text<>Edit3.Text
then begin
MessageDlg(‘您输入的两个密码不相同,请重新输入!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin
with datamoduleform.KeyQuery do file://在数据库中添加该用户
begin
close;
SQL.Clear;
SQL.Add(‘insert into Key values(:KeyName,:KeyNo)‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
Parameters.ParamByName(‘KeyNo‘).Value:=Edit2.Text;
execSQL;
end;
MessageDlg(‘新用户添加成功,您可以继续添加用户,或按“取消”退出。‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end; end; end;
end;
5.7.4 用户注销窗体模块的实现
图5.10 用户注销窗体
procedure Tkey4form.SpeedButton1Click(Sender: TObject);
var s:string;
begin file://用户注销窗口注销按钮事件
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)
then MessageDlg(‘请输入完整的信息!‘,mtInformation,[mbok],0)
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断用户名是否存在,用户名必须存在,才可以删除
then begin
MessageDlg(‘您所输入的用户名不存在,请重新输入或按“取消”退出。‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit1.SetFocus;
end
else begin
with datamoduleform.KeyQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
open;
s:=FieldValues[‘KeyNo‘];
end;
if s<>Edit2.Text file://判断该用户名下的密码是否正确
then begin
MessageDlg(‘您所输入的密码不正确,请重新输入或按“取消”退出。‘,
mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit2.SetFocus;
end
else begin file://从数据库中删除该用户
with datamoduleform.KeyQuery do
begin
close;
SQL.Clear;
SQL.Add(‘delete from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
execSQL;
end;
MessageDlg(‘用户已成功删除,您可以继续删除用户,或按“取消”退出。‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit1.SetFocus;
end; end; end;
end;
结束语
本系统是一个面向小型图书企业,具有一定实用性的数据库信息管理系统。它主要完成对图书仓库的一系列管理,包括入库、出库、库存以及员工和供应商信息管理。本系统采用当前流行的面向对象的开发工具—Delphi来完成整个系统的设计,在数据库的设计上利用了Access的便利性和实用性。
本系统具有相当的实用功能。在查询方面,系统实现了多条件任意字段的模糊查询,同时在分类查询上实现了动态生成,系统可以自动识别用户不同的输入。在图书入库、出库和库存三者之间建立了良好的链接关系,某一部分地修改均会自动引发系统对与其相关的部分进行连锁修改。在用户管理方面,系统较好地实现了用户注册,用户注销和密码修改等各项功能。
系统在设计过程中不可避免地遇到了各种各样的问题,由于整个系统完全都是由个人设计的,有关Delphi许多细节问题都要靠自己去摸索,加之本人水平有限,并没有完全地理解Delphi的强大功能,而且还存在着许多不足之处。如:
※ 受开发条件和开发时间的限制,本系统只利用了本地数据库Access,它同应用程序处于同一系统中,能存储的数据量也有一定限制,并没有发挥出Delphi其数据库方面的优势;
※ 报表打印功能尚不够全面完善,不能实现动态报表;
※ 在一些数据输入时没有及时的进行数据格式校验,不能保证数据输入的绝对正确性。
※ 由于时间关系,系统功能实现不够完善,使用不是很方便,比如,没有实现多条记录的连锁删除和添加以及数据的导入功能。
这些都是需要完善的地方,该系统离实际使用也还有相当的距离,需要我进行不断地补充和完善。
通过本次毕业设计我学到了不少新的东西,也发现了大量的问题,有些在设计过程中已经解决,有些还有待今后慢慢学习。只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。
考 文 献
[1] 郑荣贵、黄平、谷会东,Delphi 6.0数据库开发与应用,中科多媒体电子出版社,2002
[2] 伍俊良,Delphi 6控件应用实例教程,北京希望电子出版社,2002
[3] 卢国俊,Delphi 6数据库开发,电子工业出版社,2002
[4] 边萌,Delphi 编程起步,机械工业出版社,2002
[5] 伍俊良,Delphi 6课程设计案例精编,中国水利水电出版社,2002
[6] 丁宝康,数据库原理,经济科学出版社,2000
[7] 陆丽娜,软件工程,经济科学出版社,2000