资源描述
实验五 Visual Foxpro编程实践一.实验目的与要求
掌握利用Visual Foxpro编制开发自己的应用程序的实践知识,并学会在程序调试中自行 发现问题和修改程序代码,最终完成应用程序的无错运行。
二.相关知识
利用Visual Foxpro自行开发编制应用程序的步骤:
1 ,设置好系统的工作环境(尤其注意工作目录的默认设置)。
2 .如果是初次进行,应领先建立一个工程,为该工程命名,激活工程管理器。如果是 接着上次的工作进行,那么翻开上次工作的本工程,同样也激活工程管理器。
3 .在工程管理器的“数据” 9 “数据库”下面创立一个数据库,并命名(如已创立,那么 跳过本步骤)。
4 .在工程管理器的“数据” T “数据库”今“表”下面进行数据表的创立或修改工作, 并输入少量的正确数据以便将来的运行调试(如果已经创立了数据表,那么跳过本步骤)。
5 .在工程管理器的“文档”下面创立该应用程序所用到的所有表单,设计好各表单的 界面并为表单里的控件填写程序代码.(注意为表单添加各自的数据环境,否那么会出错!) 6.试运行各表单,发现问题后重新修改有问题的表单的代码,反复调试和修改直至最 后能无错运行。
7 .将应用程序打包发布或制作成安装文件。
三.实验内容与步骤
本次实验以一个简单的学生成绩管理系统为例。首先,对该系统作一个简单的介绍: 该应用系统为完成学生信息和成绩的管理系统,主要有以下儿个应用模块:
(1)用户登录管理.:系统具有管理员功能,只有取得管理员权限的人才能使用本系统。
(2)数据添加功能:对学生基本信息、教师基本信息、班级信息、课程信息、学生成 绩信息进行添加录入。
(3)数据查询功能:对上述信息的基本查询。
(4)数据修改功能:对上述信息可进行修改工作。
(5)统计操作:可分别按个人成绩、单科成绩统计出最高成绩、最低成绩和平均成绩 等。
(6)打印功能:对上述信息可进行打印。
实验步骤如下:
1 .数据库设计:
首先设置好系统的运行环境和工作目录,然后建立工程,为工程命名为“学生成绩管 理系统”,激活工程管理器,并在在工程管理器的“数据” 9 “数据库”下面创立一个 数据库,命名为“学生成绩管理”,在“数据库”的“表”下面创立以下各数据表: (1)用户信息表user(表名命名为user即可,不要加汉字。以下同。)
字段名称
类型
宽度
用户名
字符型
10
密码
字符型
10
(2)学生信息表student
字段名称
类型
宽度
学号
字符型
8
姓名
字符型
10
性别
字符型
2
函数与方法声明:
Label2
Caption
课程名称
Label3
Caption
类别
Label4
Caption
教师代码
(1) 1 中的 Deactive 事件:
功能:当前学生情况查询页面被释放时,使数据查询设置过滤条件为空.
程序清单: set filter tol.Combol 中的 InteractiveChange 事件:
功能:根据下拉列表框的选择,设置班级信息的过滤条件,同时清空文本框信息. 程序清单:
public m
m=l.
select studentset filter to 班级编号二111
l.Combo2 中的 InteractiveChange 事件:
功能:根据前面设置的班级过滤条件对学生信息进行查询,并将结果在当前页面显 示程序清单:
locate for姓名=*用组合框中的值进行查找if found()
1尸学号1尸姓名
1 .=性别.二出生日期
2 .二”endif
(4) 2中的Init事件:
功能:在“数据表浏览”页显示时进行相关的初始化工作.
程序清单:
with 1.recordsourcetype=6
.recordsource='student'.refresh
.columncount=5=60
.=65=40
=70=60
.rl.caption=,学号'.rl .caption='姓名,
.rl .caption=性别,.rl .caption='出生日期,
.rl .caption='班级编号,.readonly=.t.
.deletemark=.f.
endwith2.Combol 中的 IntelactiveChange 事件
功能:在“数据表浏览”页中根据下拉组合框中的选择对不同的表进行数据内容显 示
程序清单:
&&加入如下代码,可防止由字段少的表往字段多的表切换时造成数据字段丧失无法 显示的问题with t.gridl
.columncount=6.=60
♦二65=50
.=66.二70
=70endwith
&&即每次都事先把grid先刷新成行数教多的表.
do casecase =1
with t.gridl.recordsourcetype=6
.recordsource='student'.columncount=5
.=60.=65
=40=70
=60.rl .caption='学号'
.rl.caption='姓名'.rLcaption='性另『
.rl .caption=,出生日期,.rl .caption='班级编号,
.refresh.readonly=.t.
.deletemark=.f.
endwithcase =2
with t.gridl
.columncount=6
.recordsource=,teacher' .rl .caption='教师代码' .rl .caption='姓名, .rl .caption=性别, .rl .caption='出生日期' ・rLcaption='部门' .rl .caption='技术职务 =60.=65
=50.二66
=70=70
.refresh.readonly=.t.
.deletemark二.f.
endwithcase =3
with t.gridl
.recordsourcetype=6 •recordsource='classes' .columncount=6.=60
.二65=50
=70.=60
.=60
.rl .caption='班级编号 .rl.caption='年级, .rl.caption='专业’ .rLcaption=,系代码, .rl.caption='学制, .rl.caption='类别' .refresh
.rcadonly=.t. .deletemark=.f.
endwithcase =4
with t.gridl.recordsourcetype=6
.recordsource=,course,.columncount=4
.=60= 100
=50=50
.rl .caption=裸程代码,.rl .caption二裸程名称,
.rl .caption='类别,.rl .caption='教师代码'
.refresh.readonly=.t.
.deletemark=.f.
endwithcase =5
with t.gridl
.recordsourcetype=6 .recordsource=,score, .columncount=3
.=60= 100
=50.rl.caption二学号’
.rl .caption=,课程代码,.rl.c叩tion二成绩,
.refresh.readonly=.t.
.deletemark=.f.
endwithendcase
(5) 3中的Init事件
功能:当“课程浏览”页面被显示出来时,进行相关的初始化工作. 程序清单:
select course1. 丫@1互=课程代码
2.1比=课程名称3.丫@111匕二类另1」
4.丫@1起二教师代码3中的Refresh事件
功能:在“课程浏览”页面中刷新当前的数据显示程序清单:
select course.value二课程代码
1 .丫2111©=课程名称.value=类别
2 .value=^师代码3 中的 CommandGroupl 的 Click 事件
功能:利用按钮组完成对数据库中的记录浏览程序清单:
select coursedo case
case =1go top
case =2skip -1
if bof()messagebox。已至lj首部!,,0+48」系统提示)
go topendif
case =3skip
if eof()messageboxf已至,末尾!、0+48,,系统提示‘)
go bottomendif
case =4go bottom
case =5se
endcasesh
(7) 数据修改模块
功能描述:用户可以通过不同的页面完成对5个不同表中的数据的修改操作 界面设计:
由于修改表单中对于5个表的操作方法类似,这里只给出第一个页面即“学生表”的 设计局部。其余4个页面的设计及相关的程序代码请同学们自己思考并完成。
表单名称:修改
文件名:修改.SCX
数据环境:,,,,
对象设置:
对 象
属性
值
Forml
Caption
修改
PageFrame 1
PageCount
5
Command 1
Caption
返回:
1
RowSourceType
6-字段
RowSource
Student.学号
1
RowSourceType
6-字段
RowSource
Teacher.教师代码
1
RowSourceType
6-字段
RowSource
Classess .班级编号
1
RowSourceType
6-字段
RowSource
Course .课程代码
1
RowSourceType
6-字段
RowSource
Score•学号
ndl
Caption
确定
nd2
Caption
退出
函数与方法声明:
(1) 1 中的 Activate 事件:
功能:在学生信息修改页面显示时进行初始化操作程序清单:
select student
go top
Lvalue=学号
2 .value二姓名
3 .value=性别
4 .丫@1肥=出生日期
5 .value四土级编号
(2) l.Combol 中的 IntelactiveChange 事件:
功能:根据学号,查找对应的学生信息
程序清单:
select student
locate for 学号二
if found()1尸学号
1.二姓名1.二性别
1.二出生日期1 .二班级编号
endif
⑶LCommandl中的Click事件:
功能:当用户单击“确定”按钮后,将当前修改的数据保存到数据库中.
程序清单:
select student
a=alltrim(l.)
b=alltrim(l.)
c=alltrim(l.)
d=alltrim(dtoc( 1.))
e=alltrim(l.)
set exact on
do casecase a="
messagebox。学生学号不能为空"0+48,,系统提示‘)1.CUS
case b="messageboxC学生姓名不能为空"0+48,'系统提示,)
1.CUScase c="
messagebox,学生性别不能为空=0+48,'系统提示,)1.CUS
case d="messagebox,学生出生日期不能为空=0+48,,系统提示‘)
1.CUScase e="
messagebox,学生班级编号不能为空1 0+48,'系统提示')1.CUS
otherwisem=messageboxC确定要修改学生记录吗?"0+48,,系统提示,)
if m=lselect student
replace 学号 with areplace 姓名 with b
replace 性别 with creplace 出生日期 with ctod(d)
replace班级编号with emessagebox。修改成功!’)
endif
endcase
(4) Lcommand2 中的 Click 事件:
功能:释放当前窗口
程序清单:
se
2.6数据统计模块功能描述:用户可以通过不同的页面完成对5个不同表中的数据的修改操作 界面设计:
表单名称:统计文件名:统计.SCX
数据环境:,,对象设置:
对象
属 性
值
Forml
Caption
统计
OptionGroupl
ButtonCount
2
Label 1
Caption
最高成绩
Label2
Caption
最低成绩
Label3
Caption
平均成绩
Listl
RowSourceType
6-字段
Label4〜Label6
(空白标签用于显示运算结果)
Command 1
Caption
返回
函数与方法声明:
(1) Forml中的Init事件
功能:在窗体被调用时,进行显示的初始化工作
程序清单:
5.caption=H
6.caption="
7.caption="
(2) nGroupl 中的 IntelactiveChange 事件
功能:根据单项选择框的选择情况,进行数据源的设置
程序清单:
do casecase =0
1 .rowsource=M*无选项时不设置数据源1 .refresh
case =11 .rowsource='student.姓名'
1 .refreshcase -2
1 .rowsource='course.课程名称,1 .refresh
endcase
3 3) 1 中的 IntelactiveChange 事件
功能:如果选项被改变,那么根据用户指定的新选项重新统计并显示结果
程序清单:
do case
case =1xm=alltrim()
select studentlocate for 姓名=xm
xh二学号select score
calculate max(成绩),min(成绩),avg(成绩)for 学号=xh to nl, n2, n3.caption=alltrim(str(n 1, 4, 1))
5 .caption=alltrim(str(n2, 4, 1)).caption=alltrim(str(n3, 4, 1))
case =2ch=alltrim()
select courselocate for课程名称=ch
kedm二课程代码select score
calculate max(成绩),min(成绩),avg(成绩)for 课程代码=代出11 to ml, m2, m3.caption=alltrim(str(m 1))
6.caption=alltrim(str(m2))7.caption=alltrim(str(m3))
endcase
4 4) ndl中的Click事件功能:释放当前窗口
程序清单:se.6数据打印模块
功能描述:完成相应的打印操作 界面设计:
表单名称:打印
文件名:打印.SCX数据环境:,,, 对象设置:
对 象
属性
值
OptionGroupl
ButtonCount
5
Option 1
Caption
学生表
Option2
Caption
教师表
Option3
Caption
班级表
Option4
Caption
课程表
Option5
Caption
成绩表
Command 1
Caption
显示结果
Command2
Caption
返回
函数与方法声明:
⑴ndl中的Click事件
功能:根据选择的具体表,将其中的数据记录进行显示
程序清单:
do casecase =1
select studentgo top
do form打印结果显示list rest to printer
case =2select teacher
go top
班级编号
字符型
6
出生日期
日期型
8
(3)教师信息表teacher
字段名称
类型
宽度
教师代码
字符型
4
姓名
字符型
10
性别
字符型
2
职称
字符型
10
部门
字符型
10
出生日期
日期型
8
(4)班级信息表classes
字段名称
类型
宽度
班级编号
字符型
6
年级
字符型
4
专业
字符型
10
系代码
字符型
2
学制
字符型
2
类型
字符型
4
(5)课程信息表course
字段名称
类型
宽度
课程代码
字符型
6
课程名称
字符型
16
类别
字符型
4
教师代码
字符型
4
(6)分数信息表score
字段名称
类型
宽度
学号
字符型
8
课程代码
字符型
6
成绩
数值型
4
创立好以上数据表以后,应该向每个表中添加适量合法数据以便后面的测试。
5 .表单设计
2.1登录模块功能描述:实现只有指定的用户才能访问系统的功能。并且,只有身份为“管理员” 的用户才可以调用修改模块修改数据。
界面设计:
do form打印结果显示 list rest to printer case =3select classes
go topdo form打印结果显示
list rest to printer case =4select course
go topdo form打印结果显示
list rest to printer case =5select score
go topdo form打印结果显示
list rest to printer endcase
⑵nd2中的Click事件 功能:释放本窗口.
程序清单:
se
2.9主程序
注意:在工程管理器里的“代码” 9 “程序”下面建立本系统的主程序 文件名: 程序清单: set talk off clear all 」e=・f.
public mypath
mypath=left(sys( 16), rat('\', sys(l 6))) set defa to &mypath do form
read events
说明:每一个工程都应该有主程序,又叫入口程序,即整个工程是从哪里开始执行 的。
设置主程序的方法是在工程管理器中选中它,然后按鼠标右键将其设置为主程序。设 置为主程序的程序会以黑体字显示,以后应用系统的执行将首先从该程序开始执行, 由该程序来调用其它的程序或模块。
我们经常把系统的环境设置,公共变量设置等放在主程序之中。
表单名称:login 文件名:
数据环境:
对象设置:
对象
属性
值
说明
Forml
Caption
欢迎使用学生成绩管理 系统
Lablel
Caption
学生成绩管理系统
Lable2
Caption
请输入用户名:
Lable3
Caption
请输入密码:
Combo 1
RowSourceType
6-字段
指定数据值来源类型
RowSource
User.用户名
指定数据值来源
Cammand 1
Caption
登录
Cammand2
Caption
退出
函数与方法声明:
(1) Commandl 中的 Click 事件功能:完成在登录时对输入的用户名和密码的检验,如果数据表user中存在输入的用 户名和密码信息,那么调用主窗口(如果是管理员那么不但调用主窗口,还允许执行主窗口 的修改功能),否那么提示输入错误。
程序清单:
private kl, yh, ststd密码不正确,请重新输入!,
use userkl=alltrim( Lvalue)
yh=alltrim( Lvalue)
* 将用户输入的用户名和密码的值分别保存在yh和kl变量中
locate for alltrim(l.value)= =alltrim(user,用户名)
* 在user表中查找是否有与yh和kl匹配的记录
if found() and alltrim(user.密码尸=kl
* 正确的用户名和密码le=・f.
close tables alldo form
if yh=='admin'*如果是超级用户管理员,那么允许他使用main表单中的第三组按钮(即修改模块) n3.enabled=.t.
endift.=”
else
* 错误的用户名和密码,系统给出提示,延迟2秒
wait window st timeout 2
Lvalue-'
1 .setfocus
endif
(2) Command!中的 Click 事件
功能:退出学生成绩管理系统
程序清单:
clear events
quit
(3) Forml 的 Destroy 事件
功能:意外关闭程序窗口时的处理
程序清单:
clear events
(4) 主界面模块
功能描述:主要是提供本系统各功能模块的入口.
界面设计:
表单名称:main 文件名:
数据环境:无对象设置:
对
象
属性
值
Forml
Caption
学生成绩管理系统
Lablel
Caption
欢迎使用学生成绩管理系统
Lable2
Caption
请选择要操作的内容:
Optiongroupl
ButtonCount
6
nl
Caption
添加记录
n2
Caption
查询记录
n3
Caption
修改记录
n3
Enabled
.F.
n4
Caption
统计数据
n5
Caption
打印报表
n6
Caption
退出系统
函数与方法声明:
(1) Optiongroupl 中的 IntelactiveChange 事件:
功能:根据Optiongroupl中的选择单击按钮,调用各重要功能模块.
程序清单:
do casecase =1
do form添加case =2
do form查询case =3
do form修改case =4
do form统计case =5
do form打印case =6 quit
endcase
(2) Optiongroupl 中的每一个 Option 的 Click 事件:
功能:与(1)中不同,(1)是指在Optiongroup中的各个Option切换时才触发的程序, 仅这样还不够,还耍编写每个Option被单击时触发的程序才完整。
程序清单:
对应nl的Click事件: do form添加
・・・・・.(其余类推)
(3) 数据添加模块功能描述:用户通过5个不同的页面来完成对学生信息表、教师信息表、班级表、 课程表和成绩表的数据添加操作。
界面设计:
器添加
学生表
学号
姓名
性别
教师表
Textl
Text2
Text3
添加
班级表
课程表I
成绩表
班级编号|Text4
出生日期| Text5
注意:日期格式应为3/DD/TY
清空
返回主菜单
表单名称:添加文件名:添加.SCX
数据环境:,,, 对象设置:
对 象
属性
值
说明
Forml
Caption
添加
PageFramel
PageCount
5
Commandl
Caption
返回主菜单
主表单中的Commandl
Pagel
Caption
学生表
Page2
Caption
教师表
Page3
Caption
班级表
Page4
Caption
课程表
Page5
Caption
成绩表
Command 1
Caption
添加
与上面的Commandl不 同,这是在各个页面中 的 Commandl
Command2
Caption
清空
函数与方法声明:
因为添加表单中对于5个表的操作方法类似,所以这里只给出学生表的添加局部,其 余4个页面的程序请同学们自己对照思考和编制。
(1) Forml 中的 Active 事件功能:设置焦点位置
程序清单:
1.CUSForml 中的 Commandl 的 Click 事件
功能:释放当前窗口程序清单:
(2) Pagel 中 Commandl 的 Click 事件功能:将输入的新记录信息添加到学生表中,完成新记录的添加工作
程序清单:
numl=alltrim(l.)num2=alltrim(l.)
num3=alltrim(l.)num4=alltrim(l.)
num5=alltrim(l.)set exact on
do case
case num 1 ="messageboxC学号不能为空0+48」系统提示!’)
l.cus
case num2=Hmessagebox('姓名不能为空!',0+48,'系统提示!')
l.cus
case num3="messagebox(性别不能为空!,,0+48,,系统提示!')
l.cus
case num4="messagebox,班级编号不能为空!0+48,'系统提示!')
l.cus
case num5="messageboxC出生日期不能为空匕0+48」系统提示!,)
l.cusotherwise
a=messagebox(‘确认添加么?1+64+0,,系统提示!') if a=l
select student
go bottom
insert into student(学号,姓名,性别,班级编号,出生日期)values(numl, num2, num3,num4, ctod (num5))
messageboxf 添力口成功!)
else
l.cus
endifendcase
(3) Pagel 中的 Command!的 Click 事件:
功能:清空当前页面上输入的数据程序清单:
由于其它各个页面上的添加数据的操作大同小异,这里不再赘述。
2.4数据查询模块功能描述:用户可以通过不同的页面完成对5个不同表中的数据的查询操作 界面设计:
表单名称:查询文件名:查询.SCX
数据环境:,,,,对象设置:
查询主表单中的对象设置:
对 象
属性
值
说明
Forml
Caption
查询
PageFramel
PageCount
3
Command 1
Caption
返回主菜单
主表单中的Command 1
1中的对象设置:
2用来对数据表进行浏览,其界面为:
对 象
属性
值
Combo 1
RowSourceType
6-字段
RowSource
Classese .班级编节
Combo2
RowSourceType
6 .字段
RowSource
Student.姓名
Label 1
Caption
请选择班级代码和姓名
Label2
Caption
班级代码
Label3
Caption
姓名
Label4
Caption
学号
Label5
Caption
姓名
Label6
Caption
性别
Label7
Caption
出生日期
国查询学生基本情况数据表浏览课程浏览
返回康菜单
其中的对象设置:
对 象
属性
值
Combo 1
RowSourceType
1-值
RowSource
学生表,教师表,班级表,课程表,成绩表
Style
2-下拉列表框
Value
1
Label 1
Caption
请选择要浏览的表
Gridl
RecordSourceType
。-表
3用来进行课程浏览.其界面为:
其中的对象设置:
对 象
屈,性
值
CommandGroupl
ButtonCount
5
Label 1
Caption
课程代码
展开阅读全文