当前位置:首页 >> 其它课程 >> 第10章 图书管理系统

第10章 图书管理系统


第 10 章
本章内容

图书管理系统

■ 数据库应用系统开发的基本思想和步骤 ■ 创建关于图书管理系统的表和数据库 ■ 创建借书表单 ■ 创建还书表单 ■ 创建资料查询表单 ■ 创建图书管理表单 ■ 创建读者管理表单 ■ 创建图书管理系统的报表 ■ 创建报表打印表单 ■ 创建一个自定义工具栏类 ■ 设计图书管理系统的主表单 ■

初始化表单的制作 ■ 制作数据备份表单 ■ 创建数据恢复表单 ■ 创建数据清空表单 ■ 制作密码验证表单 ■ 制作密码修改表单 ■ 创建系统封面表单 ■ 图书管理系统菜单的制作 ■ 图书管理系统主程序的制作 ■ 创建项目组织系统结构 ■ 应用系统的发布

案例 1:数据库应用系统开发的基本思想和步骤
学习 Visual FoxPro 最终的目的是开发一个数据库应用系统,本章通过制作图书管理系 统集中介绍数据库开发的全过程,以及开发数据库应用系统的制作方法和步骤。

一、 需求分析 1、开发目的:
这个图书管理系统主要为小型图书馆、图书社设计,根据这些图书馆、图书社图书管 理的需求,经过分析后要实现的功能有: (1) 能浏览图书的资料信息和读者的资料信息。 (2) 能够按一定条件查询相关资料的信息。 (3) 能够修改、增加和删除相关资料信息。 (4) 能按条件打印相关资料信息。 (5) 有安全性较强的系统入口。 (6) 应用系统自身的维护功能。

2、数据需求:
作者经过数据需求的分析,这个系统需要建立关于图书资料信息、读者资料信息、借书 登记和帐户管理的四个表,创建一个数据库,并且实现图书资料信息、读者资料信息和借书 登记表之间的关联,详细的设计在案例二中讲述。

3、功能分析:
(1) 浏览 能浏览图书的资料信息和读者的资料信息。 (2) 查询 能对图书资料、读者资料和借阅登记的信息按照一定的条件进行查询或者模糊查 询。 (3) 数据维护 对图书资料、读者资料和借书登记的相关数据进行修改、添加、删除等的数据维护。 (4) 撤消/保存 能撤消错误的操作,能保存用户更改的信息。 (5) 资料打印 对图书资料、读者资料和借书登记的相关数据信息按照指定的条件进行打印。 (6) 数据备份、恢复和清除 能随时对数据进行备份,也能对数据进行恢复,还可以对整个数据库和表进行初始化 和清除操作。

(7) 帐户密码的管理 可以修改帐户密码

二、 模块分析 1、系统维护模块
系统维护模块包括了系统初始化、数据表的清空、数据备份、数据恢复、密码修改和 系统退出等的功能。这些功能是通过独立的表单实现的。

2、借还书模块
这个模块包括两个表单,分别实现借书和还书功能,在这两个表单上我们可以查看要 借或者要还图书的信息资料和读者的信息资料,并且利用“借书”和“还书”两个按钮实现 借书和还书登记。

3、资料查询模块
这个模块通过一个拥有两个页框的表单实现图书资料和读者资料的查询,并且可以是 模糊查询,也可以是精确查询。

4、资料管理模块
这个模块包括两个表单,分别实现图书资料的管理和读者资料的管理,管理包括:查 看资料、修改资料、删除资料以及添加资料等等功能。

5、打印资料模块
通过一个表单实现有条件打印,在这个表单里我们可以选择要打印的数据,实现按条 件打印的目标。

三、 开发步骤:
1、创建数据表和数据库。表和数据库是数据库应用系统操作的基础和核心,所以经过 需求分析后接着要做的就是设计表和数据库。 表的设计要合理, 要建立关联的表必须有相同 的字段名,关于表和数据库的设计知识我想大家一定知道,这里就不详述了。 2、应用程序的设计。一个应用系统包含多种类型的文件,比如表单、菜单、报表、子 类等等, 每一种文件又有好多个, 这些种类数量繁多的应用程序必须有一个清晰的设计思路, 同一个系统不同的设计者有不同的设计思路,比如有人设计是从整体到局部、从大到小,先 建立项目管理器,接着创建主程序,然后是主界面,最后才是某个具体功能的表单、报表等 等,也有人是正好相反的步骤。而作者本人喜欢先设计小的、局部的,然后再设计大的、整 体的,我认为这样对编程等方面是有利的。 3、连编生成应用程序或可执行文件。当一个项目建立好后,在项目运行前还必须对它 们“连编” 。主要目的是生成可执行文件,同时可以设置项目信息,比如版权等,还可以测 试和校验项目,测试程序组件是否可用。 4、测试并发布应用程序。以上步骤完成后,剩下的就是发布程序了。

案例 2:创建关于图书管理系统的表和数据库 制作要点:
1、创建表 2、建立主索引和普通索引 3、创建数据库 4、实现两个表之间的关联

步骤详解:
刚才已经说过表和数据库是数据库应用系统操作的基础和核心, 设计的时候要充分考虑 到表之间的关联,同时注意数据库设计的合理性,以免造成数据冗余。下面列出图书管理系 统的所有表的结构与必须的索引, 表中的记录大家可以自己加几个, 在这个案例中我们需要 这样四个表: 1、读者信息表(读者信息.DBF) 结构: 读者信息(读者编号 c(10) primary key,读者姓名 c(10),证件号 c(20),性别 c(2), 单位部门 c(20),住址 c(40),职业 c(20),联系电话 c(12),备注 c(40),未还书目 c(2)) 2、图书资料表(图书资料.DBF) 结构: 图书资料(图书编号 c(10) primary key,图书类别 c(10),图书名称 c(50),作者 c(20), 出版社 c(30),出版日期 d,入馆日期 d,购买价格 y(8),借阅次数 n(4),备注 c(50)) 3、借书登记表(借书登记.DBF) 结构: 借书登记(读者编号 c(10),图书编号 c(10),读者姓名 c(10),读者证件号 c(20),借阅 日期 d,归还日期 d,借书标志 c(4), foreign key 读者编号 tag 读者编号 references 读 者信息,foreign key 图书编号 tag 图书编号 references 图书资料) 4、系统帐号表(系统账号.DBF) 结构: 系统账号(账号 c(20),密码 c(20)) 接着再创建一个名为“读者管理”的数据库,把图书资料.DBF、读者资料.DBF 和借书 登 记 .DBF 三 个 表 添 加 到 数 据 库 里 面 并 按 表 结 构 要 求 建 立 关 联 。 如 图 10-1 所 示 :

图 10-1

“读者管理”数据库

案例 3:创建借书表单 案例运行效果与操作
在这个表单中, 我们可以通过输入读者的读者编号来了解读者的信息, 也可以输入图书 编号来了解要借图书的信息,当读者确定要借出时,单击“借出”按钮就可以把信息记录在 借书登记表里面。借书表单的运行效果如图 10-2。

图 10-2 “js”表单运行效果

其中单击“清空”按钮会将表单上所有的文本框内容清除,退出表单时,单击“退出” 按钮就可以。

制作要点
1、 SQL 查询语言 2、 文本框属性设置

步骤详解
1、新建一个表单,保存文件名为 js,打开“数据环境设计器”窗口,向其中添加读者 信息表、图书资料表以及借书登记表。如图 10-3 添加对象,分别添加十六个标签、十四个 文本框、五个按钮和两个形状。

图 10-3

“js”表单

2、这些控件的属设置如表 10-1: 表 10-1“js”属性设置 对象 属性 属性值 Form1 AutoCenter

说明 设置这个表单在首次显 示时自动在 Visual FoxPro 主 窗口中自动居中

.t.-真

BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow WindowType Label1 Caption AutoSize BackStyle FontName FontSize

指定边框样式 2-固定对话框 标题 书籍借阅 表单的图标,大家可以 monitor.ico( 自 己 使用自己喜欢的图标 选择) 关闭最大化按钮 .F.-假 表单名 Form1 显示工具提示 .T.-真 指定在创建过程中表单 1-在顶层表单中 窗口显示表单

1-模式
读者信息 .T.-真 0-透明 宋体 11

表单在显示或运行时的 动作模式 Label2 到 Label16 的 AutoSize 属性都照此设置 Label2 到 Label16 的 BackStyle 属性都照此设置 Label2 到 Label16 的 FontName 属性都照此设置 Label10 的 FontSize 属 性也是 11,其它从 Label2 到 Label16 的 FontSize 属性 都是 9 名: 别:

Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 Label13 Label14 Label15 Label16 Shape1 Shape2

Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption BackStyle SpecialEffect BackStyle SpecialEffect

读者编号: 姓 性

证件号: 单位部门: 联系电话: 备注: 未还书目: 图书信息 图书编号: 图书名称: 图书类别: 作 者: 出版社: 购买价格: 0-透明 0-3 维 0-透明 0-3 维 指定形状的背景为透明 指定形状的格式

Text1

BackColor

224,224,224

背景色,自己选择一种 喜欢的颜色就行,Text2 到 Text14 的 BackColor 属性都 可照此设置 指定文本框的数据源是表读 者信息中的读者姓名字段

Text2 Text3 Text4 Text5 Text6 Text7 Text8 Text10 Text11 Text12 Text13 Text14 Command1 Command2 Command3 Command4 Command5

ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource Caption FontName Caption FontName Caption FontName Caption FontName Caption FontName

读者信息.读者姓名 读者信息.性别 读者信息.证件号 读者信息.单位部门 读者信息.联系电话 读者信息.备注 读者信息.未还书目 图书资料.图书名称 图书资料.图书类别 图书资料.作者 图书资料.出版社 图书资料.购买价格 确 确 借 清 退 定 定 出 空 出

按钮上显示的文字 按钮上显示的文字字体

宋体 宋体 宋体 宋体 宋体

3、按照图示调整好这些对象的大小和位置,然后双击表单给这些对象添加代码: Form1 的 Load 事件代码: sele 1 use 读者信息 sele 2 use 图书资料 Unload 事件代码:use 设置 Command1“确定“按钮的 Click 事件代码: sele 1 locate for 读者编号=upper(allt(thisform.text1.value)) if not found() =messagebox('没有该读者编号!',0+64+0,'提示')

go top else thisform.command3.enabled=.T. endif thisform.refresh 设置 Command2“确定“按钮的 Click 事件代码: sele 2 locate for 图书编号=upper(allt(thisform.text9.value)) if not found() =messagebox('没有该图书编号!',0+64+0,'提示') go top else thisform.command3.enabled=.T. endif thisform.refresh 设置 Command3“借出“按钮的 Click 事件代码: nAnswer = MESSAGEBOX('确认所借书目的资料无误吗?',4+32+0,'重要提示') if nAnswer = 6 insert into 借书登记(图书编号,读者姓名,读者证件号,借阅日期,借书标志); values(upper(allt(thisform.text10.value)),; upper(allt(thisform.text2.value)),; upper(allt(thisform.text4.value)),; datetime(),'借出') sele 2 replace 借阅次数 with 借阅次数+1 endif 设置 Command4“清空“按钮的 Click 事件代码: thisform.text1.value=' ' thisform.text2.value=' ' thisform.text3.value=' ' thisform.text4.value=' ' thisform.text5.value=' ' thisform.text6.value=' '

thisform.text7.value=' ' thisform.text8.value=' ' thisform.text9.value=' ' thisform.text10.value=' ' thisform.text11.value=' ' thisform.text12.value=' ' thisform.text13.value=' ' thisform.text14.value=0.00 thisform.text1.setfocus 设置 Command5“退出“按钮的 Click 事件代码: thisform.release 保存表单,保存文件名为 js。执行表单,看看运行效果如何。

案例 4:创建还书表单 案例运行效果与操作
还书表单的运行效果和还书表单运行效果基本上一样,只不过显示的一些信息有变化, “借出”按钮变成了“还书”按钮,还书表单的运行效果如图 10-4 所示:

