VB课程设计报告模板及范例31.docx
《VB课程设计报告模板及范例31.docx》由会员分享,可在线阅读,更多相关《VB课程设计报告模板及范例31.docx(18页珍藏版)》请在冰豆网上搜索。
VB课程设计报告模板及范例31
VisualBasic课程设计报告
题目1:
难度:
***
题目2:
难度:
指导教师:
袁红兵
姓名:
学号:
专业:
班级:
学院:
日期:
2016年3月
目录
1、题目简介2
2、设计思路与总体方案4
2.1窗体frm14
2.2窗体form16
2.3窗体frmcssz7
2.4窗体frmlsz10
2.5窗体frmcxtj12
2.6标准模块17
3、设计过程遇到的主要问题及解决方法18
4、设计中尚存的不足分析18
5、心得体会18
6、参考文献19
1、题目简介
(简要说明课程设计所设计的程序的主要功能。
)
本题目旨在设计与一个可对个人日常手入和消费帐目进行管理和查询统计的程序,通过此程序的设计,可以加深我们对上学期的vb基础知识的印象,使理论升华为实际操作,同时也有助于我们培养理财意识,用电子记录的形式取代从前的手写记录,使得信息更加精准,不易丢失。
题目的难度系数相对不高,但牵涉到众多的知识点作为典型的多模块设计类型的题目,本程序由五个窗体模块frm1,form1,frmcssz,frmcxtj,frmlsz和一个标准模块共同构成。
此外根据课本121页要求,另有三个文本文件inputtype.txt,outputtype.txt和balance.txt分别用于保存收入类型,支出类型和收入支出帐目。
本程序的密码按照题目要求保存在了Balance.pas中,并自行设计加密处理。
我的笔记本打不开这个文件,即便打开看到的也不再是密码本身。
这点尽管在这个程序中用处不是太大,但为我们保存重要文件提供了一种思路。
程序要求实现如下功能(主要根据窗口由易到难的顺序来)。
如图1所示,frm1是启动窗体。
有密码的设定和破译,开始时必须先输入密码。
每次错误后会弹出对话框给予提示,连续累计三次则程序自动退出初始密码为空,直接单击即可进入。
图1.程序主界面
2.输入密码后则进入主界面,它是连接所有窗口的平台。
3.单击“参数设置”按钮进入“参数设置”窗口。
窗口的三个选项卡是通过SSTab或Tabstrip控件来制作。
这些陌生的外部空间对于我通过安装了vb企业版方才得到(详见课本6-7页两者对比),因为ssTab控件相对来说简单,所以在这个程序的中我完全采用了SSTab控件。
4.收入类别和支出类别的选项卡分别需要实现对两者的添加,删除,修改,返回操作,更为重要的是要保存在文件中,以备在流水帐和查询统计的combobox中使用。
开始时,“添加”和“返回”按钮可用,而其余两个被置灰,而且文本框不可输入。
因为此时列表框的条目未被选中,所以修改和删除已失去意义,不可用。
“添加”按钮比较繁琐,其本身可以被“确定”按钮替代功能。
本程序中,按下添加按钮,则此时文本框被清空可编辑,而对比来说,按下修改按钮文本框不清空且可编辑。
图2.输入错误的密码时的提示
5通过“密码修改”选项卡修改密码,如果两次输入不一致或者输入有误(图2和3)则会提醒用户。
此外,我把其设为了在保存时也会提醒,有助于我们记忆。
右上角的返回按钮可以随时返回主界面上。
6.单击主界面上的“日常流水帐”进入日常收支原始资料的主要输入窗口。
该窗口主要由“收入记账”和“支出记账”两大部分组成。
我设置了进入窗体时列表框为空,以便于对刚输入的情况一目了然。
。
这里面就涉及到了另一种新的控件,DTPicker控件的问题,这个控件使用起来极为方便,单击即可弹出日期选择框,且默认当天时间,简明易懂。
其中的列表框中的项目为参数设置所得,只需从中选择即可。
需要我们添加新的收支信息时,我设定了备注为可有可无的输入项但其他三个空如果有一个未填则会在单击保存后弹出msgbox提示,否则则会在底部的列表框中每行显示一个完整项,并且把信息存储到balance.txt中用于接下来的步骤。
单击取消按钮则可以清空各个文本框中的内容以便于重新输入。
添加完毕后单击右上角的返回按钮则回到主界面。
7本程序的重点和难点原先粗步估计集中在查询统计这一窗体模块中,所以采用了由易到难的策略。
该窗体由三个选项卡组成,既可以选择按类型查询从而了解单独的情况,也可以采用时间段的模式,从而宏观大体的知道某个时间内的情况。
设定这两种模式时需要通过单选框的改变来结合visible属性。
实际并非没有想象中的困难,但是,因为框架控件的问题,我在这里还是绕了歧路最终放弃了控件数组,原本代码可能会更简明些。
收入支出对比一项用于显示某段时间内总收入和总支出的量化对比,在输入时间段后按确定按钮即可显示。
返回按钮同上述情况。
8.程序中我设置了一个标准模块,主要用于自定义数据类型中的使用。
借用其配合,可使程序显得更简洁些。
2、设计思路与总体方案
(说明用到哪些控件并进行难点分析,说明所使用到的模块、过程、变量、数组、自定义数据类型及其相互关系,必要时给出系统结构图等图表。
对如下事项逐步进行必要的分析、说明:
●程序设计的主要思想,程序功能是如何实现的?
●设计了几个程序模块(有几个窗体模块、几个标准模块),各个功能模块的作者及想到之间的关系(模块间是如何传递信息和数据的,采用什么方式,为什么?
)?
●程序中定义了哪些主要的变量(分别定义了哪些过程级变量?
模块级变量和全局变量),这些变量起什么作用?
是否全局变量?
这里不需要给出大段的源程序,只需要给出关键的实现代码即可。
)
2.1窗体frm1
这是启动窗体,仅使用了两个标签和一个文本框及两个按钮,但是要考虑的地方却有很多。
下面我配合图和文字讲述下加密的过程,及对于输入字符时的对话框,还有累计三次时将自动退出的设置。
此处只有三个通用过程,分别为CmdCancel_Click,Cmdok_Click,txtpassword_KeyPress,难点集中在后两者上,其中txtpassword_KeyPress在后面也会用到;
PrivateSubCmdCancel_Click()
UnloadMe
EndSub
PrivateSubCmdok_Click()'自行设计的简易解密过程
Dimint1AsString
DimaAsLong:
StaticbAsInteger:
DimiAsInteger
Iftxtpassword.Text=""Then
Form1.Show
'使用静态变量三次来累计
frm1.Hide
ExitSub
EndIf
int1=txtpassword.Text
OpenApp.Path&"\balance.pas"ForInputAs1
Input#1,a
Close1
DoWhilei<=Len(CStr(np))Andi>=1
a=a-Asc(Mid("CStr(np)",i,1))
Loop
Ifa=int1Then
Form1.Show
UnloadMe
Else
txtpassword.Text=""
txtpassword.SetFocus
b=b+1
Ifb=3Then
MsgBox"三次密码输入不正确,请查实后再登录,谢谢!
","48","错误!
"
UnloadMe
Else
MsgBox"密码错误,请查实后再登录。
","48","错误!
"
EndIf
EndIf
EndSub
PrivateSubtxtpassword_KeyPress(KeyAsciiAsInteger)
IfKeyAscii<48OrKeyAscii>57Then
KeyAscii=0'密码含非数字字符,则显示错误
MsgBox"密码应当为数字,请重新输入",,"提示"
EndIf
EndSub
2.2窗体form1
这是主界面,最没有难度的环节。
但是我在此退出键上也设了一个对话框,这就提供了返回的余地.此处我设置了四个按钮控件,一个标签,和一个图像控件。
几段代码相似,仅有click过程
PrivateSubCmdlsz_Click()
Frmlsz.Show
UnloadMe
EndSub
PrivateSubCmdCxtj_Click()
Frmcxtj.Show
UnloadMe
EndSub
PrivateSubCmdEsc_Click()
DimiAsInteger
i=MsgBox("Areyousuretoexist?
",49,"Warn")
Ifi=1Then
UnloadMe
Else
Form1.Show
EndIf
EndSub
PrivateSubCmdcssz_Click()
Loadfrmcssz
frmcssz.Show
UnloadMe
EndSub
PrivateSubCmdtjcx_Click()
LoadFrmcxtj
Frmcxtj.Show
UnloadMe
EndSub
2.3窗体frmcssz
该窗体是以三个选项卡所构成的,了解到前两者具有对称性,这就提供给了我们思路,控件数组的使用可以简化两者的代码,从而提高程序的可读性。
窗口共出现了十五个按钮控件,我多将其设置成为了数组的模式,利用index属性的转换,简化工作量。
此外九个标签,四个文本框及两个列表框均是围绕着实现两个框架承载的内部结构所展开。
下述一段是利用数组写文件的过程,仅使用两个变量循环着输出便得以实现
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
DimiAsInteger,jAsInteger
OpenApp.Path&"\InputType.txt"ForOutputAs1
OpenApp.Path&"\OutputType.txt"ForOutputAs2
用unload的一个过程写文件
Fori=0To1
Forj=1ToList1(i).ListCount
Write#i+1,List1(i).List(j-1)
Nextj
Nexti
Close
EndSub
下述一段代码为读入列表框时所使用。
仅有一字符串变量来实现
PrivateSubForm_Load()
Dimstr1AsString
OpenApp.Path&"\OutputType.txt"ForInputAs#2
DoWhileNotEOF
(2)
Input#2,str1
List1
(1).AddItemstr1'读文件进入列表框
Loop
OpenApp.Path&"\InputType.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,str1
List1(0).AddItemstr1
Loop
Close
EndSub
PrivateSubCancel_Click()
np.Text="":
np2.Text=""'取消密码输入
EndSub
PrivateSubcmdfh_Click(IndexAsInteger)'返回按钮
Unloadfrmcssz
Form1.Show
EndSub
PrivateSubCmdqx_Click(IndexAsInteger)'取消按钮
DimmAsInteger
m=Index
Text1(m).Text=""
EndSub
PrivateSubCmdsc_Click(IndexAsInteger)'删除按钮
DimjAsInteger:
j=Index
List1(j).RemoveItemList1(j).ListIndex
Text1(j).Text=""
EndSub
PrivateSubCmdtj_Click(IndexAsInteger)'添加按钮
DimmAsInteger
m=Index
Text1(m).SetFocus
Text1(m).Locked=False
Text1(m).Text=""
EndSub
PrivateSubList1_Click(IndexAsInteger)
DimjAsInteger'点击列表框实现两键的去灰
j=Index
Cmdxg(j).Enabled=True
Cmdsc(j).Enabled=True
Text1(j).Text=List1(j).Text
EndSub
PrivateSubCmdxg_Click(IndexAsInteger)'修改按钮。
修改键解除文本框锁定
DimjAsInteger
j=Index
Text1(j).Locked=False
Text1(j).SetFocus
EndSub
PrivateSubCmdqd_Click(IndexAsInteger)
Dimint1AsInteger,kAsInteger'确定按钮。
对栏目的添加,修改
k=Index
IfList1(k).SelCount=0Then
List1(k).AddItemText1(k).Text
Else
int1=List1(k).ListIndex
List1(k).List(int1)=Text1(k).Text
EndIf
Text1(k).Text="":
Text1(k).Locked=True
Cmdxg(k).Enabled=False:
Cmdsc(k).Enabled=False
Cmdtj(k).SetFocus
EndSub
后面一段当时看来显得很费精力,因为需要自行设定加密方法
PrivateSubsure_click()
DimiAsInteger,passwordAsLong
i=1
Ifnp.Text<>np2.TextThen
MsgBox"两次密码不一样(~。
~)/,请重新输入",48,"提示"
ElseIfLen(Trim(np))>8Then
MsgBox"请保证密码不超过8位",48
Else'两次输入一样就加密并保存到文件
MsgBox"密码已修改,a请记住您的密码哦!
",64,"温馨提示"
EndIf
DoWhilei<=Len(np.Text)Andi>=1
np=np+Asc(Mid(np.Text,i,1))
Loop
OpenApp.Path&"\Balance.pas"ForOutputAs#1'设置密码
Write#1,np
Close#1
EndSub
PrivateSubnp_KeyPress(KeyAsciiAsInteger)
IfKeyAscii<48OrKeyAscii>57Then
KeyAscii=0'密码含非数字字符,则显示错误
MsgBox"密码应当为数字,请重新输入",,"提示"
EndIf
2.4窗体frmlsz
窗体frmlsz供用户输入每日的收支帐目,即收支类型、收支时间、金额和备注。
每次加载窗体frmlsz时从Inputtype.txt读出收入类型,从Outputtype.txt读出支出类型给combo控件初始化,便于用户选择相应的类型输入日常流水账。
为实现数据逐条读写采用doloop循环EOF()文件函数和input语句。
利用If语句判断data的int1取值,确定数据是收入还是支出,这是一种较为简便的方式,在后面的数据查询中有很大的发挥空间
Frmlsz在主界面中的default属性被我改成了true。
其结构简单,但设计上还是需要注意些问题,比方说就看下面一段代码,我们有时候确实有必要在细节上较真
PrivateSubCmdbc_Click(IndexAsInteger)
DimjAsInteger:
j=Index
Dimstr1AsString
IfCoblb(j).Text=""Ortxtje(j).Text=""Then'输入信息
MsgBox"请输入完整>o<",,"嘿嘿,注意"
ExitSub
Else
str1=DTPicker1(j).Value&Space(4)&Coblb(j).Text&Space(9)&txtje(j)&Space(12)&txtbz(j)
CallList1(j).AddItem(str1)
EndIf
DimnewdataAsdata
newdata.int1=j
newdata.time1=DTPicker1(j).Value
newdata.moneytype=Coblb(j).Text'收集信息并保存到文件
newdata.money=Str(Val(txtje(j).Text))
newdata.addition=txtbz(j).Text
OpenApp.Path&"\Balance.txt"ForAppendAs#1
Write#1,newdata.int1,newdata.time1,newdata.moneytype,newdata.money,newdata.addition
Close#1
EndSub
PrivateSubcmdfh_Click(IndexAsInteger)'返回
UnloadFrmlsz
Form1.Show
EndSub
PrivateSubCmdqk_Click(IndexAsInteger)'清空按钮
DimjAsInteger:
j=Index
Coblb(j).Text="":
txtje(j).Text="":
txtbz(j).Text=""
EndSub
这段代码基本上在所有类似的情况中都大同小异
PrivateSubForm_Load()'读取信息
Dimstr1AsString
OpenApp.Path&"\OutputType.txt"ForInputAs#2
DoWhileNotEOF
(2)
Input#2,str1
Coblb
(1).AddItemstr1
Loop
OpenApp.Path&"\InputType.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,str1
Coblb(0).AddItemstr1
Loop
Close
EndSub
2.5窗体frmcxtj
窗体frmcxtj算是对于上述窗体的综合应用。
在数组的基础上同时也涉及到了自定义变量类型,利用其寻找到时间或类别上符合要求的项,通过EOF语句不断赋值,再通过doloop循环得到。
两组单选框的value值改变而转化frame的visible属性,这是大致的思路框架。
具体落实到代码的编写上,比方寻找时间段是通过与dtpicker的value值比较
PrivateSubCmd3_Click()
DimnewdataAsdata,iAsInteger
‘此句为收入支出对比一栏上给两个文本框计算的过程
DimamountAsLong,money1AsLong,money2AsInteger
Lbldb.Caption="从"&Space(3)&DTPicker5.Value&Space
(2)&"到"&Space
(2)&DTPicker6.Value&Space
(2)&"期间"‘标签
OpenApp.Path&"\Balance.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,newdata.int1
Input#1,newdata.time1
Input#1,newdata.moneytype
Input#1,newdata.money
Input#1,newdata.addition
If(newdata.time1>=(DTPicker5.Value))And(newdata.time1<=(DTPicker6.Value))Andnewdata.int1=0Then
money1=money1+newdata.money
EndIf
If(newdata.time1>=(DTPicker5.Value))And(newdata.time1<=(DTPicker6.Value))Andnewdata.int1=1Then
money2=money2+newdata.money
EndIf
Loop
Text1.Text=money1
Text2.Text=money2
Close
Text1.Locked=True
Text2.Locked=True
EndSub
PrivateSubCmd1_Click()’第一个确定按钮
List1.Clear'
DimnewdataAsdata,iAsInteger
DimamountAsLong,moneyAsLong
amount=0
OpenApp.Path&"\Balance.txt"ForInputAs#1'当选择收入类型查询时
IfOption2.Value=TrueThen
DoWhileNotEOF
(1)
Input#1,newdata.int1
Input#1,newdata.time1
Input#1,newdata.moneytype
Input#1,newdata.money
Input#1,newdata.addition
If(newdata.time1>=(DTPicker9.Value))And(newdata.time1
<=(DTPicker10.Value))Andnewdata.moneytype=Combo1.TextThen
List1.AddItemnewdata.time1