1、VFP应用程序设计实例-学生学籍管理系统(1)图1MIS是英文Management Information System的英文缩写,意思是信息管理系统,该系统可用于中小型企事业单位业务处理和信息交流,从而大大提高了企业运作的效率。微软公司的Visual FoxPro可视化面向对象的编程软件是一个设计MIS系统即简单又快捷的好软件.下面,就以VFP 6。0为开发环境,讲述设计学生学籍管理系统的详细设计过程,也为在看过了前面非表单设计的学生学籍管理系统的朋友们继续了解并学习采用表单(Form)的方式设计MIS系统的方法。 一、设计思路:学生学籍管理系统的运行以封面表单开始,如图1所示,要求用户输入
2、登录密码,并设置三次检查功能,若三次输入的密码均有错,则自动退出系统;否则出现系统菜单,接收用户的操作,操作完毕后用户可以从系统菜单中退出系统。 二、系统功能:系统的功能主要分成十个功能模块,它们是:录入数据、修改数据、删除数据、查询数据、统计数据、显示数据、打印数据、导出数据、导入数据和清空数据.录入数据可以实现学生信息的录入;修改数据可以实现学生信息的修改;删除数据可以实现学生数据的删除;查询数据可以实现学生信息的查询;统计数据可以实现学生人数、党员人数、学生总平均成绩、高数平均成绩、英语平均成绩和VFP平均成绩的统计;显示数据可以实现以字段分布和二维表两种方式显示学生信息;打印数据可以实
3、现用报表的形式打印学生的信息;导出数据可以实现学生数据的备份,防止数据丢失;导入数据可以实现学生数据的还原,保证数据的正确性;清空数据可以实现学生数据的清空操作。 三、菜单结构框架图 四、数据库结构:(可定义表名为xj。dbf)字段名 类型 宽度 小数位数 学号 字符型 2姓名 字符型 6性别 字符型 2出生年月字符型10邮编字符型6高数数值型51英语数值型51VFP数值型51是否党员字符型2电话字符型8通信地址字符型30备注备注型4 五、具体设计:(给出源代码,表单属性可参照图示在VFP属性框中设置,所有程序文件和表单文件均通过VFP项目管理器建立)1、学生学籍管理系统主程序源代码(可定义程
4、序名为main。prg)_SCREEN.WINDOWSTATE=2 &设置窗口规格为第2种系统窗口_SCREEN.CAPTION=”学生学籍管理系统 设置窗口标题为“学生学籍管理系统”_SCREEN。CLOSABLE=.T。 去掉关闭按钮_SCREEN。CONTROLBOX=。F. &去掉控制按钮_SCREEN。MAXBUTTON=。F。 去掉最大化按钮_SCREEN.MINBUTTON=.F. &去掉最小化按钮_SCREEN。BACKCOLOR=RGB(50,100,128) &设置窗口的背景色CLOSE ALLCLEAR ALLCLEARSET SYSMENU OFFSET SYSMENU
5、 TOSET TALK OFFSET SAFETY OFFSET STATUS BAR OFF &关闭Visual Foxpro的状态栏DO FORM A:封面.SCX &调用系统登录“封面表单READ EVENT &响应用户输入DO A:菜单.MPX &运行系统菜单READ EVENTSET SYSMENU TO DEFAULT &恢复Visual Foxpro的系统菜单的默认值SET SYSMENU ON 显示Visual Foxpro的系统菜单SET STATUS BAR ON &显示Visual Foxpro的状态栏CLOSE ALL 关闭所有文件CLEAR ALLRETURN &返回
6、2、封面表单源代码(A:封面。sct)PROCEDURE Click 确定按 钮的单击事件过程SET EXACT ON 设置精确比较命令IF THISFORM。text1.VALUE=”8888” &如果文本框的值是8888 THISFORM.RELEASE 那么释放封面表单 DO A:菜单。MPX &运行菜单程序ELSE &否则 THISFORM.NO=THISFORM.NO+1 &将自定义属性NO的值由0加1 IF THISFORM.NO=3 如果自定义属性NO的值为3 =MESSAGEBOX(”密码三次输错,您不能使用本系统!”,0+16+0,学生学籍管理系统”) 那么弹出内容为“密码三
7、次输错,您不能使用本系统!的对话框 QUIT &结束程序的运行 ELSE &否则 =MESSAGEBOX(”密码错误!”,48+0+0,警告) &弹出内容为“密码错误!的对话框 THISFORM。text1。VALUE=” &设置文本框的内容为空 THISFORM。text1.SETFOCUS &并将光标定位到文本框中 THISFORM.REFRESH 刷新封面表单 ENDIFENDIFSET EXACT OFF &设置关闭精确比较命令ENDPROCPROCEDURE Click &取消按钮的单击事件过程THISFORM。RELEASE &释放封面表单CLOSE ALL 关闭所有文件CLEAR
8、 EVENTquitVFP应用程序设计实例-学生学籍管理系统(2)图23、录入数据表单源代码(A:录入。sct,如图2所示)PROCEDURE Init &录入数据表单的初始化事件过程SET TALK OFFTHISFORM.commandgroup1。command4.ENABLED=.f. &设置第四个按钮为不可用状态THISFORMmand5.ENABLED=.f。 设置第五个按钮为不可用状态THISFORM.txt学号。ENABLED=。f。 &设置学号文本框为不可用状态THISFORM.txt姓名。ENABLED=。f. &设置姓名文本框为不可用状态THISFORM.combo1.E
9、NABLED=。f. &设置组合框1为不可用状态THISFORM。combo2。ENABLED=.f. &设置组合框2为不可用状态THISFORM。combo3。ENABLED=。f。 &设置组合框3为不可用状态THISFORM.combo4.ENABLED=。f。 &设置组合框4为不可用状态THISFORM。txt邮编.ENABLED=。f。 &设置邮编文本框为不可用状态THISFORM.txt高数。ENABLED=。f。 设置高数文本框为不可用状态THISFORM。txt英语。ENABLED=。f. &设置英语文本框为不可用状态THISFORM.txtVfp.ENABLED=。f. &设置
10、VFP文本框为不可用状态THISFORM。combo5。ENABLED=.f。 &设置组合框5为不可用状态THISFORM.txt电话。ENABLED=。f. 设置电话文本框为不可用状态THISFORM.txt通信地址。ENABLED=。f。 &设置通信地址文本框为不可用状态THISFORM。edt备注。ENABLED=。f。 设置备注编辑框为不可用状态ENDPROCPROCEDURE Load 录入数据表单的加载事件过程CLOSE DATA &关闭所有数据库USE A:XJ存 打开A盘中的XJ.DBF表文件SET MULTILOCKS ON 设置锁定一组记录=CURSORSETPROP(bu
11、ffering,5,XJ) &打开开放式表缓冲ENDPROCPROCEDURE InteractiveChange &录入数据表单的交互改变事件过程REPL 出生年月 WITH THISFORM。combo2。displayvalue+”。+THISFORM.combo3。displayvalue+”。”+THISFORM.combo4。displayvalue &用组合框的值替换出生年月字段THISFORM。REFRESH &刷新录入数据表单ENDPROCPROCEDURE Command1.Click &单击命令按钮1的事件过程APPEND BLANK &添加一空白记录THISFORM.R
12、EFRESH 刷新录入数据表单THISFORM。mand1。ENABLED=.f. 设置命令按钮1为不可用状态THISFORMmand2。ENABLED=。f。 &设置命令按钮2为不可用状态THISFORMmand3。ENABLED=。f。 设置命令按钮3为不可用状态THISFORM。mand4。ENABLED=。t。 设置命令按钮4为可用状态THISFORM.commandgroup1。command5。ENABLED=.t。 设置命令按钮5为可用状态THISFORM.commandgroup1。command6.ENABLED=。f。 &设置命令按钮6为不可用状态THISFORM。txt学
13、号.ENABLED=.t.THISFORM。txt姓名。ENABLED=.t。THISFORM。combo1.ENABLED=。t。THISFORM。combo2。ENABLED=.t.THISFORM.combo3。ENABLED=.t.THISFORM。combo4.ENABLED=。t。THISFORM。txt邮编。ENABLED=.t。THISFORM.txt高数。ENABLED=.t。THISFORM。txt英语.ENABLED=。t。THISFORM.txtVfp.ENABLED=.t.THISFORM。combo5。ENABLED=.t。THISFORM。txt电话.ENABLE
14、D=。t。THISFORM。txt通信地址。ENABLED=。t。THISFORM。edt备注.ENABLED=。t.THISFORM.txt学号.SETFOCUSENDPROCPROCEDURE Command2。Click 单击命令按钮2的事件过程SET DELETE ON &设置打开删除命令DELETE &删除当前记录YN=MESSAGEBOX(确实要删除这条记录?,4+32+256,删除确认) &弹出内容为“确实要删除这条记录?”的对话框DO CASE 运行条件判断语句CASE YN=6 &当单击“是”按钮时=TABLEUPDATE(。T.) &执行更新表函数,删除当前记录CASE Y
15、N=7 &当单击“否按钮时RECALL &恢复已作了删除标记的当前记录ENDCASETHISFORM.REFRESHENDPROCPROCEDURE Command3.Click &单击命令按钮3的事件过程THISFORM.commandgroup1。command1.ENABLED=.f.THISFORM。mand2.ENABLED=。f.THISFORM。commandgroup1。command3。ENABLED=。f.THISFORM。commandgroup1。command4。ENABLED=。t。THISFORM.commandgroup1。command5。ENABLED=。t
16、.THISFORM.commandgroup1。command6。ENABLED=。f。ENDPROCPROCEDURE Command4.Click &单击命令按钮4的事件过程=TABLEUPDATE(。T。)THISFORM。commandgroup1。command1。ENABLED=.t。THISFORM。commandgroup1。command2。ENABLED=。t.THISFORM.commandgroup1。command3。ENABLED=。t。THISFORM。mand4。ENABLED=。f.THISFORM。mand5.ENABLED=。f。THISFORM。comm
17、andgroup1。command6。ENABLED=。t。ENDPROCPROCEDURE Command5。Click &单击命令按钮5的事件过程=TABLEREVERT(。T。)THISFORM。commandgroup1。command1。ENABLED=。t.THISFORM.commandgroup1。command2。ENABLED=。t.THISFORM。mand3。ENABLED=。t。THISFORM。commandgroup1。command4.ENABLED=.f。THISFORM。mand5.ENABLED=.f。THISFORMmand6.ENABLED=。t。EN
18、DPROCPROCEDURE Command6。Click 单击命令按钮6的事件过程SELE 1 &选择1号工作区USE A:XJ EXCLUSIVE 打开A盘中的XJ。DBF数据表PACK &彻底删除已作了删除标记的记录THISFORM.RELEASE 释放录入数据表单ENDPROCPROCEDURE InteractiveChangeREPL 是否党员 WITH THISFORM.combo5。DISPLAYVALUE &用组合框的值替换是否党员字段THISFORM。REFRESHENDPROC4、修改数据表单源代码(A:修改.sct)图3PROCEDURE Command1。ClickI
19、F NOT BOF() &如果记录指针没有到记录的开头SKIP 1 &向上跳转一个记录THISFORM.REFRESHTHISFORM。commandgroup1。command2.ENABLED=.t.ELSEWAIT WINDOW 已经是第一条记录了! &系统给出内容为“已经是第一条记录了!”提示窗口ENDIFENDPROCPROCEDURE Command2.ClickIF NOT EOF() 如果记录指针没有到记录的结尾SKIP &向下跳转一个记录THISFORM。REFRESHTHISFORM。mand1。ENABLED=。t。ELSEWAIT WINDOW 已经是最后一条记录了!E
20、NDIFENDPROCPROCEDURE Command3。ClickGO TOP 将记录指针移到记录的开头THISFORM.REFRESHTHISFORM.commandgroup1。command1。ENABLED=.f.THISFORM。commandgroup1。command2.ENABLED=.t.ENDPROCPROCEDURE Command4。ClickGO BOTTOM &将记录指针移到记录的结尾THISFORM.REFRESHTHISFORM。mand1。ENABLED=。t.THISFORM。commandgroup1。command2.ENABLED=。f。ENDPR
21、OCPROCEDURE Command5。Click=TABLEUPDATE(。T.)THISFORM。commandgroup1。command1.ENABLED=.t。THISFORMmand2。ENABLED=。t。THISFORMmand3。ENABLED=.t。THISFORMmand4。ENABLED=。t。THISFORM。mand5.ENABLED=。f。THISFORM。commandgroup1。command6。ENABLED=。f.THISFORM.commandgroup1。command7。ENABLED=.t。ENDPROCPROCEDURE Command6.C
22、lick=TABLEREVERT(.T。) &启用表缓冲,放弃表中对所有记录所做的修改函数THISFORM。commandgroup1。command1。ENABLED=。t。THISFORM。commandgroup1。command2.ENABLED=.t。THISFORM。mand3.ENABLED=.t。THISFORM。mand4。ENABLED=。t。THISFORM。commandgroup1。command5。ENABLED=.f.THISFORM。commandgroup1。command6。ENABLED=。f。THISFORM。commandgroup1。command7
23、。ENABLED=。t。ENDPROCPROCEDURE Command7.ClickUSE A:XJ EXCLUSIVEPACKTHISFORM。RELEASEENDPROCPROCEDURE ClickIF EMPTY(THISFORM。combo1。VALUE) &如果组合框1的值为空=MESSAGEBOX(”请选择学号!”,48+0+0,”学生学籍管理系统”) &系统给出内容为“请选择学号!”的对话框ENDIFAA=RECNO() &用显示记录号的函数将记录号赋给变量AAGO AA &将记录指针移到当前记录号THISFORM.txt学号.REFRESH 刷新学号文本框的内容THISFO
24、RM.txt姓名.REFRESH &刷新姓名文本框的内容THISFORM。txt性别。REFRESH &刷新性别文本框的内容THISFORM.txt出生年月.REFRESH 刷新出生年月文本框的内容THISFORM。txt邮编.REFRESH &刷新邮编文本框的内容THISFORM。txt高数。REFRESH 刷新高数文本框的内容THISFORM。txt英语。REFRESH &刷新英语文本框的内容THISFORM。txtVfp。REFRESH 刷新VFP文本框的内容THISFORM。txt是否党员.REFRESH &刷新是否党员文本框的内容THISFORM。txt电话.REFRESH &刷新电
25、话文本框的内容THISFORM.txt通信地址。REFRESH &刷新通信地址文本框的内容THISFORM.edt备注.REFRESH &刷新备注编辑框的内容THISFORM。commandgroup1。command5。ENABLED=。t.THISFORMmand6.ENABLED=.t。VFP应用程序设计实例学生学籍管理系统(3)电脑笔记 20071029 16:56:30 阅读3134 评论2 字号:大中小订阅5、查询数据表单源代码(A:查询。sct)图4PROCEDURE ClickIF EMPTY(THISFORM。combo1。VALUE)=MESSAGEBOX(请选择学号!”,
26、48+0+0,”学生学籍管理系统”)ENDIFAA=RECNO()GO AATHISFORM.txt学号。REFRESHTHISFORM.txt姓名。REFRESHTHISFORM。txt性别。REFRESHTHISFORM。txt出生年月。REFRESHTHISFORM。txt邮编。REFRESHTHISFORM.txt高数。REFRESHTHISFORM.txt英语。REFRESHTHISFORM.txtVfp。REFRESHTHISFORM.txt是否党员.REFRESHTHISFORM。txt电话。REFRESHTHISFORM.txt通信地址.REFRESHTHISFORM。edt备
27、注.REFRESHENDPROC6、统计数据表单源代码(A:统计。sct)图5PROCEDURE Click 单击“统计记录总数”按钮时的事件过程COUNT TO AA FOR 是否党员=”是” &对党员计数,并将计数结果赋给变量AATHISFORM。text5.value=AA &将变量AA的值赋给文本框5THISFORM。text5。REFRESHENDPROCPROCEDURE Click 单击“统计英语平均成绩按钮时的事件过程AVERAGE 英语 TO AA 对所有记录的英语成绩求平均,并将平均值赋给变量AATHISFORM。text3.value=AA &将变量AA的值赋给文本框3T
28、HISFORM。text3.REFRESHENDPROCPROCEDURE Click 单击“统计VFP平均成绩按钮时的事件过程AVERAGE vfp TO AA 对所有记录的VFP成绩求平均,并将平均值赋给变量AATHISFORM.text4。value=AA &将变量AA的值赋给文本框4THISFORM。text4。REFRESHENDPROCPROCEDURE Click &单击“统计总平均成绩”按钮时的事件过程AVERAGE 高数 TO AA 对所有记录的高数成绩求平均,并将平均值赋给变量AAAVERAGE 英语 TO BB 对所有记录的英语成绩求平均,并将平均值赋给变量BBAVERA
29、GE vfp TO CC &对所有记录的VFP成绩求平均,并将平均值赋给变量CCSTORE (AA+BB+CC)/3 TO DD &将三门成绩的平均成绩和除3的总平均成绩赋给DDTHISFORM.text6。value=DD &将变量DD的值赋给文本框6THISFORM。text6。REFRESHENDPROC7、显示数据表单源代码(A:显示。sct)图6PROCEDURE Command1。Click &单击“上条”按钮的事件过程IF NOT BOF()SKIP -1THISFORM。REFRESHTHISFORMmand2.ENABLED=。t。ELSEWAIT WINDOW 已经是第一条
30、记录了!ENDIFENDPROCPROCEDURE Command2.Click 单击“下条按钮的事件过程IF NOT EOF()SKIPTHISFORM。REFRESHTHISFORM。commandgroup1。command1.ENABLED=.t.ELSEWAIT WINDOW 已经是最后一条记录了!ENDIFENDPROCPROCEDURE Command3。Click &单击“首条”按钮的事件过程GO TOPTHISFORM。REFRESHTHISFORM。commandgroup1。command1。ENABLED=。f。THISFORM。commandgroup1。comman
31、d2。ENABLED=。t。ENDPROCPROCEDURE Command4.Click 单击“末条”按钮的事件过程GO BOTTOMTHISFORM。REFRESHTHISFORM。commandgroup1。command1。ENABLED=.t.THISFORM。commandgroup1。command2.ENABLED=。f.ENDPROCPROCEDURE Command5。Click 单击“返回”按钮的事件过程THISFORM.RELEASEENDPROC8、删除数据表单源代码(A:删除.sct)图7PROCEDURE Click 单击“显示”按钮的事件过程IF EMPTY(T
32、HISFORM.combo1.VALUE)=MESSAGEBOX(”请选择学号!”,48+0+0,”学生学籍管理系统”)THISFORM.command2。ENABLED=。f。ELSETHISFORM.command2。ENABLED=。t.ENDIFAA=RECNO()GO AATHISFORM.txt学号.REFRESHTHISFORM。txt姓名。REFRESHTHISFORM。txt性别.REFRESHTHISFORM。txt出生年月。REFRESHTHISFORM。txt邮编.REFRESHTHISFORM.txt高数。REFRESHTHISFORM。txt英语。REFRESHTH
33、ISFORM。txtVfp。REFRESHTHISFORM.txt是否党员.REFRESHTHISFORM.txt电话。REFRESHTHISFORM.txt通信地址。REFRESHTHISFORM。edt备注。REFRESHENDPROCPROCEDURE Click &单击“删除按钮的事件过程SET DELETE ONDELETEYN=MESSAGEBOX(确实要删除这条记录?,4+32+256,删除确认)DO CASECASE YN=6=TABLEUPDATE(.T.)=MESSAGEBOX(”记录已成功删除!”,0+64+0,学生学籍管理系统)THISFORM。command2。ENA
34、BLED=.f。THISFORM。combo1.DISPLAYVALUE=请选择GO TOPCASE YN=7RECALLENDCASETHISFORM.REFRESHENDPROCPROCEDURE Init &删除数据表单的初始化过程SET TALK OFFTHISFORM.command2。ENABLED=。f。ENDPROCPROCEDURE ClickUSE A:XJ EXCLUSIVEPACKTHISFORM。RELEASEVFP应用程序设计实例-学生学籍管理系统(4)电脑笔记 2007-1029 16:58:43 阅读3983 评论5 字号:大中小订阅9、导出数据表单源代码(A:
35、导出。sct)图8PROCEDURE Click &单击“确定按钮的事件过程SET SAFETY OFF &覆盖文件时不提示确认USE A:XJGO TOPIF EMPTY(THISFORM.combo1.VALUE)=MESSAGEBOX(”请选择盘符!”,48+0+0,学生学籍管理系统”)ELSE IF EMPTY(THISFORM。text1.VALUE) =MESSAGEBOX(”请输入文件名!”,48+0+0,”学生学籍管理系统”) ELSE IF RECC()0 &如果表记录大于0 DRIVER=THISFORM。COMBO1。DISPLAYVALUE 将组合框1的值赋给变量DRI
36、VER FILENAME=ALLTRIM(THISFORM.TEXT1。TEXT) &将去掉空格的文件名赋给变量FILENAME COPY TO &DRIVERFILENAME &将系统表文件复制到选定的盘符和文件名中 =MESSAGEBOX(”本系统所有数据已转出完毕!,48,信息提示”) USE THISFORM.RELEASE ELSE =MESSAGEBOX(”没有任何数据,不能转出”,48,信息提示) USE THISFORM.RELEASE ENDIF ENDIFENDIFENDPROCPROCEDURE Click &单击“取消”按钮的事件过程RELEASE THISFORMEN
37、DPROC10、导入数据表单源代码(A:导入.sct)图9PROCEDURE Click &单击“确定”按钮的事件过程SET SAFETY OFFIF EMPTY(THISFORM。combo1.VALUE)=MESSAGEBOX(请选择要导入的数据表所在的盘符!”,48+0+0,学生学籍管理系统)THISFORM。text1.SETFOCUSELSE IF EMPTY(THISFORM。text1.VALUE) =MESSAGEBOX(请输入要导入的数据表名!,48+0+0,”学生学籍管理系统”) ELSE DRIVER=THISFORM。combo1.VALUE FILENAME=ALLT
38、RIM(THISFORM。TEXT1。VALUE) USE A:XJ ? &打印一空行 ON ERROR ? MESSAGE() &发生找不到文件的错误时,打印错误信息 APPEND FROM &DRIVERFILENAME &将选定的文件追加到系统表文件中 =MESSAGEBOX(数据表已成功导入原表!,0+64+0,学生学籍管理系统) USE THISFORM。RELEASE ENDIFENDIFENDPROC11、打印数据表单源代码(A:打印.sct)图10PROCEDURE Command1。Click?CHR(7)REPORT FORM A:学生学籍管理表。frx NOEJECT N
39、OCONSOLE TO PRINTERENDPROCPROCEDURE Command2.ClickREPORT FORM A:学生学籍管理表。frx PREVIEWENDPROCPROCEDURE Command3。ClickTHISFORM。RELEASEENDPROC学生学籍管理系统的开发和应用,可以提高学校的管理水平。学校办公效率可以有很大的提高,为学校的信息管理提供了一个良好的工具,化简了繁琐的工作模式,从而使得学校的管理更加合理化和科学化。良好的管理信息系统节省了大量的人力和物力,也避免了大量重复性工作。高效的管理信息系统也为工作人员提高自身的计算机水平提供了机会,每个人都应该适应社会高新技术的发展,努力追赶科技潮流。在学生学籍管理系统的设计和开发工作中,也存在着诸如程序难免有一些错误和不足等,欢迎朋友们看过文章后能够提出宝贵的意见和建议。11