图 10-4 还书表单的运行效果 我们可以输入已借的图书编号,单击“确定”查看指定的图书信息以及借书登记信息, 单击“还书”按钮,实现还书登记。其他按钮的功能和借书表单中的相同按钮一样。

制作要点
1、 SQL 查询语言 2、 文本框属性设置 3、 一些常用函数的使用

步骤详解
1、创建还书表单(hs.scx) ,在命令窗口中输入命令:CREATE FORM hs。打开“数据 环境设计器”窗口,向其中添加图书资料表以及借书登记表。 2、如图 10-5 所示添加控件,控件包括十二个标签、十一个文本框、两个形状和四个按 钮,并且调整它们的位置和大小,合理分布在表单上。

4、 对象 Form1

图 10-5 还书表单 设置这些表单控件的属性,见表 10-2: 表 10-2“hs”属性设置 属性 属性值 AutoCenter

说明

.t.-真

BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow WindowType Label1 Caption AutoSize BackStyle FontName FontSize Label2 Caption AutoSize BackStyle FontName

2-固定对话框 还书 monitor.ico(自己选 择) .F.-假 Form1 .T.-真 1-在顶层表单中 1-模式
所还图书信息 .T.-真 0-透明 宋体 11 图书编号: .T.-真 0-透明 宋体 Label2 到 Label112 的 AutoSize 属性都照此设置 Label2 到 Label12 的 BackStyle 属性都照此设置 Label2 到 Label12 的 FontName 属性都照此设 置 Label2 到 Label12 的 FontSize 属性都照此设置

FontSize Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 Text1 Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption BackColor Top Width Text2 Text3 Text4 Text5 ControlSource ControlSource ControlSource ControlSource

9 图书名称: 图书类别: 作 者: 出版社: 购买价格: 读者编号: 姓 名: 借书日期: 证件号: 应还日期: 224,224,224 59 168 图书资料.图书名称 图书资料.图书类别 图书资料.作者 图书资料.出版社

文本框高度, Text2 到 Text11 的 Top 属性准此 文本框宽度 Text2 到 Text11 的 Width 属性准此

Text6 Text7 Text8 Text9 Text10 Text11 Shape1 Shape2 Command1 Command2 Command3 Command4

ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource BackStyle SpecialEffect BackStyle SpecialEffect Caption FontName Caption FontName Caption FontName Caption FontName

图书资料.购买价格 借书登记.读者编号 借书登记.读者姓名 借书登记.借阅日期 借书登记.读者证件号 借书登记.归还日期 0-透明 0-3 维 0-透明 0-3 维 还 确 清 退 书 定 空 出 宋体 宋体 宋体 宋体 指定形状的背景为透明 指定形状的格式

3、按照图示调整好这些对象的大小和位置,然后双击表单给这些对象添加代码: Form1 的 Load 事件代码: open database 读者管理 Form1 的 Unload 事件代码: close database 设置 Command2“确定“按钮的 Click 事件代码: sele 2 locate for 图书编号=upper(allt(thisform.text1.value)) if not found() =messagebox('没有该图书编号!',0+64+0,'提示') go top else thisform.command1.enabled=.T. endif thisform.refresh 设置 Command1“还书“按钮的 Click 事件代码: nAnswer = MESSAGEBOX('确认你还的书目的资料无误吗?',4+32+0,'重要提示') if nAnswer = 6 sele 3 replace 借 书 标 志 with " 还 回 ", 归 还 日 期 with datetime() for 图 书 编 号 =allt(thisform.text1.value)

thisform.refresh =messagebox('操作完成,该书已经归档!',0+64+0,'完成') Endif 设置 Command3“清空“按钮的 Click 事件代码: thisform.text1.value=' ' thisform.text2.value=' ' thisform.text3.value=' ' thisform.text4.value=' ' thisform.text5.value=' ' thisform.text6.value=0.00 thisform.text7.value=' ' thisform.text8.value=' ' thisform.text9.value=' ' thisform.text10.value=' ' thisform.text11.value=' ' thisform.text1.setfocus 设置 Command4“退出“按钮的 Click 事件代码: thisform.release

案例 5:创建资料查询表单 案例运行效果与操作
这个表单是包含两个选项卡的查询对话框, 用于查询读者信息资料和图书信息资料, 每 一个选项卡都有查询选项和用于显示查询结果的表格, 还可以选择是否用模糊查找。 表单上 除了两个选项卡外,还设计了四个按钮辅助查询。表单的运行效果如图 10-6 和 10-7 所示, 在查询栏中输入其中的一些信息,可以是一个也可以是几个,并且选择是否模糊查找,然后 单击选项卡上的“确定”或者选项卡外的“确定”按钮,表单中就会显示查询结果。 “清空” 按钮用于清除文本框中的数据。另外表单中还有一个“全部显示”按钮,功能是显示图书资 料全部信息或者是读者信息资料,显示那一个由选项卡的活动页决定,也就是说,由你选择 的选项卡决定。 “退出”按钮用于释放表单。

图 10-6 资料查询—图书资料查询运行效果

图 10-7 资料查询—读者资料查询运行效果

制作要点
1、 页框添加以及页框属性的设置

2、 表格添加以及表格属性的设置 3、字符串比较函数

步骤详解
1、新建一个表单,保存文件名为 cx,打开“数据环境设计器”窗口,向其中添加读者 信息表、图书资料表。 2、 如图 10-6 和 10-7 通过 “表单控件” 添加控件, 分别添加一个页框控件 (Pageframe1) 、 和四个按钮控件。然后右击页框,选择“编辑” ,在页框的两个页面(Page1 和 Page2)上分 别添加其它控件。页面 Page1 上有一个形状控件、五个标签控件、四个文本框控件、一个复 选框控件、一个表格控件和两个按钮控件;同样页面 Page2 上有一个形状控件、五个标签控 件、四个文本框控件、一个复选框控件、一个表格控件和两个按钮控件。这些控件的主要属 性设置如表 10-3 所示: 表 10-3“cx”属性设置 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow WindowType Command1 Caption FontName Height Width Picture 属性值 说明

.t.-真 2-固定对话框 资料查询 monitor.ico(自己选 择) .F.-假 Form1 .T.-真 1-在顶层表单中 1-模式
查 询 宋体

61 73 kfind.ico

按钮上显示的图标, 大家可以自己选择合适 的, VFP 中自带很多图标, 一 般 保 存 在 ? \Microsoft Visual Studio\Common\Graphics\I cons 文件中 控件提示文本

ToolTipText Command2 Caption FontName Height Width Picture ToolTipText

单击查询
显示全部 宋体

61 73 font_type1.ico
显示全部资料

Command3

Caption FontName Height Width Picture ToolTipText

清 空 宋体

61 73 trashcan_empty.ico
清空数据 退 出 宋体

Command4

Caption FontName Height Width Picture ToolTipText

61 73 xapp.ico
关闭此表单 Pageframe1 2 图书资料查询 0-透明 0-3 维 查 询 .T.-真 Standardlabel1 到 Standardlabel4 的 AutoSize 属性都照此设置 Standardlabel1 到 Standardlabel4 的 BackStyle 属性都照此设置 Standardlabel1 到 Standardlabel4 的 FontName 属性都照此设 置 Standardlabel1 到 Standardlabel4 的 AutoSize 属性都设置为 9 页框包含的页数

Pageframe1 Page1 Shape1 Label1

Name PageCount Caption BackStyle SpecialEffect Caption AutoSize

BackStyle

0-透明

FontName

宋体

FontSize

10

Standardlabel1 Standardlabel2 Standardlabel3 Standardlabel4 Check1 Command1 Command2 Grid1 Column1 Header1

Caption Caption Caption Caption Caption AutoSize Caption Caption ColumnCount BackColor ControlSource Caption

图书编号: 图书类别: 图书名称: 作 者: 模糊查找 .T.-真 查 找 清 空 10 237,237,226 图书资料.图书编号 图书编号 表格列数 表格背景 表格列数据来源

Column2 Header2 Column3 Header3 Column4 Header4 Column5 Header5 Column6 Header6 Column7 Header7 Column8 Header8 Column9 Header9 Column10 Header10 Page2 Shape1 Label1

ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption Caption BackStyle SpecialEffect Caption AutoSize

图书资料.图书名称 图书名称 图书资料.作者 作者 图书资料.图书类别 图书类别 图书资料.出版社 出版社 图书资料.出版日期 出版日期 图书资料.入馆日期 入馆日期 图书资料.购买价格 购买价格 图书资料.借阅次数 借阅次数 图书资料.备注 备注 读者资料查询 0-透明 0-3 维 查 询 .T.-真 Standardlabel1 到 Standardlabel4 的 AutoSize 属性都照此设置 Standardlabel1 到 Standardlabel4 的 BackStyle 属性都照此设置 Standardlabel1 到 Standardlabel4 的 FontName 属性都照此设 置 Standardlabel1 到 Standardlabel4 的 AutoSize 属性都设置为 9

BackStyle

0-透明

FontName

宋体

FontSize

10

Standardlabel1 Standardlabel2 Standardlabel3 Standardlabel4 Check1 Command1 Command2

Caption Caption Caption Caption Caption AutoSize Caption Caption

读者编号: 证件号: 读者姓名: 职 .T.-真 查 找 清 空 业: 模糊查找

Grid1 Column1 Header1 Column2 Header2 Column3 Header3 Column4 Header4 Column5 Header5 Column6 Header6 Column7 Header7 Column8 Header8 Column9 Header9 Column10 Header10

ColumnCount BackColor ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption

10 237,237,226 读者信息.读者编号 读者编号 读者信息.读者姓名 读者姓名 读者信息.证件号 证件号 读者信息.性别 性别 读者信息.单位部门 单位部门 读者信息. 住址 住址 读者信息.职业 职业 读者信息.联系电话 联系电话 读者信息.未还书目 未还书目 图书资料.备注 备注

表格列数 表格背景 表格列数据来源

3、按照图示调整好这些对象的大小和位置,然后双击表单给这些对象添加代码。 首先给表单右边的四个按钮添加代码。 “查询”按钮的 Click 事件代码: if thisform.Pageframe1.activepage=1 thisform.pageframe1.page1.Grid1.recordsourceType=4 tsbh=allt(thisform.Pageframe1.page1.text1.value) zz=allt(thisform.pageframe1.page1.text2.value) tsmc=allt(thisform.pageframe1.page1.text3.value) tslb=allt(thisform.pageframe1.page1.text4.value) if thisform.pageframe1.page1.check1.value=0 thisform.pageframe1.page1.Grid1.recordsource=; "select * from 图书资料 where tsbh$图书编号; .or.zz$作者.or.tsmc$图书名称.or.tslb$图书类别 into cursor a" else set exact on thisform.pageframe1.page1.Grid1.recordsource=; "select * from 图书资料 where tsbh==图书编号; .or.zz==作者.or.tsmc==图书名称.or.tslb==图书类别 into cursor a" set exact off endif else

if thisform.Pageframe1.activepage=2 thisform.pageframe1.page2.Grid1.recordsourceType=4 dzbh=allt(thisform.Pageframe1.page2.text1.value) dzxx=allt(thisform.Pageframe1.page2.text2.value) zjh=allt(thisform.Pageframe1.page2.text3.value) dwbm=allt(thisform.Pageframe1.page2.text4.value) if thisform.Pageframe1.page2.check1.value=0 thisform.Pageframe1.page2.Grid1.recordsource=; "select * from 读者信息 where dzbh$读者编号; .or.dzxx$读者姓名.or.zjh$证件号.or.dwbm$职业 into cursor a" else set exact on thisform.Pageframe1.page2.Grid1.recordsource=; "select * from 读者信息 where dzbh==读者编号; .or.dzxx==读者姓名.or.zjh==证件号.or.dwbm==职业 into cursor a" set exact off endif endif endif “显示全部”按钮的 Click 事件代码: if thisform.Pageframe1.activepage=1 thisform.pageframe1.page1.Grid1.recordsourceType=4 thisform.pageframe1.page1.Grid1.recordsource=; "select * from 图书资料 into cursor a" endif if thisform.Pageframe1.activepage=2 thisform.pageframe1.page2.Grid1.recordsourceType=4 thisform.Pageframe1.page2.Grid1.recordsource=; "select * from 读者信息 into cursor a" Endif “清空”按钮的 Click 事件代码: if thisform.Pageframe1.activepage=1 thisform.Pageframe1.page1.text1.value='' thisform.Pageframe1.page1.text2.value='' thisform.Pageframe1.page1.text3.value='' thisform.Pageframe1.page1.text4.value='' endif if thisform.Pageframe1.activepage=2 thisform.Pageframe1.page1.text1.value='' thisform.Pageframe1.page1.text2.value='' thisform.Pageframe1.page1.text3.value='' thisform.Pageframe1.page1.text4.value='' endif “退出”按钮的 Click 事件代码:

