Visual Basic课程设计报告
报告人:王菁
一、 题目介绍及功能要求
每个现代人都有众多的亲戚、朋友、业务伙伴的通讯信息(包括姓名、性别、生日、工作单位、电话号码和邮政编码等)需要维护。平常所使用的纸质通讯录不便于管理大量的通讯录信息,特别是查询起来相当费事。本题目要求编制一个通讯录管理程序,实现通讯录信息的添加、修改、删除和查询功能。
二、 所含控件名称
命令按钮控件、文本框控件、标签控件、列表框控件、图片框控件、滚动条控件、组合框控件、动态数组控件、日期选择器控件
三、 新控件简介
1. DTPicker控件
日期选择器控件,是专为用户输入单个日期设计的,一般状态下它像个组合框,可以单独编辑器中日期的年、月、日数值。单击右边下拉按钮时,会弹出一个月历控件,从中可以方便的单击选择一个日期,当Value值改变时引发Change事件。本程序中编写Birthday = DTPicker1.Value语句对该控件进行应用。
2. 配置文件的应用
配置文件是一种特殊格式的文本文件,一般以.ini为扩展名。配置文件中的空行被忽略,以分号“;”开头的行作为注释内容也被忽略。节名不能重复,同节中的键名也不能重复。本例中[Record1] [Record2] [Record3]等即为节名,姓名、性别、邮政编码、手机、电子邮件、出生日期、所在城市、工作单位、住宅电话、办公电话、照片、职务职称、地址即为键名。因为配置文件的特殊格式,Windows提供了专门的API函数对其进行读写,与一般的文本文件读写操作相比更加简便,配置文件的读写不必使用Open、Close、Write、Input等顺序文件的文件操作语句。
可以使用WritePrivateProfileString函数在配置文件的指定节中写入一个键,此函数的声明语句如下:Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long 使用时如果指定的文件不存在会自动创建,如果文件中无指定的节名也会自动创建,如果指定的节名中已有同名的键,会被新值覆盖。
可以使用GetPrivateProfileString函数在配置文件的指定节中读出一个键,此函数的声明语句如下:Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long 注意:对应于lpReturnedString 参数的变量应是一个足够长的字符串变量,否则不能容纳读出的字符。nSize参数的值不能大于lpReturnedString参数的实际长度。
四、 运行界面和功能
此界面为主界面,可用来显示各个联系人的信息。
此界面为添加联系人界面,在此界面可以输入新的人员信息然后保存。
此界面为修改当前记录界面,可修改除姓名外的所有信息,点击确定保存。
五、 遇到的困难及解决办法
1.多个变量的处理
本来想使用各个变量单独定义的方法,发现太麻烦,不仅编写程序麻烦,而且录入信息、修改信息、保存信息也很麻烦。后来参考课本上的提示,选择了动态数组控件,解决了这个问题。
Public Type Addr
Name As String * 4 '姓名
Sex As Boolean '性别
Birthday As Date '生日
City As String * 20 '所在城市
Title As String * 6 '职务职称
Company As String * 30 '工作单位
Address As String * 30 '地址
Tel_Home As String * 8 '住宅电话
Tel_Office As String * 8 '办公电话
Mobile As String * 11 '手机
PostalCode As String * 6 '邮编
Email As String * 40 '电子邮件地址
photo As Boolean '是否有照片
Deleted As Boolean '是否被删除
Modified As Boolean '是否被修改
End Type
Public Addrs() As Addr '通讯录信息
Public RecNum As Integer '通讯录记录数
2.通讯录信息的保存
本来想使用写顺序文件的语句即“Write #文件号,一个或多个参数,|;”,发现用这种方式保存的文件阅读起来很困难,因为信息是按照属性顺次输出的,而不是每个人的信息在一起,造成文件中的信息混乱无章,查阅不方便。后来根据课本上的提示,选择使用配置文件格式将通讯录信息保存在Abbr.ini文件中,每个人的信息保存在单独的一节中,阅读起来比较清晰明了。文件的最后有“[系统]”节,其中保存了用到的所有城市名和职务名。虽然读写速度较慢,但比写顺序文件的操作还是方便很多。
For i = 1 To RecNum
If Not Addrs(i).Deleted Then
WritePrivateProfileString "Record" & i, "姓名", Addrs(i).Name, App.Path & "\addr.ini"
If Addrs(i).Sex Then
WritePrivateProfileString "Record" & i, "性别", "男", App.Path & "\addr.ini"
Else
WritePrivateProfileString "Record" & i, "性别", "女", App.Path & "\addr.ini"
End If
WritePrivateProfileString "Record" & i, "邮政编码", Addrs(i).PostalCode, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "手机", Addrs(i).Mobile, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "电子邮件", Addrs(i).Email, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "出生日期", CStr(Addrs(i).Birthday), App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "所在城市", Addrs(i).City, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "工作单位", Addrs(i).Company, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "住宅电话", Addrs(i).Tel_Home, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "办公电话", Addrs(i).Tel_Office, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "照片", CStr(Addrs(i).photo), App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "职务职称", Addrs(i).Title, App.Path & "\addr.ini"
WritePrivateProfileString "Record" & i, "地址", Addrs(i).Address, App.Path & "\addr.ini"
End If
Next
使用WritePrivateProfileString函数在配置文件的指定节中写入一个键,此函数的声明语句在标准模块中。
保存以后下一次操作时读取信息也很方便,不需要用Get语句,而是直接使用GetPrivateProfileString函数。
n = GetPrivateProfileString("系统", "城市名", "", s, 99, App.Path & "\addr.ini") '读入城市名称
s = Left(s, n)
n = DivideString(s, ",", Cities)
For i = 1 To n
comCity.AddItem Cities(i)
Next
'读入职务名==============================
n = GetPrivateProfileString("系统", "职务名", "", s, 99, App.Path & "\addr.ini")
s = Left(s, n)
n = DivideString(s, ",", Titles)
For i = 1 To n
comTitle.AddItem Titles(i)
Next
i = 0
Do
i = i + 1
n = GetPrivateProfileString("Record" & i, "姓名", "", s, 99, App.Path & "\addr.ini")
If n < 2 Then Exit Do
ReDim Preserve Addrs(i)
Addrs(i).Name = Left(s, n / 2)
n = GetPrivateProfileString("Record" & i, "性别", "", s, 99, App.Path & "\addr.ini")
If Left(s, n / 2) = "男" Then '一个汉字两上字节
Addrs(i).Sex = True
Else
Addrs(i).Sex = False
End If
n = GetPrivateProfileString("Record" & i, "邮政编码", "", s, 99, App.Path & "\addr.ini")
Addrs(i).PostalCode = s
n = GetPrivateProfileString("Record" & i, "手机", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Mobile = s
n = GetPrivateProfileString("Record" & i, "电子邮件", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Email = s
n = GetPrivateProfileString("Record" & i, "出生日期", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Birthday = s
n = GetPrivateProfileString("Record" & i, "所在城市", "", s, 99, App.Path & "\addr.ini")
Addrs(i).City = s
n = GetPrivateProfileString("Record" & i, "工作单位", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Company = s
n = GetPrivateProfileString("Record" & i, "住宅电话", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Tel_Home = s
n = GetPrivateProfileString("Record" & i, "办公电话", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Tel_Office = s
n = GetPrivateProfileString("Record" & i, "照片", "", s, 99, App.Path & "\addr.ini")
Addrs(i).photo = CBool(Left(s, n))
n = GetPrivateProfileString("Record" & i, "职务职称", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Title = Left(s, n)
n = GetPrivateProfileString("Record" & i, "地址", "", s, 99, App.Path & "\addr.ini")
Addrs(i).Address = Left(s, n)
使用GetPrivateProfileString函数在配置文件的指定节中读出一个键,此函数的声明语句在标准模块中。注意:对应于lpReturnedString 参数的变量应是一个足够长的字符串变量,否则不能容纳读出的字符。nSize参数的值不能大于lpReturnedString参数的实际长度。
六、心得体会
要善于看课本上的提示,有时控件的功能达不到要求,要尝试更换其他控件。新控件的学习虽然不是一帆风顺的,但是学习以后可以让程序更加简洁方便。