前两天试着玩GitHub,熟悉了英语,却把头脑给弄大了。
文件夹上传到GitHub总不成功,启动Gitshell后,不到一会,系统就崩了,explorer.exe无法工作,只得重启。
昨天关机、开机试了不少于10次,问题还没解决,先搁在那,等心缓一缓再弄。
有收获的是知道怎么从GitHub中拷贝别人的项目文件。
今天终于把搁置了几天的图书管理系统搞定了,完成了图书查询借阅功能和还书功能两大功能。
现在对这个小型系统做一个总结。
该系统由8个窗体构成,如下表所示:
窗体名称 | Unit文件 | 窗体功能 |
---|---|---|
Welcomeform | welcome.pas | 用户登录 |
Masterform | Master.pas | 图书管理界面 |
updatebookform | Updatebook.pas | 修改图书记录 |
updatepasswordform | updatepassword.pas | 修改密码 |
updatereaderform | updatereader.pas | 修改读者记录 |
readerform | reader.pas | 读者服务界面 |
readerselectform | readerselect.pas | 图书查询与借阅 |
readerbackform | readerback.pas | 图书归还 |
一、登录功能模块的实现
1、登录模块窗体的设计
radiogroup控件的边框没找到方法隐藏,如果你知道,麻烦在回复中告知。
2、登录模块的代码设计
unit Welcome; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB, ExtCtrls; //uses master; type TForm1 = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; Edit1: TEdit; Button1: TButton; Button2: TButton; Label2: TLabel; Edit2: TEdit; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; RadioGroup1: TRadioGroup; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses master, reader; //引用加在实现部分。 {$R *.dfm} var time:Integer=0; procedure TForm1.Button1Click(Sender: TObject); var str:string; results:variant; //16字节可变类型 begin ADOTable1.Active:=true; { if (edit2.Text='admin') and (edit1.Text='123456') then showmessage('登陆成功!') } str:=Edit2.Text; results:=ADOTable1.Lookup('LoadName',edit2.Text,'LoadPassword'); //showmessage(BoolToStr(results=edit1.Text,true)); if edit2.Text='' then begin Application.MessageBox('用户名不能为空!','提示',mb_ok); edit2.SetFocus; end else if not ADOTable1.Locate('LoadName',str,[loCaseInsensitive]) then begin Application.MessageBox('用户名不存在!','提示',mb_ok); edit2.Text:=''; edit1.Text:=''; edit2.SetFocus; end else if edit1.Text='' then Application.MessageBox('密码不能为空!','提示',mb_ok) else if (results=edit1.Text) then //重建数据表才验证成功(开始以为是类型转化不对,其实不然) begin //showmessage('登陆成功!') case RadioGroup1.ItemIndex of //RadioGroup的使用方法 0: masterform.show; //form1.Visible:=false; 1: readerform.show; end; end else begin time:=time+1; if time<5 then begin showmessage('密码错误,请重新输入!'); edit1.Text:=''; //edit2.Text:=''; edit1.SetFocus; //焦点重新回到edit2 end else begin messageDlg('对不起,密码输入错误达到5次!请退出。',mtInformation,[mbok],0); application.Terminate; end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin close; //关闭登陆窗口 end; end.
二、管理员控制模块的实现
1、主界面
1.1、主界面窗体设计
1.2、代码设计
unit master; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tmasterform = class(TForm) Label1: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); //procedure Button2Click(Sender: TObject); //procedure Button3Click(Sender: TObject); //procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var masterform: Tmasterform; implementation uses updatebook,updatereader, updatepassword; {$R *.dfm} procedure Tmasterform.Button1Click(Sender: TObject); begin updatebookform.show; end; procedure Tmasterform.Button2Click(Sender: TObject); begin updatereaderform.Show; end; procedure Tmasterform.Button3Click(Sender: TObject); begin updatepasswordform.show; end; procedure Tmasterform.Button4Click(Sender: TObject); begin close; end; end.
2.1 修改图书记录
2.1.1 窗体设计
2.1.2 代码实现
unit updatebook; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB, Mask, DBCtrls, ExtCtrls; type Tupdatebookform = class(TForm) Button1: TButton; DBNavigator1: TDBNavigator; DBEdit1: TDBEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; DBEdit2: TDBEdit; DBEdit3: TDBEdit; DBEdit4: TDBEdit; Button2: TButton; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; Label5: TLabel; DBEdit5: TDBEdit; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var updatebookform: Tupdatebookform; implementation {$R *.dfm} procedure Tupdatebookform.Button2Click(Sender: TObject); begin if messageDlg('确实要取消吗?',mtinformation,[mbok,mbcancel],0)=mrOk then begin ADOTable1.CancelUpdates; //取消数据修改 updatebookform.Close; //关闭窗口 end; end; procedure Tupdatebookform.Button1Click(Sender: TObject); begin //ADOTable1.Append;//增加一条空记录 //ADOTable1.UpdateBatch;//不用post,自动更改 ADOTable1.UpdateRecord; ADOTable1.Post; end; end.
2.2 修改读者记录
2.2.1 窗体设计
2.2.2代码设计
unit updatereader; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, Mask, DBCtrls, ExtCtrls; type Tupdatereaderform = class(TForm) DBNavigator1: TDBNavigator; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var updatereaderform: Tupdatereaderform; implementation {$R *.dfm} procedure Tupdatereaderform.Button2Click(Sender: TObject); begin if messageDlg('确实要取消吗?',mtinformation,[mbok,mbcancel],0)=mrOk then begin ADOTable1.CancelUpdates; //取消数据修改 updatereaderform.Close; //关闭窗口 end; end; procedure Tupdatereaderform.Button1Click(Sender: TObject); begin ADOTable1.UpdateBatch; end; end.
2.3.1 窗体设计
2.3.2 代码设计
unit updatepassword; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls, ExtCtrls, DB, ADODB; type Tupdatepasswordform = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; DBNavigator1: TDBNavigator; DBEdit1: TDBEdit; DBEdit2: TDBEdit; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var updatepasswordform: Tupdatepasswordform; implementation {$R *.dfm} procedure Tupdatepasswordform.Button2Click(Sender: TObject); begin if messageDlg('确实要取消吗?',mtinformation,[mbok,mbcancel],0)=mrOk then begin ADOTable1.CancelUpdates; //取消数据修改 updatepasswordform.Close; //关闭窗口 end; end; procedure Tupdatepasswordform.Button1Click(Sender: TObject); begin ADOTable1.UpdateBatch; end; end.
三、读者服务模块
1、主界面
1.1 主界面窗体设计
1.2 代码设计
unit reader; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Treaderform = class(TForm) Button1: TButton; Label1: TLabel; Button2: TButton; Button3: TButton; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var readerform: Treaderform; implementation uses readerselect, readerback; {$R *.dfm} procedure Treaderform.Button3Click(Sender: TObject); begin close; end; procedure Treaderform.Button1Click(Sender: TObject); begin readerselectform.show; end; procedure Treaderform.Button2Click(Sender: TObject); begin readerbackform.show; end; end.2、子功能模块的实现
2.1 读者查询
2.1.1 窗体设计
2.1.2 代码设计
unit readerselect; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls, ExtCtrls, DB, ADODB; type Treaderselectform = class(TForm) Button1: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; DBEdit4: TDBEdit; GroupBox1: TGroupBox; GroupBox2: TGroupBox; Label6: TLabel; Edit1: TEdit; Button2: TButton; Button3: TButton; Label7: TLabel; Edit2: TEdit; Button4: TButton; ADOConnection1: TADOConnection; ADOTable1: TADOTable; ADOTable2: TADOTable; ADOTable3: TADOTable; DataSource1: TDataSource; DBEdit5: TDBEdit; procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } p:bool; time:tdatetime; public { Public declarations } end; var readerselectform: Treaderselectform; implementation {$R *.dfm} procedure Treaderselectform.Button3Click(Sender: TObject); begin ADOTable1.IndexFieldNames:='bookname'; // 显示数据库表格所采用的索引排序的字段名,从书名索引 ADOTable1.Open; //打开数据表 if ADOTable1.Locate('bookname',edit1.Text,[]) then //locate 返回ture或false p:=true //如果定位成功则返回true,判断的一个依据 else if MessageDlg('无完全吻合记录,是否查找相似记录',mtConfirmation,[mbYes,mbNo],0)=mryes then begin if ADOTable1.Locate('bookname',edit1.Text,[loCaseInsensitive ,loPartialKey]) then p:=true else MessageDlg('无法查到您需要的记录,请重新查找',mtConfirmation,[mbYes,mbNo],0); edit1.Text:=''; end; end; procedure Treaderselectform.FormCreate(Sender: TObject); begin p:=false; end; procedure Treaderselectform.Button2Click(Sender: TObject); begin close; end; procedure Treaderselectform.Button4Click(Sender: TObject); begin ADOTable1.IndexFieldNames:='author'; ADOTable1.Open; if ADOTable1.Locate('author',edit2.Text,[]) then //locate 返回ture或false p:=true //如果定位成功则返回true,判断的一个依据 else if MessageDlg('无完全吻合记录,是否查找相似记录',mtConfirmation,[mbYes,mbNo],0)=mryes then begin if ADOTable1.Locate('author',edit2.Text,[loCaseInsensitive ,loPartialKey]) then p:=true else MessageDlg('无法查到您需要的记录,请重新查找',mtConfirmation,[mbYes,mbNo],0); edit1.Text:=''; end; end; procedure Treaderselectform.Button1Click(Sender: TObject); var readersn:string; begin if p=false then MessageDlg('请先查找您需要的书。',mtConfirmation,[mbYes],0) else begin if strToint(dbedit5.Text)>0 then begin inputQuery('输入读者编号','编号为',readersn); ADOTable2.IndexFieldNames:='ReaderNo'; ADOTable2.Open; if ADOTable2.Locate('ReaderNo',readersn,[])=false then MessageDlg('读者编号错误,请重新输入',mtConfirmation,[mbYes],0) else begin if ADOTable3.lookup('ReaderNo',readersn,'BookNo')=dbedit1.Text then begin MessageDlg('您已借此书,请按时归还!',mtConfirmation,[mbYes],0); end else begin ADOTable3.Open; ADOTable3.IndexFieldNames:='BookNo'; ADOTable3.Insert; time:=now; ADOTable3.AppendRecord([DBEdit1.Text,readersn,time]); ADOTable1.Edit; ADOTable1.FieldByName('BookState').AsString:=inttostr(strTOint(DBEdit5.Text)-1); ADOTable1.Post; MessageDlg('借书成功!',mtConfirmation,[mbYes],0); end; end; end else MessageDlg('该书已借完,请预定。',mtConfirmation,[mbYes],0); end; end; end.
2.2.1 窗体设计
2.2.2 代码设计
unit readerback; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB, Buttons, Grids, DBGrids; type TReaderbackform = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; DBGrid1: TDBGrid; BitBtn1: TBitBtn; BitBtn2: TBitBtn; ADOQuery1: TADOQuery; DataSource1: TDataSource; ADOConnection1: TADOConnection; ADOTable1: TADOTable; procedure Button1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Readerbackform: TReaderbackform; implementation {$R *.dfm} procedure TReaderbackform.Button1Click(Sender: TObject); var str:string; begin //ADOTable1.Locate('ReaderNo',edit1.Text,[]) trim(Edit1.Text) str:=trim(Edit1.Text); ADOQUERY1.Close; ADOQuery1.SQL.Clear; //先要设置ADOQuery1的SQL属性 ADOQUERY1.SQL.Add('select * from Borrow where ReaderNo=:ReaderNo'); //只有这一行不能显示数据,必须加上下面一行 ADOQuery1.Parameters.ParamByName('ReaderNo').Value:=str; ADOQUERY1.Open; //showmessage(inttostr(ADOQuery1.RecordCount)); //测试是否有数据 ADOQUERY1.First; end; procedure TReaderbackform.BitBtn2Click(Sender: TObject); begin close; end; procedure TReaderbackform.BitBtn1Click(Sender: TObject); var bnum,bname:variant; bno,strfield:string; // i:integer; begin //i:=4; // Rno:=edit1.Text; //b1:=ADOQuery1.lookup('ReaderNo',bno,'Bookno'); //bname:=ADOTable1.lookup('BookNo',b1,'BookName'); //bnum:=ADOTable1.lookup('BookNo',b1,'BookState'); //ADOTable1.Locate('Bookname',bname,[]); //showmessage(IntToStr(bnum+i)); //ADOTable1.Locate('Bookno',b1,[]); //showmessage('书籍的名称为: '+bname); strfield:=DBGrid1.SelectedField.FieldName; //鼠标选中某个字段 //ShowMessage(ADOQuery1.FieldByName(strfield).AsString);显示选中字段的值 bno:=ADOQuery1.FieldByName('BookNo').AsString; bname:=ADOTable1.lookup('BookNo',bno,'BookName'); showmessage('书籍的名称为: '+bname); bnum:=ADOTable1.lookup('BookNo',bno,'BookState'); if messagedlg('是否要还书?',mtinformation,[mbyes,mbno],0)=mryes then begin ADOTable1.Locate('Bookno',bno,[]); //定位到这一行 //ADOTable1.Locate('Bookname',bname,[]); //ADOQuery1.Delete; //放到这,出现逻辑上的错误,下一种类的书数量加1 ADOTable1.Edit; //必须在要修改的命令行之前,中间不能有其他语句 ADOTable1.FieldByName('BookState').AsInteger:=strtoint(bnum+1); ADOTable1.Post; ADOQuery1.Delete; //放的位置对结果有影响 end; end; end.
系统创建过程中遇到的一些问题及解决方法:
问题分析及解决:SQL服务未开,手动开启。另外,设置ADOTable1.active:=true;
解决方案:修改Data下文件夹权限。具体可见:
http://blog.csdn.net/alisa525/article/details/38702137
解决方法:在ADOQuery的SQL属性中加上 select * from table1,就可以显示数据,
通过下列方式查询:
ADOQUERY1.SQL.Add('select * from Borrow where ReaderNo=:ReaderNo'); //只有这一行不能显示数据,必须加上下面一行
ADOQuery1.Parameters.ParamByName('ReaderNo').Value:=str;
解决方法:variant是无类型数据,可自适应,出现该错误,先测试,测试见:
b1:=ADOQuery1.lookup('ReaderNo',bno,'Bookno');
bnum:=ADOTable1.lookup('BookNo',b1,'BookState');
showmessage(IntToStr(bnum+i));测试语句
参考网站:http://www.cnblogs.com/youshan/archive/2011/07/10/2102455.html
解决方法:在修改语句的上一行加上ADOTable1.edit;
ADOTable1.Edit; //必须在要修改的命令行之前,中间不能有其他语句
ADOTable1.FieldByName('BookState').AsInteger:=strtoint(bnum+1);
ADOTable1.Post;
-------------------------------------------------------------------------------------------------------------------
码到这了、有不对的地方、麻烦指出。
写代码是会写出感情的、come on.