thisform.release 接下来给页框上的控件添加代码,右击页框,在弹出的快捷菜单中选择“编辑” ,然后 就可以选中对象添加事件代码了。 图书资料查询页(Page1)中各对象代码: “查找”按钮的 Click 事件代码: thisform.pageframe1.page1.Grid1.recordsourceType=4 tsbh=allt(thisform.Pageframe1.page1.text1.value) zz=allt(thisform.pageframe1.page1.text2.value) tsmc=allt(thisform.pageframe1.page1.text3.value) tslb=allt(thisform.pageframe1.page1.text4.value) if thisform.pageframe1.page1.check1.value=0 thisform.pageframe1.page1.Grid1.recordsource=; "select * from 图书资料 where tsbh$图书编号; .or.zz$作者.or.tsmc$图书名称.or.tslb$图书类别 into cursor a" else set exact on thisform.pageframe1.page1.Grid1.recordsource=; "select * from 图书资料 where tsbh==图书编号; .or.zz==作者.or.tsmc==图书名称.or.tslb==图书类别 into cursor a" set exact off endif “清空”按钮的 Click 事件代码: thisform.Pageframe1.page1.text1.value='' thisform.Pageframe1.page1.text2.value='' thisform.Pageframe1.page1.text3.value='' thisform.Pageframe1.page1.text4.value='' 读者资料查询页(Page2)中各对象代码: “查找”按钮的 Click 事件代码: thisform.pageframe1.page2.Grid1.recordsourceType=4 dzbh=allt(thisform.Pageframe1.page2.text1.value) dzxx=allt(thisform.Pageframe1.page2.text2.value) zjh=allt(thisform.Pageframe1.page2.text3.value) dwbm=allt(thisform.Pageframe1.page2.text4.value) if thisform.Pageframe1.page2.check1.value=0 thisform.Pageframe1.page2.Grid1.recordsource=; "select * from 读者信息 where dzbh$读者编号; .or.dzxx$读者姓名.or.zjh$证件号.or.dwbm$职业 into cursor a" else set exact on thisform.Pageframe1.page2.Grid1.recordsource=; "select * from 读者信息 where dzbh==读者编号; .or.dzxx==读者姓名.or.zjh==证件号.or.dwbm==职业 into cursor a" set exact off endif

“清空”按钮的 Click 事件代码: thisform.Pageframe1.page2.text1.value='' thisform.Pageframe1.page2.text2.value='' thisform.Pageframe1.page2.text3.value='' thisform.Pageframe1.page2.text4.value=''

案例 6:创建图书管理表单 案例运行效果与操作
为了实现图书资料的管理和读者信息的管理, 我们用两个案例分别学习如何制作资料管 理表单, 这个案例的功能是管理图书资料的, 可以通过表单上的相应按钮查看、 添加、 删除、 修改图书资料。图书管理表单的运行效果如图 10-8 所示:

图 10-8 图书管理表单运行效果

制作要点
1、 表格的 ControlSource 属性设置 2、 记录指针的指向和定位

步骤详解
1、新建一个表单,保存文件名为 tsgl,打开“数据环境设计器”窗口,向其中添加图

书资料表。 2、添加控件。如图 10-8 所示添加控件,控件包括九个按钮(Command1~ Command9) 、 十六个标签、两个形状控件、一个复选框、一个表格控件和十五个文本框。添加完控件后调 整它们的布局。 3、各对象属性设置如表 10-4 所示: 表 10-4 “tsgl”表单各对象主要属性 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow WindowType Label1 Caption AutoSize BackStyle FontName 属性值 说明

.t.-真 2-固定对话框 图书管理 monitor.ico(自己选 择) .F.-假 Form1 .T.-真 1-在顶层表单中 1-模式
图书编号: .T.-真 0-透明 宋体 Label1 到 Label16 的 AutoSize 属性都照此设置 Label1 到 Label16 的 BackStyle 属性都照此设置 Label1 到 Label16 的 FontName 属性都照此设 置 Label11 的 FontSize 属 性是 11, 其它从 Label1 到 Label16 的 FontSize 属性都 是9 者:

FontSize

9

Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 Label13 Label14 Label15

Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption



出版日期: 借阅次数: 图书类别: 购买价格: 出版社: 入馆日期: 图书名称: 备 注: 查 询 图书编号: 作 者: 图书名称: 出版社:

Label16 Text1 Text2 Text3 Text4 Text5 Text6 Text7 Text8 Text9 Text10 Text11~ Text15 Check1 Shape1~ Shape2 Command1 Command2 Command3 Command4 Command5 Command6 Command7 Command8 Command9 Grid1 Column1 Header1 Column2 Header2 Column3 Header3

Caption BackColor ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource Caption AutoSize BackStyle SpecialEffect Caption Caption Caption Caption Caption Caption Caption Caption Caption ColumnCount BackColor ControlSource Caption ControlSource Caption ControlSource Caption

图书类别: 224,224,224 图书资料.图书编号 图书资料.作者 图书资料.出版日期 图书资料.借阅次数 图书资料.图书类别 图书资料.购买价格 图书资料.出版社 图书资料.入馆日期 图书资料.图书名称 图书资料.备注 无 模糊查找 .T.-真 0-透明 0-3 维 查 找 清 空 上一条 下一条 删 退 增 末 首 3 237,237,226 图书资料.图书编号 .图书编号 图书资料.图书名称 图书名称 图书资料.作者 作者 除 出 加 条 条 表格列数 表格背景

代码添加与解释
双击表单添加各对象的事件代码: “查询”按钮的 Click 事件代码: thisform. Grid1.recordsourceType=4 tsbh=allt(thisform.text1.value) zz=allt(thisform.text2.value)

tsmc=allt(thisform.text3.value) cbs=allt(thisform.text4.value) tslb=allt(thisform.text5.value) if thisform.check1.value=1 thisform.Grid1.recordsource="select * from ; 图书资料 where tsbh$图书编号; .or.zz$作者.or.tsmc$图书名称.or.cbs$出版社.or.; tslb$图书类别 into cursor a" else set exact on thisform.Grid1.recordsource="select * from ; 图书资料 where tsbh==图书编号; .or.zz==作者.or.tsmc==图书名称.or.cbs==出版社; .or.tslb==图书类别 into cursor a" set exact off endif “清空”按钮的 Click 事件代码: thisform.text1.value='' thisform.text2.value='' thisform.text3.value='' thisform.text4.value='' thisform.text5.value='' “上一步”按钮的 Click 事件代码: sele 2 if .not.bof() skip -1 thisform.command3.setfocus thisform.refresh endif “下一步”按钮的 Click 事件代码: sele 2 if .not.eof() skip thisform.command4.setfocus thisform.refresh endif “删除”按钮的 Click 事件代码: x=messagebox("真的删除编号为; "+allt(thisform.text1.value)+"的图书吗?",4+32+256,"重要提示") if x=6 delete thisform.refresh else return .F.

endif “退出”按钮的 Click 事件代码: thisform.release “增加”按钮的 Click 事件代码: sele 2 append blank go bottom thisform.refresh “末条”按钮的 Click 事件代码: sele 2 go bottom thisform.refresh “首条”按钮的 Click 事件代码: sele 2 go top thisform.refresh

案例 7:创建读者管理表单 案例运行效果与操作
这是管理数据的另一个表单, 用于管理读者信息资料, 这个表单的运行效果和图书管理 表单基本上一样。制作方法一样,只不过处理的数据信息不一样而已。运行效果如图 10-9 所示:

图 10-9

读者管理表单运行效果

制作要点
1、 表格的 ControlSourceSype 属性 2、 SELECT 查询语句

步骤详解
1、新建一个表单,保存文件名为 dzgl,打开“数据环境设计器”窗口,向其中添加读 者信息表。 2、添加控件。如图 10-9 所示添加控件,控件包括九个按钮(Command1~ Command9) 、 十六个标签、两个形状控件、一个复选框、一个表格控件和十五个文本框。添加完控件后调 整它们的布局。 3、各对象属性设置如表 10-5 所示: 表 10-5 “dzgl”表单各对象主要属性 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow WindowType Label1 Caption AutoSize BackStyle FontName 属性值 说明

.t.-真 2-固定对话框 读者信息 monitor.ico(自己选 择) .F.-假 Form1 .T.-真 1-在顶层表单中 1-模式
读者编号: .T.-真 0-透明 宋体 Label1 到 Label16 的 AutoSize 属性都照此设置 Label1 到 Label16 的 BackStyle 属性都照此设置 Label1 到 Label16 的 FontName 属性都照此设 置 Label11 的 FontSize 属 性是 11, 其它从 Label1 到 Label16 的 FontSize 属性都 是9

FontSize

9

Label2 Label3 Label4 Label5 Label6

Caption Caption Caption Caption Caption

读者姓名: 证件号: 性别: 单位部门: 住址:

Label7 Label8 Label9 Label10 Label11 Label12 Label13 Label14 Label15 Label16 Text1

Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption BackColor

职业: 联系电话: 未还书目: 备 注: 查 询 读者编号: 读者姓名: 证件号: 单位部门: 联系电话: 224,224,224 Text1 到 Text15 的 BackColor 属性都照此设 置

ControlSource Text2 Text3 Text4 Text5 Text6 Text7 Text8 Text9 Text10 Text11~ Text15 Check1 Shape1~ Shape2 Command1 Command2 Command3 Command4 Command5 Command6 Command7 Command8 Command9 Grid1 Column1 Header1 Column2 Header2 ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource ControlSource Caption AutoSize BackStyle SpecialEffect Caption Caption Caption Caption Caption Caption Caption Caption Caption ColumnCount BackColor ControlSource Caption ControlSource Caption

读者信息.读者编号 读者信息.读者姓名 读者信息.证件号 读者信息.性别 读者信息.单位部门 读者信息.住址 读者信息.职业 读者信息.联系电话 读者信息.未还书目 读者信息.备注 无 模糊查找 .T.-真 0-透明 0-3 维 查 找 清 空 上一条 下一条 删 退 增 末 首 10 237,237,226 读者信息.读者编号 读者编号 读者信息.读者姓名 读者姓名 除 出 加 条 条

Column3 Header3 Column4 Header4 Column5 Header5 Column6 Header6 Column7 Header7 Column8 Header8 Column9 Header9 Column10 Header10

ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption ControlSource Caption

读者信息.证件号 证件号 读者信息.性别 性别 读者信息.单位部门 单位部门 读者信息.住址 住址 读者信息.职业 职业 读者信息.联系电话 联系电话 读者信息.未还书目 未还书目 读者信息.备注 备注

代码添加与解释
双击表单添加各对象的事件代码: “查询”按钮的 Click 事件代码: thisform. Grid1.recordsourceType=4 dzbh=allt(thisform.text1.value) dzxx=allt(thisform.text2.value) zjh=allt(thisform.text3.value) dwbm=allt(thisform.text4.value) lxdh=allt(thisform.text5.value) if thisform.check1.value=1 thisform.Grid1.recordsource="select * from; 读者信息 where dzbh$读者编号; .or.dzxx$读者姓名.or.zjh$证件号.or.; dwbm$单位部门.or.lxdh$联系电话 into cursor a" else set exact on thisform.Grid1.recordsource="select * from ; 读者信息 where dzbh==读者编号; .or.dzxx==读者姓名.or.zjh==证件号.or.; dwbm==单位部门.or.lxdh==联系电话 into cursor a" set exact off endif “清空”按钮的 Click 事件代码: thisform.text1.value='' thisform.text2.value=''

thisform.text3.value='' thisform.text4.value='' thisform.text5.value='' “上一步”按钮的 Click 事件代码: sele 1 if .not.bof() skip -1 thisform.command3.setfocus thisform.refresh endif “下一步”按钮的 Click 事件代码: sele 1 if .not.eof() skip thisform.command4.setfocus thisform.refresh endif “删除”按钮的 Click 事件代码: x=messagebox("真的删除编号为; "+allt(thisform.text1.value)+"的图书吗?",4+32+256,"重要提示") if x=6 delete thisform.refresh else return .F. endif “退出”按钮的 Click 事件代码: thisform.release “增加”按钮的 Click 事件代码: sele 1 append blank go bottom thisform.refresh “末条”按钮的 Click 事件代码: sele 1 go bottom thisform.refresh “首条”按钮的 Click 事件代码: sele 1 go top thisform.refresh

案例 8:创建图书管理系统的报表 制作要点
1、 利用向导制作报表 2、 利用报表设计器制作和修改报表

步骤详解
创建三个报表实现图书资料、 读者信息和借书登记的数据打印。 下面我们用用报表向导 创建这三个报表。首先我们创建图书资料报表(图书资料.FRX) ,基本步骤: (1) 打开表图书资料.DBF 文件,由该表建立相应的报表的数据源。 (2) 打开“工具”菜单中的“向导” ,选择“报表” ,出现“向导选取”对话框。 (3) 选择“报表向导” ,报表向导总共有 6 个步骤。单击“确定” ,进入步骤1-字 段选取。如图 10-10 所示:选定全部字段。

图 10-10 步骤一 单击“下一步”进入步骤2—分组记录,如图 10-11 所示,直接单击“下一步”进入 步骤3-选择报表样式,如图 10-12。

图 10-11 步骤二

图 10-12 步骤三 大家可以按需要选择报表样式, 一般我们选择我们熟悉的帐务式, 也可以直接单击 “下 一步”进入步骤 4-定义报表布局。如图 10-13 所示:设置报表的布局。可以改变列数、方 向和字段布局来改变报表布局,在这里作者本人是按照默认布局直接单击“下一步”按钮进 入步骤5-排序记录的。步骤5-排序记录如图 10-14 所示:

图 10-13

步骤四

图 10-14 步骤五 在步骤5-排序记录步骤中,我们选择“图书编号”为排序字段,排序为升序,单击 “下一步”进入步骤6-完成。如图 10-15 所示,在步骤六中,我们输入报表标题“图书资 料” ,选中“保存报表并在“报表设计器”中修改,单击“完成”按钮,保存名为:图书资 料(图书资料.FRX) 。 因为在通常情况下, 直接使用向导制作的报表并不能满足我们的要求, 所以我们还需要 借助报表设计器进行修改。在打开的报表设计器(如图 10-16)中修改简单修改报表的布局, 还可以利用报表设计控件栏中的各个控件完善报表, 修改完成后保存并预览制作效果, 反复 测试修改,达到满意效果。 用同样的方法做读者信息报表和借书登记报表,分别命名为:读者信息 (读者信 息.FRX) ,借书登记(借书登记.FRX)(制作过程同上) 。

图 10-15 步骤六

图 10-16

报表设计器

案例 9:创建报表打印表单 案例运行效果与操作
一般打印的时候并不是打印所有的数据, 而只是某些指定的特定数据, 为了满足这个要 求,我们制作了这样一个控制报表打印的表单,这个表单可以实现按指定条件打印,下面看 一下它的运行效果图,如图 10-17 所示。 操作时,我们先选中要打印的报表,然后在单选框以及文本框中指定打印的条件,选择 打印的份数,如果你的计算机已经连接了打印机,单击“打印”按钮就可以实现按条件的打 印。 “取消”按钮的功能是释放表单。

图 10-17 打印表单的运行效果

制作要点
1、选项按钮组的使用 2、列表框的使用 3、报表打印命令

步骤详解
1、创建打印表单(dayin.scx) 。在命令窗口中输入命令:CREATE FORM dayin。打开 “数据环境设计器”窗口,向其中添加读者信息表、图书资料表和借书登记表。 2、添加控件。如图 10-17 所示,添加一个选项按钮组,一个形状控件,三个文本框, 六个标签和一个列表框,一个微调控件,一个图象控件和两个按钮控件,添加好并且调整位 置,是布局合理。 3、设置这些对象的属性,主要属性设置如表 10-6 所示: 表 10-6 “dayin”表单各对象主要属性 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips 属性值 说明

.t.-真 2-固定对话框 打印 monitor.ico(自己选 择) .F.-假 Form1 .T.-真

ShowWindow Picture WindowType Shape1 Imagel Label1 BackStyle SpecialEffect BackStyle Picture Caption AutoSize BackStyle FontName

1-在顶层表单中 1.jpg 1-模式
0-透明 0-3 维 0-透明 print_printer.ico 选择报表: .T.-真 0-透明 宋体

表单背景图片(自选)

自选 Label1 到 Label6 的 AutoSize 属性都照此设置 Label1 到 Label6 的 BackStyle 属性都照此设置 Label1 到 Label6 的 FontName 属性都照此设 置 从 Label1 到 Label6 的 FontSize 属性都是 9

FontSize Label2 Label3 Label4 Label5 Label6 Combo1 Caption Caption Caption Caption Caption RowSource RowSourceTy pe Text1~Text3 Optiongroup1 Option1 BackColor BackStyle ButtonCount AutoSize BackStyle Caption Option2 Option3 Option4 Spinner1 Caption Caption Caption Enabled KeyboardHig hValue KeyboardLow Value TooTipText

9 读者编号 读者姓名 图书编号 份数 份 读者信息,图书资料, 借书登记 1-值 230,230,230 0-透明 4 .T.-真 0-透明 按读者编号打印 按读者姓名打印 按图书编号打印 打印全部 .F.-假 100 1 选择打印份数

Option1 到 Option4 的 AutoSize 属性都照此设置 Option1 到 Option4 的 BackStyle 属性都照此设置

微调允许输入的最大值 微调允许输入的最小值 提示文本

Command1

Caption FontName Height Width Picture ToolTipText

打 印 宋体

49 61 print_printer.ico 单击打印
取 消 宋体

自选

Command2

Caption FontName Height Width Picture ToolTipText

49 61 x.ico 单击关闭

自选

代码添加与解释
双击表单添加各对象的事件代码: 列表框 Combo1 的 Init 事件代码: this.value=this.list(1) 列表框 Combo1 的 InteractiveChange 事件代码: If allt(this.value)="读者信息" Thisform.optiongroup1.enabled=.t. Thisform.optiongroup1.option1.enabled=.t. Thisform.optiongroup1.option2.enabled=.t. Thisform.optiongroup1.option3.enabled=.f. Thisform.optiongroup1.option4.enabled=.t. Thisform.optiongroup1.value=1 Thisform.text1.value="" Thisform.text2.value="" Thisform.text3.value="" Thisform.text3.enabled=.f. Else If allt(this.value)="图书资料" Thisform.optiongroup1.enabled=.t. Thisform.optiongroup1.value=2 Thisform.optiongroup1.option1.enabled=.f. Thisform.optiongroup1.option2.enabled=.f. Thisform.optiongroup1.option3.enabled=.t. Thisform.optiongroup1.option4.enabled=.t. Thisform.text1.value="" Thisform.text2.value="" Thisform.text3.value="" Thisform.text1.enabled=.f.

Thisform.text2.enabled=.f. Thisform.text3.enabled=.t. else If allt(this.value)="借书登记" Thisform.optiongroup1.enabled=.t. Thisform.optiongroup1.value=3 Thisform.optiongroup1.option1.enabled=.t. Thisform.optiongroup1.option2.enabled=.t. Thisform.optiongroup1.option3.enabled=.t. Thisform.optiongroup1.option4.enabled=.t. Thisform.text1.value="" Thisform.text2.value="" Thisform.text3.value="" Thisform.text1.enabled=.t. Thisform.text2.enabled=.t. Thisform.text3.enabled=.t. 按钮选项组 Optiongroup1 的 Init 事件代码: Thisform.optiongroup1.ENABLED=.T. Thisform.optiongroup1.option1.ENABLED=.T. Thisform.optiongroup1.option2.ENABLED=.T. Thisform.optiongroup1.option3.ENABLED=.F. Thisform.optiongroup1.option4.ENABLED=.F. Thisform.optiongroup1.VALUE=1 按钮选项组 Optiongroup1 的 InteractiveChange 事件代码: Do case Case this.value=1 Thisform.text1.enabled=.t. Thisform.text2.enabled=.f. Thisform.text3.enabled=.f. Thisform.text1.value="" Case this.value=2 Thisform.text1.enabled=.f. Thisform.text2.enabled=.t. Thisform.text3.enabled=.f. Thisform.text2.value="" Case this.value=3 Thisform.text1.enabled=.f. Thisform.text2.enabled=.f. Thisform.text3.enabled=.t. Thisform.text3.value="" Case this.value=4 Thisform.text1.enabled=.f. Thisform.text2.enabled=.f. Thisform.text3.enabled=.f.

Endcase Thisform.refresh 添加微调控件 Spinner1 的 Refresh 事件代码: if !empty(thisform.combo1.value) this.enabled=.t. endif 添加“打印”按钮的 Click 事件代码: Public pn pn=thisform.spinner1.value If upper(sys(102))="OFF" Messagebox("未连接打印机!",16+0,"打印") Else If empty(allt(thisform.combo1.value)) Messagebox("请选择报表!",64+0,"打印") Else If allt(thisform.combo1.value)="读者信息" Do case Case empty(allt(thisform.text1.value)) and thisform.text1.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case empty(allt(thisform.text2.value)) and thisform.text2.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case !empty(allt(thisform.text1.value)) and thisform.text1.enabled=.t. Use sys(5)+curdir()+"读者管理!读者信息" Locate for (读者编号)=allt(thisform.text1.value) If found() For i=1 to pn Report form 读 者 信 息 for ( 读 者 编 号)=allt(thisform.text1.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif Use Case !empty(allt(thisform.text2.value)) and thisform.text2.enabled=.t. Use sys(5)+curdir()+"读者管理!读者信息" Locate for (读者姓名)=allt(thisform.text2.value) If found() For i=1 to pn Report form 读 者 信 息 for ( 读 者 姓 名)=allt(thisform.text2.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif

Use endcase else If allt(thisform.combo1.value)="图书资料" Do case Case empty(allt(thisform.text3.value)) and thisform.text3.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case !empty(allt(thisform.text3.value)) and thisform.text3.enabled=.t. Use sys(5)+curdir()+"读者管理!图书资料" Locate for (图书编号)=allt(thisform.text3.value) If found() For i=1 to pn Report form 图 书 资 料 for ( 图 书 编 号)=allt(thisform.text3.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif Use endcase else If allt(thisform.combo1.value)="借书登记" Do case Case empty(allt(thisform.text1.value)) and thisform.text1.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case empty(allt(thisform.text2.value)) and thisform.text2.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case empty(allt(thisform.text3.value)) and thisform.text3.enabled=.t. Messagebox("请输入打印条件!",64+0,"打印") Case !empty(allt(thisform.text1.value)) and thisform.text1.enabled=.t. Use sys(5)+curdir()+"读者管理!借书登记" Locate for (图书编号)=allt(thisform.text1.value) If found() For i=1 to pn Report form 借 书 登 记 for ( 图 书 编 号)=allt(thisform.text1.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif Use Case !empty(allt(thisform.text2.value)) and thisform.text2.enabled=.t. Use sys(5)+curdir()+"读者管理!借书登记" Locate for (读者姓名)=allt(thisform.text2.value)

If found() For i=1 to pn Report form 借书登记 for (读者姓名)=allt(thisform.text2.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif Use Case !empty(allt(thisform.text3.value)) and thisform.text3.enabled=.t. Use sys(5)+curdir()+"读者管理!借书登记" Locate for (图书编号)=allt(thisform.text3.value) If found() For i=1 to pn Report form 借书登记 for (图书编号)=allt(thisform.text3.value) to printer Endfor Else Messagebox("找不到符合条件的记录!",48+0,"打印") Endif Use endcase else if allt(thisform.combo1.value)="借书登记" or allt(thisform.combo1.value)="读者 信息" or allt(thisform.combo1.value)="图书资料" For i=1 to pn Report form allt(thisform.combo1.value) to printer Endfor endif endif endif endif endif endif 添加“取消”按钮的 Click 事件代码: release thisform 好了,终于输入完代码,运行表单看看它的效果如何。

案例 10:创建一个自定义工具类 案例运行效果与操作
类是模板,支持创建在应用程序中可以重复使用的类是 VFP 最强大的功能之一;通常 用户定义类的目的是不外乎是两个, 一是封装通用功能, 二是赋予应用程序统一的外观和风 格。在这个案例中我们创建一个按钮组的类,作为我们主表单的工具栏,它不能直接运行,

把它插入表以后可以看他的运行效果,下一个案例中可以看它的 运行效果。

制作要点
1、类的创建 2、类设计器的使用

步骤详解
1、选定文件菜单中的新建命令,在新建对话框中选中“类” 选项按钮,然后单击“新建文件”按钮。 2、在打开的“新建类”对话框中输入类名 gongju;在“派生 于”下拉列表中选定基类 CommandGroup;在“存储于”文本框 中输入类库的名字:bar;单击“确定”按钮,关闭对话框。 3、在类设计器中为“gongju”类设置属性, “gongju” 类中 包括八个按钮,如图 10-18 所示, “gongju”的 ButtonCount 属性设 置为 8,其他八个按钮的属性设置如表 10-7 所示。

图 10-18 “gongju”类设计器 表 10-7 Command1 “gongju”类中各按钮属性 借 书 宋体 Caption FontName Height Width Picture

55 60 无标题 (11).ico

按钮高度,其他按钮准此 按钮宽度,其他按钮准此 按钮上显示的图标, 大家可以自己选择合适 的, VFP 中自带很多图标, 一 般 保 存 在 ? \Microsoft Visual Studio\Common\Graphics\I cons 文件中 控件提示文本

ToolTipText Command2 Caption Picture ToolTipText Command3 Caption Picture

借书
还 书

无标题 (7).ico 还书
图书管理

无标题 (10).ico

ToolTipText Command4 Caption Picture ToolTipText Command5 Caption Picture ToolTipText Command6 Caption Picture ToolTipText Command7 Caption Picture ToolTipText Command8 Caption Picture ToolTipText

图书管理 读者管理

无标题 (21).ico 读者管理
资料查询

files.ico 资料查询
密码设置

aim.ico 密码设置
打 印

print_printer.ico 打印
退出

x.ico 退出系统

4、为各个按钮添加事件代码。 “借书”按钮的 Click 事件代码: do form js “还书”按钮的 Click 事件代码: do form hs “图书管理”按钮的 Click 事件代码: do form tsgl “读者管理”按钮的 Click 事件代码: do form dzgl “资料查询”按钮的 Click 事件代码: do form cx “密码设置”按钮的 Click 事件代码: do form xgmm && 这个表单在后边的案例中创建 “打印”按钮的 Click 事件代码: do form dayin “退出”按钮的 Click 事件代码: _screen.activeform.tag="0" ask=messagebox("确实要退出系统吗?",4+32+256,"图书管理系统") if ask=6 close all clear all release all clear events else _screen.activeform.tag="1" Endif 好了,保存并关闭类设计器,一个工具栏的类就设计完成,下一个案例中我们使用创建

好的类。

案例 11:设计图书管理系统的主表单 案例运行效果与操作
系统主表单为整个系统提供了主界面, 是整个系统的操作平台, 这个案例设计的主表单 包括菜单栏和上个案例设计好的工具栏, 我们通过相应的工具按钮或者菜单项打开相应的对 话框进行操作。主表单的运行效果如图 10-19 所示,需要注意的是在这个运行效果图中由于 没有执行菜单,所以,标题栏的下面还没有菜单栏。

图 10-19 主表单执行效果

制作要点
1、 表单的 QueryUnload 事件 2、 类的使用 3、 图象控件使用

步骤详解
1、 创建图书管理系统主表单 (mainform.scx) 在命令窗口中输入命令: , CREATE FORM

mainform。 2、在表单上添加一个图象控件,找一张比较好的、足够大的图片(能充满整个表单) 作为系统的底面背景图,图象控件的 Picture 属性就设置为这张选好的图片、其它的属性设 置为默认。 3、添加刚才做好的类。添加类的方法和添加其他的表单控件一样,在表单控件工具栏 中选择“查看类”按钮,在弹出的选项里选择“添加” ,然后把你作好的“bar.vcx”添加进 去,这个时候,你会发现表单控件栏中有你做的“gongju”类,然后就可以像添加其它控件 一样把它添加到表单上。然后调整它的布局,把它放在最左边,如图 10-19 一样设置好。 4、设置表单的一些属性,让它作为顶层表单,设置如下表 10-8 所示: 表 10-8 “mainform”表单主要属性 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow Heigh Width 属性值 说明

.T.-真 2-固定对话框 图书管理系统 monitor.ico(自己选 择) .F.-假 Form1 .T.-真 2-作为顶层表单 550 780

5、双击表单给表单 Form1 添加 QueryUnload 事件代码: if this.tag="1" ask=messagebox("确实要退出系统吗?",4+32+256,"学生管理系统") if ask=6 close all release all clear events else NODEFAULT endif endif 这样图书管理系统的主表单就设计完成了。

案例 12:初始化表单的制作 案例运行效果与操作
初始化,让人感觉是一个很神秘、有趣而感觉很复杂的一个操作,设计初始化表单让人 以为高深莫测, 其实, 当我们学习了这个案例后你会发现, 其实它不是我们想象中的那么难。

我想大家以前设计过进度条, 这个案例就是将一个进度条, 它的初始化功能是通过调用程序 实现的,所要调用的这个程序的功能是重新创建一个数据库和表来替换原来有的数据库和 表,我这样一说,大家可能觉得简单了,因为创建数据库和表的命令我们已经知道,它不并 难。 初始化表单的运行效果如图 10-20 所示:

图 10-20

初始化表单运行效果

制作要点
1、 程序调用 2、 创建有关联的表和数据库的命令 3、 计时器的应用

步骤详解
1、创建初始化表单(chsh.scx) ,在命令窗口中输入命令:CREATE FORM chsh。 2、如图 10-21 所示,在表单上 添加对象控件,包括一个显示文字 的标签、一个计时器和一个包含 24 个标签(每一个充当一个进度块) 的容器。把 24 个标签在容器里按顺 序均匀的排列在一起。他们的属性 设置见表 10-9。 10-21“chsh”表单 表 10-9“ chsh”表单属性设置 对象 Form1 属性 AutoCenter BorderStyle Caption Icon 属性值 说明

.T.-真 2-固定对话框 初始化 monitor.ico(自己选 择)

MaxButton Name ShowTips ShowWindow Heigh Width Picture Label1 Caption AutoSize BackStyle FontName FontSize Timer1 Container1 Interval BackColor SpecialEffect Heigh Width Label1~label24 BackColor Caption Heigh Width Visible

.F.-假 Form1 .T.-真 1-在顶层表单中 93 310 1.jpg
正在进行初始化?? .T.-真 0-透明 宋体 9 100 255,255,255 1-凹下

自选一张图片作为背景

28 240 80,74,181 (无) 20 10 .F.-假

标签隐藏

4、 为了完成初始化功能,我们编写一个初始化程序(init.prg) ;新建程序,输入以下 程序代码: close all set safety off if !directory(sys(5)+curdir()+"") md sys(5)+curdir()+"" endif cd sys(5)+curdir()+"" create database sys(5)+curdir()+"读者管理" create table 读者信息(读者编号 c(10) primary key,读者姓名 c(10),证件号 c(20),性 别 c(2),单位部门 c(20),住址 c(40),职业 c(20),联系电话 c(12),备注 c(40),未还书目 c(2)) create table 图书资料(图书编号 c(10) primary key,图书类别 c(10),图书名称 c(50), 作者 c(20),出版社 c(30),出版日期 d,入馆日期 d,购买价格 y(8),借阅次数 n(4),备注 c(50)) create table 借书登记(读者编号 c(10),图书编号 c(10),读者姓名 c(10),读者证件号 c(20),借阅日期 d,归还日期 d,借书标志 c(4), foreign key 读者编号 tag 读者编号 references 读者信息,foreign key 图书编号 tag 图书编号 references 图书资料) close all cd .. 输完以后保存,保存文件名为:init.prg

代码添加与解释
双击表单添加各对象的事件代码: 表单 Form1 的 Load 事件代码: public k k=0 表单 Form1 的 Unload 事件代码: release k 计时器 Timer1 的 Timer 事件代码: if k<48 k=k+2 do case case k=2 thisform.label1.caption="正在初始化读者信息.." . thisform.container1.label1.visible=.t. case k=4 thisform.container1.label2.visible=.t. case k=6 thisform.container1.label3.visible=.t. case k=8 thisform.container1.label4.visible=.t. case k=10 thisform.container1.label5.visible=.t. thisform.label1.caption="正在初始化系统账号.." . case k=12 thisform.container1.label6.visible=.t. case k=14 thisform.container1.label7.visible=.t. case k=16 thisform.container1.label8.visible=.t. case k=18 thisform.container1.label9.visible=.t. case k=20 thisform.container1.label10.visible=.t. case k=22 thisform.container1.label11.visible=.t. case k=24 thisform.container1.label12.visible=.t. thisform.label1.caption="正在初始化图书资料.." . case k=26 thisform.container1.label13.visible=.t. case k=28 thisform.container1.label14.visible=.t. case k=30

thisform.container1.label15.visible=.t. case k=32 thisform.container1.label16.visible=.t. case k=34 thisform.container1.label17.visible=.t. case k=36 thisform.container1.label18.visible=.t. case k=38 thisform.container1.label19.visible=.t. case k=40 thisform.container1.label20.visible=.t. thisform.label1.caption="正在初始化借书登记.." . case k=42 thisform.container1.label21.visible=.t. case k=44 thisform.container1.label22.visible=.t. case k=46 thisform.container1.label23.visible=.t. case k=48 thisform.container1.label24.visible=.t. thisform.label1.caption="初始化完毕" endcase else messagebox("已完成初始化!",64+0,"初始化") do init.prg thisform.release endif 大家可以看到,其实运行时显示“正在初始化系统账号.. .”等等信息的时候没有真正 的初始化,运行表单显示信息的时候是起到“以假乱真”的效果,只有到了最后运行 init.prg 时才实现了真正的初始效果。

案例 13:制作数据备份表单 案例运行效果与操作
一般做的好一些的应用系统其系统维护功能中就有数据备份和数据恢复功能, 图书管理 系统也不例外, 我们给它设计了数据备份表单和数据恢复表单。 这个案例中首先设计数据备 份表单。数据备份表单的运行效果如图 10-22 所示:

图 10-22 数据备份表单的运行效果 运行时在“数据”项中选择要备份的数据(读者信息、图书资料、借书登记和全部) , 在“备份到”文本框中输入目标或者用文本框后的按钮浏览并选择目标地址,然后单击“确 定”按钮,就可以备份数据。

制作要点
1、getdir 函数 2、putfile 函数 3、juststem 函数 4、justpath 函数

步骤详解
1、新建一个表单,保存文件名为 shjbf。 2、给表单添加控件。如图 10-22 所示,添加一个形状,一个列表框,一个文本框,三 个按钮,两个标签、一个图象。各控件属性设置如下表 10-10: 表 10-10“shjbf”表单的属性设置 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow Heigh Width Picture 属性值 说明

.T.-真 2-固定对话框 初始化 monitor.ico(自己选择) .F.-假 Form1 .T.-真 1-在顶层表单中 183 370 1.jpg

自选一张图片作为背景

Label1 Label2 Label1 和 Label2

Caption Caption AutoSize BackStyle FontName FontSize



据 .T.-真 0-透明 宋体 9 0-透明 0-3 维 0-透明

备份到

Shape1 Imagel Combo1

BackStyle SpecialEffect BackStyle Picture RowSource RowSourceType BackColor SpecialEffect

wireless.ico 读者信息,图书资料,借书 登记,全部 1-值 228,228,228 1-平面 228,228,228 1-平面 确 定 取 消 (无)

自选

设置列表框为平面格式

Text1 Command1 Command2 Command3

BackColor SpecialEffect Caption Caption Caption Height Width Picture ToolTipText

25 24 xmag.ico 单击选择目标地址

自选

代码添加与解释
双击表单添加各对象的事件代码: 列表框 Combo1 的 Init 事件代码: This.Value="读者信息" 列表框 Combo1 的 IniterzctiveChange 事件代码: if this.displayvalue="全部" thisform.text1.value=sys(5)+curdir()+; "备份\数据"+allt(str(year(date())))+"-"+; allt(str(month(date())))+"-"+allt(str(day(date()))) else thisform.text1.value="" endif “确定”按钮的 Click 事件代码: Set safety off Set talk off If empty(thisform.combo1.value) Messagebox("请选择要备份的数据。",64+0,"数据备份")

Thisform.combo1.setfocus Else If empty(thisform.text1.value) Messagebox("请选择数据备份去向。",64+0,"数据备份") Thisform.command3.setfocus Else If thisform.combo1.value#"全部" _fpt=allt(juststem(thisform.text1.value))+".FPT" _cdx=allt(juststem(thisform.text1.value))+".CDX" If file(sys(5)+curdir()+""+_fpt) and file(sys(5)+curdir()+""+_cdx) Copy file sys(5)+curdir()+""+justfname; (allt(thisform.text1.value)) to allt(thisform.text1.value) Copy file sys(5)+; curdir()+""+_fpt to justpath(allt(thisform.text1.value))+"\"+_fpt Copy file sys(5)+curdir()+""+_cdx; to justpath(allt(thisform.text1.value))+"\"+_cdx Messagebox(juststem(allt(thisform.text1.value))+" 备 份 成 功 ! ",64+0,"数据备份") Else If file(sys(5)+curdir()+""+_fpt) Copy file sys(5)+curdir()+""+justfname; (allt(thisform.text1.value)) to allt(thisform.text1.value) Copy file sys(5)+curdir()+""+_fpt to justpath(allt(thisform.text1.value))+"\"+_fpt Messagebox(juststem(allt(thisform.text1.value))+"备份成功! ",64+0,"数据备份") Else If file(sys(5)+curdir()+""+_cdx) Copy file sys(5)+curdir()+""+justfname; (allt(thisform.text1.value)) to allt(thisform.text1.value) Copy file sys(5)+curdir()+""+;allt(juststem(thisform.text1.value))+; ".CDX" to justpath(thisform.text1.value)+"\"+allt(juststem(thisform.text1.value))+".CDX" Messagebox(juststem(allt(thisform.text1.value))+"备份成 功!",64+0,"数据备份") Else Copy file sys(5)+curdir()+""+; justfname(allt(thisform.text1.value)) to allt(thisform.text1.value) Messagebox(juststem(allt(thisform.text1.value))+"备份成 功!",64+0,"数据备份") Endif Endif Endif Else If DIRECTORY(allt(thisform.text1.value))=.t.

Sask=messagebox("所选的路径已经包含全部数"+chr(13)+"据备份, 是 否覆盖?",32+4,"数据备份") If Sask=6 Delete file allt(thisform.text1.value)+"\*.*" Rmdir allt(thisform.text1.value) Mkdir allt(thisform.text1.value) Copy file sys(5)+curdir()+""+"*.*" to allt(thisform.text1.value)+"\*.*" Messagebox("成功备份所有数据!",64+0,"数据备份") Endif Else Mkdir allt(thisform.text1.value) Copy file sys(5)+curdir()+""+"*.*" to allt(thisform.text1.value)+"\*.*" Messagebox("成功备份所有数据!",64+0,"数据备份") Endif Endif Endif Endif “取消”按钮的 Click 事件代码: release thisform 浏览按钮 Command3 的 Click 事件代码: If thisform.combo1.value="全部" Thisform.text1.value=getdir()+; "数据"+allt(str(year(date())))+"-"+allt(str(month(date())))+"-"+allt(str(day(date()))) Else If not empty(thisform.combo1.value) Thisform.text1.value=putfile("数据备份",allt(thisform.combo1.value),"dbf") Else Messagebox("请选择要备份的数据。",64+0,"数据备份") Thisform.combo1.setfocus Endif Endif 至此,数据备份表单制作完成了,运行检查有没有出错的地方,细心修改后保存并运行 看看效果。

案例 14:创建数据恢复表单 案例运行效果与操作
数据恢复表单和数据备份表单相呼应, 所以这两个表单的界面相象, 数据恢复表单的运 行效果如图 10-23 所示:

图 10-23 数据恢复表单运行效果 运行时在“数据”项中选择要恢复的数据(读者信息、图书资料、借书登记和全部) , 在 “来源” 文本框中输入目标或者用文本框后的按钮浏览并选择目标文件, 然后单击 “确定” 按钮,就可以恢复数据;单击“取消”释放表单。

制作要点
1、 Copy 语句的使用格式 2、 curdir()函数

步骤详解
1、新建一个表单,保存文件名为 shjhf。 2、给表单添加控件。如图 10-23 所示,添加一个形状,一个列表框,一个文本框,三 个按钮,两个标签、一个图象。由于数据恢复表单的界面和各控件属性出了两个标签外都是 完全一样的,所以各控件属性设置可以参照数据备份案例中的表 10-10,在这里就不在列表 了。两个标签的 Caption 属性分别为“数据”和“来源” 。接下来我们给这些对象添加代码。

代码添加与解释
双击表单添加各对象的事件代码: 列表框 Combo1 的 Init 事件代码: This.Value="读者信息" “确定”按钮的 Click 事件代码: Set safety off Set talk off If empty(thisform.combo1.value) Messagebox("请选择要恢复的数据。",64+0,"数据恢复") Thisform.combo1.setfocus Else

If empty(thisform.text1.value) Messagebox("请选择数据恢复来源。",64+0,"数据恢复") Thisform.command3.setfocus Else If thisform.combo1.value<>"全部" _fpt=allt(juststem(thisform.text1.value))+".FPT" _cdx=allt(juststem(thisform.text1.value))+".CDX" If juststem(allt(thisform.text1.value))<>allt(thisform.combo1.value) Messagebox("指定的文件不是所要恢复的数据!",48+0,"数据恢复") Else If file(justpath(thisform.text1.value)+"\"+_fpt); and file(justpath(thisform.text1.value)+"\"+_cdx) Copy file allt(thisform.text1.value); to sys(5)+curdir()+""+justfname(allt(thisform.text1.value)) Copy file justpath(allt(thisform.text1.value))+"\"+_fpt to sys(5)+curdir()+""+_fpt Copy file justpath(allt(thisform.text1.value))+"\"+_cdx to sys(5)+curdir()+""+_cdx Messagebox(juststem(allt(thisform.text1.value))+"恢复成功!",64+0,"数据恢复") Else If file(sys(5)+curdir()+""+_fpt) Copy file allt(thisform.text1.value); to sys(5)+curdir()+""+justfname(allt(thisform.text1.value)) Copy file justpath(allt(thisform.text1.value))+"\"+_fpt to sys(5)+curdir()+""+_fpt Messagebox(juststem(allt(thisform.text1.value))+"恢复成功!",64+0,"数据恢复") Else If file(sys(5)+curdir()+""+_cdx) Copy file allt(thisform.text1.value); to sys(5)+curdir()+""+justfname(allt(thisform.text1.value)) Copy file justpath(allt(thisform.text1.value))+"\"+_cdx to sys(5)+curdir()+""+_cdx Messagebox(juststem(allt(thisform.text1.value))+"恢复成功!",64+0,"数据恢复") Else Copy file allt(thisform.text1.value); to sys(5)+curdir()+""+justfname(allt(thisform.text1.value)) Messagebox(juststem(allt(thisform.text1.value))+"恢复成功!",64+0,"数据恢复") Endif Endif Endif Endif Else If allt(thisform.text1.value)=sys(5)+curdir()+"" Messagebox("无法用数据自身进行恢复!",16+0,"数据恢复") Else If atc("",allt(thisform.text1.value))<>0; and atc("-",allt(thisform.text1.value))<>0 Copy file allt(thisform.text1.value)+"*.*" to sys(5)+curdir()+"*.*"

Messagebox("成功恢复所有数据!",64+0,"数据恢复") Else Rask=messagebox(" 所 选 的 路 径 中 可 能 不 包 含 所 有 数 据 "+chr(13)+"仍然要用它进行数据恢复吗?",48+4,"数据恢复") If Rask=6 Copy file allt(thisform.text1.value)+"*.*" to sys(5)+curdir()+"*.*" Endif Endif Endif Endif Endif Endif “取消”按钮的 Click 事件代码: release thisform 浏览按钮 Command3 的 Click 事件代码: If thisform.combo1.value="全部" Thisform.text1.value=getdir() Else If not empty(thisform.combo1.value) Thisform.text1.value=getfile("dbf","数据恢复") Else Messagebox("请选择要恢复的数据。",64+0,"数据恢复") Thisform.combo1.setfocus Endif Endif

案例 15:创建数据清空表单 案例运行效果与操作
为了实现快速的清除数据表里面的全部数据, 我们特地设计了这样一个表单, 这个表单 也可以算作是数据维护的一部分。读者 通过本案例的制作来了解如何实现清除 数据表里的全部数据。数据清空表单的 运行效果如图 10-24 所示: 操作时,首先在三个复选框中选中 要清空的数据表,然后单击“确定”按 钮实现数据表中的数据清除, “取消”按 钮的功能是释放表单。

图 10-24 数据清空表单运行效果

制作要点
1、复选框控件的使用 2、物理删除

步骤详解
1、创建数据清空表单( shjqk.scx) 。在命令窗口中输入命令:CREATE FORM shjqk。 2、如图 10-24 所示添加控件,控件包括一个标签、三个复选框、一个图象控件、一个 形状和两个按钮,并且调整它们的位置和大小。 3、各个控件属性设置如表 10-11: 表 10-11“shjqk”表单的主要属性设置 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton Name ShowTips ShowWindow Heigh Width Picture Label1 Caption AutoSize BackStyle FontName FontSize Shape1 Imagel Check1 BackStyle SpecialEffect BackStyle Picture Caption AutoSize BackStyle Check2 Check3 Command1 Command2 Caption Caption Caption Caption 属性值 说明

.T.-真 2-固定对话框 数据清空 monitor.ico(自己选择) .F.-假 Form1 .T.-真 1-在顶层表单中 166 262 1.jpg
要清空的数据选项 .T.-真 0-透明 宋体 9 0-透明 0-3 维 0-透明 wireless.ico 读者信息 .T.-真 0-透明 借书登记 图书资料 确 定 取 消

自选一张图片作为背景

自选一个图标 Check2 和 Check3 准此 Check2 和 Check3 准此

代码添加与解释
双击表单上“确定”按钮添加 Click 事件代码: If thisform.check1.value=0 and thisform.check2.value=0 and thisform.check3.value=0 Messagebox("请选择要清空的数据项!",64+0,"清空数据") Else If messagebox("清空所选的数据吗?",32+4,"清空数据")=6 If thisform.check1.value=1 Use 读者信息 Delete all Pack use endif If thisform.check2.value=1 Use 借书登记 Delete all Pack use endif If thisform.check3.value=1 Use 图书资料 Delete all Pack use Endif Close all Messagebox("所选数据已经全部清空!",64+0,"清空数据") Endif Endif 双击表单上“取消”按钮添加 Click 事件代码: release thisform

案例 16:制作密码验证表单 案例运行效果与操作
为了有效管理数据库应用系统, 不让非管理者随意恶意或不经意的删改或添加数据, 我 们就必须设置管理的权限,设置权限的方法很多,而密码验证是权限管理的一个重要方面。 很多的软件都有密码验证登陆设置,比方大家比较熟悉的 QQ 聊天软件,启动就是一个密码 验证的对话框。我想,大家也可能设计过一些比较简单的密码验证表单,它们的安全性却很 底,那么用 VFP 可不可以以做出安全性比较强的密码验证表单呢?答案是可以的。我们通 过本案例的学习,掌握如何制作一个安全性比较高的密码验证表单。

密码验证表单的界面比较简洁, 主要是它的程序设计方法决定密码验证是否高级。 我们 要做的图书管理系统的密码验证表单,也就是系统登陆表单的运行效果如图 10-25 所示:

图 10-25 登陆表单运行效果 操作时,首先选择账号,输入密码,然后单击“确定”按钮进行验证,如果连续三次输 入密码错误,将关闭表单。

制作要点
1、循环语句的使用 2、substr()取子串函数的使用 3、asc()函数的使用 4、bitxor()函数的使用

步骤详解
1、创建登陆表单(denglu.scx) 。在命令窗口中输入命令:CREATE FORM denglu。打 开“数据环境设计器”窗口,向其中添加系统账号表(系统账号.DBF) 。 2、添加控件。参照图 10-25,添加一个形状控件,一个文本框,两个标签和一个列表 框,一个图象控件和两个按钮控件,添加好并且调整布局。 3、设置这些对象的属性,主要属性设置如表 10-12 所示: 表 10-12 “denglu”表单属性设置 对象 Form1 属性 AutoCenter BorderStyle Caption Icon MaxButton MinButton Name ShowTips ShowWindow Heigh 属性值 说明

.T.-真 2-固定对话框 登录 monitor.ico(自己选择) .F.-假 F.-假 Form1 .T.-真 1-在顶层表单中 183

Width Picture Label1 Label2 Label1 和 Label2 Caption Caption AutoSize BackStyle FontName FontSize Shape1 Imagel Combo1 BackStyle SpecialEffect BackStyle Picture RowSource RowSourceType BackColor SpecialEffect Text1 BackColor SpecialEffect PasswordChar Command1 Command2 Caption ToolTipText Caption ToolTipText

370 1.jpg
账 号 密 码 .T.-真 0-透明 宋体 9 0-透明 0-3 维 0-透明 wireless.ico 系统账号.账号 6-字段 228,228,228 1-平面 228,228,228 1-平面 * 确 定

自选一张图片作为背景

自选

设置列表框为平面格式

指定用“*”作为占位符

单击进行密码验证
取 消

单击关闭

4、为了传递密码表单的验证信息,我们给表单新增了一个属性 showform,它的作用就 是传递密码验证是否正确的信息,如果正确,返回值为.T.;否则返回值为.F.。增加的方法如 下:在“表单”菜单的下拉菜单中选择“新建属性”菜单项,在打开的“新建属性”对话框 的“名称”栏中输入“showform” ,你可以添加说明,也可以单击“添加”按钮直接添加属 性。这个时候你就可以在“属性”中见到 showform 属性了。

代码添加与解释
双击表单添加各对象的事件代码: 表单 Form1 的 Init 事件代码: public n n=0 表单 Form1 的 Unloadt 事件代码: Return this.showform 表单 Form1 的 Destroy 事件代码: release n 双击表单上“确定”按钮添加 Click 事件代码: tempstr='' For i=1 to len(trim(thisform.text1.value))

tempchr=bitxor(asc(subs(thisform.text1.value,i,1)),123) tempstr=tempstr+chr(tempchr) Endfor Locate for upper(系统账号.账号)=upper(allt(thisform.combo1.value)) If found() and allt(系统账号.密码)==tempstr Thisform.showform=.t. Release thisform Else If n<=1 Messagebox("用户名或密码输入有误,请重新输入!",48+0,"登录") Thisform.text1.setfocus N=n+1 Else Messagebox("不能提供正确密码,系统将关闭。",48+0,"登录") Release thisform Endif Endif 双击表单上“取消”按钮添加 Click 事件代码: release thisform 至此,登录对话框的设计就完成了。看看效果吧!

案例 17:制作密码修改表单 案例运行效果与操作
只有一个密码的系统是不安全的, 也不是人性化的设置, 不同的管理员要用不同的密码。 所以在密码验证的基础上还要设计密码修改表单。 这个案例就让我们了解密码修改表单的一 般制作方法。 这个案例中我们设计了两个表单, 分别完成密码的重新确认和密码修改; 两个表单的运 行效果如图 10-26 和图 10-27 所示:

图 10-26 密码重新验证表单

图 10-27 新密码输入表单运行效果 操作大家一看便知,所以这里就不在说了。

制作要点
1、 数组的应用 2、 公共变量的定义和使用

步骤详解
1、创建密码修改表单(xgmm.scx) 。在命令窗口中输入命令:CREATE FORM xgmm。 打开“数据环境设计器”窗口,向其中添加系统账号表(系统账号.DBF) 。 2、添加控件。参照图 10-26,添加一个形状控件,一个文本框,两个标签和一个列表 框,一个图象控件和两个按钮控件,添加好并且调整布局。 3、设置这些对象的属性,这些对象的设置基本上和上一个案例一样,所以由于篇幅, 就不在列表,属性设置可以参照表 10-12。 4、同样的方法创建新密码输入表单(mm.scx)(参照图 10-27) 。

代码添加与解释
双击 xgmm.scx 表单添加各对象的事件代码。 双击表单上“确定”按钮添加 Click 事件代码: public zh zh=thisform.combo1.value tempstr='' for i=1 to len(trim(thisform.text1.value)) tempchr=bitxor(asc(subs(thisform.text1.value,i,1)),123) tempstr=tempstr+chr(tempchr) endfor locate for upper(系统账号.密码)=tempstr if found() and allt(系统账号.密码)==tempstr

do form mm else messagebox("密码有误,请重新输入!",48+0,"修改密码") thisform.text1.setfocus endif 双击表单上“取消”按钮添加 Click 事件代码: release thisform 双击 mm.scx 表单添加各对象的事件代码。 双击表单上“确定”按钮添加 Click 事件代码: public pw pw=thisform.text1.value if thisform.text1.value==thisform.text2.value tempstr='' for i=1 to len(trim(pw)) tempchr=bitxor(asc(subs(pw,i,1)),123) tempstr=tempstr+chr(tempchr) endfor delete for 账号=zh pack dimension a(1,2) a[1,1]=zh a[1,2]=tempstr append from array a release thisform messagebox ("密码修改成功!",64+0,"修改密码") else messagebox ("密码未被确认,请输入相同密码!", 48+0,"修改密码") thisform.text2.setfocus endif 双击表单上“取消”按钮添加 Click 事件代码: release thisform 以上我们通过两个案例即三个表单的制作, 掌握了如何设计一个安全性较高的密码验证 表单, 同时也了解了如何设计密码修改表单。 下面一个案例将制作整个图书管理系统的封面 表单,封面表单中将会使用密码验证表单返回值来决定操作。

案例 18:创建系统封面表单 案例运行效果与操作
即便是一个小型的数据库应用软件,一个大方、美观、赏心悦目的封面表单也是很重要 的;就像我们在书店里买书一样,最先吸引我们眼球的是那些封面设计比较特别的的书籍, 所以封面的设计看似简单, 但是实现起来却发现是很难的, 另外它的设计还要借助于其它的 多媒体工具软件,比如:图象制作和处理软件等等。

在这个案例中设计的这个封面表单是一个全屏幕的表单,它执行的效果如图 10-28 所 示,封面表单执行同时调用登录表单,在表单上我们还设计上了版权信息,和带超连接的电 子邮件地址。当用户输入正确的登录信息,单击确定的时候或者单击取消按钮时,登陆表单 和封面表单都会释放,同时执行主表单 mainform。

图 10-28 封面表单执行效果

制作要点
1、 两个表单之间的属性参数值传递 2、 调用菜单程序的命令 3、 全屏幕表单的属性设置

步骤详解
1、首先找一张或者自己做一张图片作为系统的封面图片,图片大小最好是 1024*768, 因为这样图片可以覆盖整个显示屏。 2、 创建图书管理系统封面表单 (fengmian.scx) 在命令窗口中输入命令: 。 CREATE FORM fengmian。 3、添加控件。如图 10-28 所示,添加七个标签和一个计时器,调整位置。它们的属性 设置如下表 10-13: 表 10-13 “fengmian”表单的属性设置 对象 Form1 属性 BorderStyle 属性值 说明 表单无边框显示

0-无边框

Caption Icon Name ShowTips ShowWindow Picture WindowState TitleBar Label1 Caption AutoSize BackStyle FontName FontSize ForeColor Label2 Caption AutoSize BackStyle FontName FontSize ForeColor Label3 Caption AutoSize BackStyle FontName FontSize ForeColor Label4 Caption AutoSize BackStyle FontName FontSize ForeColor Label5 Caption AutoSize BackStyle FontName FontSize ForeColor Label6 Caption AutoSize BackStyle FontName

图书管理系统 monitor.ico( 自 己 选 择) Form1 .T.-真 2-作为顶层表单 jdsj232.jpg 2-最大化 0-关闭
图书管理系统 .T.-真 0-透明 黑体 72 131,200,55 图书管理系统 .T.-真 0-透明 黑体 72 0,255,0 版权所有(C)2005 .T.-真 0-透明 宋体 9 0,0,0 开发者:梦回唐朝 .T.-真 0-透明 宋体 9 0,0,0 电子邮箱: .T.-真 0-透明 宋体 9 0,0,0 liyanhao2564@163.com .T.-真 0-透明 黑体

封面图片 表单运行时为最大化 标题栏不可见 Label1 和 Label2 是 除了颜色不一样其它都 相同的两个标签,也是 图书管理系统的封面大 标题,在这里我把他们 稍稍错开放置,是为了 制作一种立体效果。

FontSize ForeColor Timer1 Interval 1

10 0,128,128

代码添加与解释
双击 fengmian.scx 表单添加各对象的事件代码。 表单 Form1 的 Init 事件代码: public a a=1 表单 Form1 的 Destroy 事件代码: release a 连接电子邮件的标签 Label6 的 click 事件代码如下: DECLARE INTEGER ShellExecute IN shell32.DLL ; INTEGER ,STRING,STRING ,STRING,STRING,INTEGER return shellexecute(0,"open","mailto:liyanhao2564@163.com?subject=梦回唐朝","","",1) 双击表单上计时器“Timer1”按钮添加 Timer 事件代码: If a>=1 Do form denglu to showform This.enabled=.f. If showform=.f. Clear events Release thisform Else do form mainform name li do xtmenu.mpr with li,.t.,.t. && xtmenu.mpr 是系统菜单程序,将在后边的 案例中制作生成 thisform.release Endif Else a=a+1 Endif

案例 19:图书管理系统菜单的制作 案例运行效果与操作
一个好的应用系统当然少不了菜单, 因为菜单可以按照一定的规律或者条件将不同功能 的表单进行归类,从而方便用户使用,也可以使主表单界面简洁明了。 在这个系统中,设计的菜单显示在顶层表单“mainform”上。菜单在顶层表单上运行的 效果如图 10-29 所示:

图 10-29 调运菜单程序的图书管理系统主表单 下边这个图(图 10-30)是“图书管理系统”菜单以及下拉菜单的示意图: 系统维护 初始化 (chsh.scx) 数据备份 (shjbf.scx) 数据恢复 (shjhf.scx) 清空数据 (Shjqk.scx) 密码设置 (xgmm.scx) 退出 (命令) 图 10-30 菜单示意图 通过这个示意图我们基本上在我们的脑海里有一个总体上的设计模式, 接下来我们将它 变为现实。 借还操作 借书 (js.scx) 还书 (hs.scx) 资料查询 (cx.scx) 数据管理 图书管理 Tsgl.scx 读者管理 (dzgl.scx) 报表打印 (dayin.scx) 退出系统 (命令)

制作要点
1、 菜单创建

2、 菜单命令设置 3、 生成菜单程序

步骤详解
1、新建一个菜单,保存名为 xtmenu;创建六个系统菜单项,菜单名称分别是“系统维 护”“借还操作”“资料查询”“数据管理”“报表打印”“退出系统” , , , , , 。结果除了“资料 查询”“报表打印”“退出系统”为“过程” , , ,其他都设置为“子菜单”如图 10-31:

图 10-31 “xtmenu”菜单项 2、在“系统维护”菜单项中设计六个子菜单,如图 10-32 所示。菜单名称分别为“初 始化”“数据备份”“数据恢复”“数据清空”“密码设置”“退出” , , , , , 。结果一项全部设置 如图。清空数据” “ 的过程为 “do form shjqk” “密码设置” , 菜单项的过程是:do form xgmm” “ 。

图 10-32“系统维护”中的子菜单 “初始化”菜单项的过程是: close all ask=messagebox("初始化将会清空当前所有数据,继续吗?",48+4,"初始化") if ask=6

do form chsh endif “数据备份”菜单项的过程是: close all do form shjbf “数据恢复”菜单项的过程是: close all do form shjhf “退出”菜单项的过程是: _screen.activeform.tag="0" ask=messagebox("确实要退出系统吗?",4+32+256,"图书管理系统") if ask=6 close all clear all release all clear events else _screen.activeform.tag="1" endif 在选项这一栏中可以为对应的菜单项设置快捷键,我在这里就不在细说了。 3、在“借还操作”菜单项中设计两个子菜单, “借书”和“还书”“结果”都是过程。 , “借书”子菜单的过程是:do form js; “还书”子菜单的过程是:do form hs。 4、 资料查询” “ 菜单项的过程为: form cx; 报表打印” do “ 菜单项的过程为: form dayin。 do 5、 “数据管理”菜单项中设计两个子菜单,分别是“图书管理”和“读者管理”“结果” , 都是过程。 “图书管理”的过程为:do form tsgl; “读者管理”的过程为:do form dzgl。 6、 “退出系统”菜单项的过程为: _screen.activeform.tag="0" ask=messagebox("确实要退出系统吗?",4+32+256,"图书管理系统") if ask=6 close all clear all release all clear events else _screen.activeform.tag="1" Endif 做完后将菜单保存,文件名为 xtmenu。最后单击“菜单”菜单中“生成”命令,会产 生菜单的程序文件 xtmenu.mpr。

案例 20:图书管理系统主程序的制作
主程序的任务是设置应用程序的起始点、 显示初始界面等, 简单的说是应用程序的入口, 负责初始化环境、显示初始的用户界面、控制事件循环以及恢复原始的开发环境。下面就设 计图书管理系统的主程序,同时在连编应用程序时将这个主程序设置为主文件。

制作要点
1、SET 命令的设置 2、read event 语句

步骤详解
1、在命令窗口中键入 MODIFY COMMAND main 命令。 2、在弹出的 main.PRG 窗口中键入以下代码: clear all _screen.visible=.f. close all clear all set escape off set talk off set exact on set safety off set deleted on set century on set date to YMD sele 1 use 读者信息 sele 2 use 图书资料 sele 3 use 借书登记 sele 4 use 系统账号 do form fengmian read events return

案例 21:创建项目组织系统结构
项目管理器是 VFP 提供的一种有效的管理工具,他提供了一个管理应用系统的集成环 境,是一个很好的维护工具,同时它也为数据库应用系统的开发提供了方便;最终我扪也用 它连编成一个完整的应用程序,编译生成一个扩展名为.app 的应用程序文件或.exe 的可执 行文件。所以,有人把项目管理器称为 VFP 的“控制中心” 。

制作要点
1、创建项目 2、设置主文件 3、连遍

步骤详解
1、创建一个名为“图书管理系统”的项目,在命令窗口中键入 Modify project 图书管 理系统,就会出现一个图书管理系统项目管理窗口;也可以利用菜单打开项目管理器。 2、把我们创建的一个数据库(包含三个数据库表) ,一个自由表,十五个表单,三个报 表,一个类,两个程序和一个菜单文件添加到项目中相应的位置上。 3、接着我们设置一个主文件作为整个应用程序的起始点。在项目管理器中选中主程序 文件 main.prg,从“项目”菜单或快捷菜单中选择“设置主文件”选项。 4、然后单击项目管理器上的“连编”按钮,在“连编选项”对话框中,选择“连编应 用程序”复选框,会生成一个.app 文件;若选择“连编可执行文件”复选框,会生成一个.exe 文件,我们选择“连编可执行文件”复选框;单击“确定”按钮。如果连编时没有错误,你 会发现在指定的文件夹中已经有一个可执行程序文件生成。 关闭“项目管理器” ,双击应用程序.exe 文件图标看看效果如何。

案例 22:应用系统的发布
在完成应用程序的开发和测试工作之后, 可用“安装向导”为应用程序创建安装程序和发 布磁盘。如果要以多种磁盘格式发布应用程序,“安装向导”会按指定的格式来创建安装程序 和磁盘。“安装向导”可为应用程序创建一个安装例程,其中包含一个 Setup.exe 文件,一些 信息文件,以及压缩的或非压缩的应用程序文件(储存在 .cab 文件中) 。最后得到是一组 可放在磁盘、网络上或者 web 站点上的文件。接下来,用户可象安装其他 Windows 应用 程序一样安装应用程序。安装时,用户将看到使用“安装向导”时指定的选项。

制作要点
1、安装向导的使用

步骤详解
1. 从“工具”菜单中选择“向导”命令。 2. 从“向导”子菜单中选择“安装”命令,将会弹出“安装向导”对话框。安装向导一共 有七个步骤。接下来我们结合文字图片简单说明这七个步骤。

步骤 1 - 定位文件(如图 10-33) 。为发布树指定的目录“?\图书管理系统\” ,必须包 含要在用户环境中建立的所有文件和子目录。然后单击“下一步”按钮。

图 10-33

定位文件对话框

步骤 2 - 指定组件(如图 10-34) 。选择应用程序使用的系统特性和用户安装应用程序 时使用的操作系统; 在这个案例中我们只选定 “Visual FoxPro 运行时刻组件” “Microsoft 和 Graph 8.0 运行时刻”两个复选框。

图 10-34

指定组件对话框

步骤 3 - 磁盘映象(如图 10-35) 。向导建立一个发布子目录,其中包含每种指定类型 磁盘的映象。 如果选择“1.44 MB 3.5 英寸”, 向导将在发布目录中创建 3.5 英寸软盘的映象。 如果选择“网络安装(压缩)”,向导将创建密集压缩的安装映象,用于从 Web 站点快速下 载文件。如果选择“网络安装(未压缩)”,向导将建立唯一的子目录来包含所有的文件。在 这个案例中我们为了学习、了解,三个都选中,从而建立三种安装映象。

如图 10-35 磁盘映象对话框 步骤 4 - 安装选项(如图 10-36) 。“安装向导”建立安装对话框时,把“安装对话框标题” 框中指定的标题作为标题;在这个案例中“安装对话框标题”设置为“图书管理系统” 。同时 还在“版权信息”对话框中放置版权信息, 可以通过安装应用程序的控制菜单中的“关于”命令 访问“版权信息”对话框;在这个案例中“版权信息”设置为“(C)2005 梦回唐朝” 。

图 10-36 安装选项对话框

步骤 5 - 默认目标目录(如图 10-37) 。安装程序将把应用程序放置在“默认目标目录” 对话框指定的目录中。如果在“程序组”框中指定了一个名称,当用户安装应用程序时,安装 程序会为应用程序创建一个程序组,并且使这个应用程序出现在用户的“开始”菜单上。选择 在“用户可以修改”下面的选项,用户在安装过程可以更改默认目录的名称和程序组。

图 10-37 默认目标目录对话框 步骤 6 - 改变文件设置(如图 10-38) 。向导在表格中列出文件。可以通过单击要改变 的项来改变对文件的设置。可以直接单击“下一步” 打开最后一步“完成” , 。

图 10-38 改变文件设置对话框

步骤 7 - 完成(如图 10-39) 。向导记录下可以在下次从发布树中创建发布磁盘时使用 的配置值,然后开始创建应用程序磁盘映象。这一步可直接选定“完成”按钮。选定“完成” 按钮后,安装向导将生成磁盘映象,然后显示“安装向导磁盘统计信息”窗口。 经过上述的操作,在 D:\LIYANHAO 目录中产生了磁盘映象 DISK144、NETSERUP 和 WEBSETUP 三种安装程序。

图 10-39

完成

4、 在“安装向导”创建指定的磁盘映象之后,可把这些映象复制到母盘上,然后再次从 母盘上复制,并与软件包的其他附件一起包装。在创建一套母盘之后,就可删除磁盘映象目 录。 至此,一个完整的数据库应用系统就制作完成了,当然,根据软件工程的理论,大量的 测试工作和维护工作还在使用的过程中。


更多相关文档:

第10章 图书管理系统数据库设计实例

第10章 图书管理系统数据库设计实例_计算机软件及应用_IT/计算机_专业资料。第 10 章 图书管理系统数据库设计实例 通过前面章节对数据库基础知识的学习,本章将通过...

第10章 图书管理系统

第10 章本章内容 图书管理系统 ■ 数据库应用系统开发的基本思想和步骤 ■ 创建关于图书管理系统的表和数据库 ■ 创建借书表单 ■ 创建还书表单 ■ 创建资料查询...

第十组图书管理系统

会计实习日记10篇 会计专... 3页 1下载券 计算机网络第一章 暂无评价 5页 ...陈冠雄 指导教师 谢锐 数据库应用课程设计 图书管理系统 商学院 电子商务 10 级...

第10章 网上图书功能

第10章 网上图书功能_互联网_IT/计算机_专业资料。图书管理信息系统 ? 第十章 Web 检索系统 读者可以通过网上预借书,查询图书和自己借书情况。用户首先在浏览 器...

第10章 网上图书功能

第10章 网上图书功能_互联网_IT/计算机_专业资料。图书管理信息系统 ? 第十章 Web 检索系统 读者可以通过网上预借书,查询图书和自己借书情况。用户首先在浏览 器...

完整-图书管理系统

完整-图书管理系统_工学_高等教育_教育专区。文档...1.4 参考资料: 《实用软件工程》 (第二版) 《...数据增长率 10% 极限数据量 4M 备注 关联其他数据...

图书管理系统

图书管理系统 C#课程设计... 31页 4下载券 第10章-工程项目管理 36页 1下载...题目: 图书管理信息系统 系专姓学 别: 业: 名: 号: 计算机科学与工程系 ...

图书借阅管理系统实验报告

32 第一章:系统分析 1.1 需求分析 绝大多数管理人员已经认识到采用图书借阅管理系统的必要性, 纷纷开发或 选购适合本企业特点的图书借阅管理系统图书借阅管理...

图书管理系统

图书管理系统_计算机软件及应用_IT/计算机_专业资料。软件课设——是图书管理系统 《软件工程》课程设 计图书馆管理系统 学专 院:信息技术工程学院 业: 计算机...

图书管理系统

- 31 - IV 第一章 绪论 1.1 主要研究内容 1.1.1 系统开发的基本流程通过 SQL Server 2005 和 MyEclipse10.6 开发图书管理系统,并对原始数据进 行处理...
更多相关标签:
图书管理系统 | 图书馆管理系统 | 图书管理系统需求分析 | 图书管理系统源代码 | c 图书管理系统 | java图书管理系统 | rfid图书馆管理系统 | 图书管理系统毕业论文 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com