通讯录课程设计报告.docx
- 文档编号:4382954
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:165.40KB
通讯录课程设计报告.docx
《通讯录课程设计报告.docx》由会员分享,可在线阅读,更多相关《通讯录课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
通讯录课程设计报告
通讯录管理系统
用户签名:
赵佳乐
开发成员:
开发时间:
目录
引言3
1工作计划3
1.1主要工作阶段划分3
1.2工作任务分工3
2需求分析3
2.1概述3
2.2用户分析4
2.3约束条件4
2.4功能需求4
2.5用户界面需求4
3设计与实现5
3.1概述5
3.2详细设计6
3.2.1类的抽象及设计6
3.2.2表结构设计6
3.3主要程序文件6
3.4开发环境以及部署环境要求8
.5主要源码8
4测试14
4.1概述14
4.2测试环境14
4.3测试计划14
4.4测试项目及结果15
5、工作总结17
5.1工作成果17
5.2过程分析17
5.3经验教训及其分析18
引言
随着网络及现代通讯技术的发展,人们之间的联系越来越便捷,这也使得同时与许多人办吃着联系成为可能,而单纯依靠人脑已很难记住所有的联系方式,使用传统的纸面的方式记录联系人信息时,在联系人见多是查找将非常困难。
因此,以软件形式实现的通讯成为了许多人保持联系方式的首选,该系统具有基本通讯录的主要功能,他可以对联系人进行分组,并可以添加和删除组,也可以添加和删除联系人,也可以队一寸联系人信息进行修改,查询功能也是必不可少的。
1工作计划
1.1主要工作阶段划分
星期一:
分析设计阶段
星期二:
设计框架阶段
星期三~四:
实现功能阶段
星期五:
调试阶段
1.2工作任务分工
阶段名称
任务名称
任务描述
负责人
分析设计阶段
分析设计
分析设计需求,构想整体功能,及如何实现
赵佳乐
设计框架阶段
设计框架
设计创建数据库,连接数据库,
创建程序框架及窗口控件设计
赵佳乐
功能实现阶段
功能实现
构建成员函数,实现各个控件的功能,
赵佳乐
调试阶段
调试完善
进行运行调试,完善各个功能,去除个别bug
赵佳乐
2需求分析
2.1概述
一个普通的通讯录系统,最基本的功能是记录联系人的信息,一般而言,使用者可能需要的信息由一下这些:
姓名、性别、工作单位、住宅电话、手机、邮箱、QQ、MSN、还有备注的信息。
同时,不是每个联系人都有工作单位,也不是每一个联系人都有QQ或MSN。
因此,除了姓名与性别外,其他信息都可以为空,但既然是通讯录其中至少应当有联系人的一项联系信息,所以,对信息记录的要求应当为:
姓名与性别是必需的,其他所有信息至少一项不为空。
管理操作很容易就联想到应该有增加联系人、删除联系人和对联系人信息进行修改等。
同时为了便于查看和使用及管理,需要对联系人进行分组管理,组操作应包括基本的添加组合删除组。
通讯录最核心的问题就是联系人信息储存到什么地方,威力有效地存储和管理应该将信息存储到数据库中,数据是该系统的核心,所以设计一个好的数据库结构是重心。
2.2用户分析
首先界面应该简洁大方,包含的信息种类应尽量齐全,同时应该支持分组功能,便于管理浏览,应该支持查找联系人(能实现同名查找显示多条信息),增加联系人和增加分组,删除联系人或删除组,修改联系人信息等功能。
2.3约束条件
开发人员:
首先开发的时间比较紧迫,掌握的知识有限不能将程序做单尽善尽美,所以界面等做的比较简单,没有进行美化。
同时掌握的知识有限,有些功能不属于能力范围难以实现。
用户:
用户希望会有更强大的功能,更美观的界面,希望有用户登录界面,能更好的保护信息,但时间有限只能做到这种程度。
2.4功能需求
1.树形结构:
显示分组及组中联系人
2.增加组:
想通讯录中增加一个新的分组;
3.增加:
向当前选中的组中增加新的联系人;
4.查询:
输入姓名查找,当存在多个联系人的时候,提示还有同名联系人,可以继续输出剩余的联系人;
5.编辑:
对当前显示的联系人的信息进行修改;
6.删除:
当前选中的为组删除组,当前选中的为联系人删除联系人;
7.退出:
退出通讯录管理系统
2.5用户界面需求
要求有树形结构显示分组,展开分组时对应分组的成员姓名,点击姓名显示联系人信息,应有输出信息的区域,同时要有功能键区包含添加删除等按钮。
需要增加组时,单击“增加组”按钮,将弹出输入组名的对话框;单击“查询”时弹出人名输入界面;在删除组之前会弹出确认框,删除联系人也一样也会弹出确认框。
如下图所示:
组增加对话框查询联系人对话框组删除确认
联系人删除确认
3设计与实现
3.1概述
主要通过MFCODBC等技术实现,创建ACCESS数据库来存放信息,通过ODBC设定数据源,然后在MFC中利用它生成与数据表相关联的记录集类,以此来实现与数据库的连接。
通讯录最主要的功能就是显示联系人信息,因此主窗口的主要功能也应当是查询及显示联系人信息,联系人的分组列表则树控件进行显示。
然后对按钮添加相应的功能函数以实现其功能。
3.2详细设计
3.2.1类的抽象及设计
用ACCESS建立名为address.mdb的数据库,其中包括组信息表groupInfo和联系人信息表people,然后为通讯录数据库设定ODBC数据源,然后利用它自动生成与数据表相关联的记录集类CGroupInfo和CPeople以实现与数据库的交互。
在头文件AddressListDlg.h中定义结构体INTERFACECTERLDATA用来做记录集类与编辑框之间数据交换的中间变量。
创建姓名查询对话框在实例中对应的类是CQueryPeopleDialog。
创建新类对话框在实例中对应的类是CAppendNewGroupDialog。
3.2.2表结构设计
组信息表groupInfo结构
字段
含义
类型
长度
默认值
NULL/主键
id
组名ID
长整型
主键,自增
groupName
组名
文本
20
联系人信息表people结构
字段
含义
类型
长度
默认值
NULL/主键
id
ID
长整型
主键,自增
groupId
所属组ID
长整型
1
外键
fullName
姓名
文本
50
sex
性别
是/否
company
工作的单位
文本
255
phoneInCompany
办公电话
文本
15
homeAddress
家庭住址
文本
255
phoneInHome
家庭电话
文本
15
mobile
手机
文本
15
邮箱
文本
50
文本
15
msn
MSN
文本
50
memory
备注
文本
255
3.3主要程序文件
1.树控件的响应函数OnSelchangedTreeList
函数首先通过树控件的GetSelectedItem方法去的当前选择项,然后通过GetParentItem取的其父节点,如果没有父节点,则表明其为组节点,否则表明其为联系人节点。
如果是组节点则通过函数CollapseTree收起当前所有展开项,然后通过Expand方法展开当前选中组,最后通过SwitchData将此前显示的联系人信息清空,病将“更新”按钮禁用而将“增加”按钮启用。
如果为联系人节点,则通过CPeople取得当前选定联系人的信息,然后通过函数SwitchData将联系人信息显示与界面中,并将“更新”按钮启用而将“增加”按钮禁用。
2.函数CollapseTree
函数CollapseTree的功能是将所有展开的组收起,其实现方式是首先取得树控件的第一项,也就是即一个组节点,并将其收起,然后依次取得其他组节点。
3.函数SwitchData
在函数OnSelchangedTreeList中调用函数SwitchData,其功能是将数据显示于窗口各控件中或从窗口控件中取得当前输入的值,他的第一个参数为INTERFACECTRLDATA是在头文件中定义的结构体,第二个参数是布尔型的参数,当其值为逻辑真时,函数将第一个参数中传入的联系人信息显示于窗口上;当为假时,则将窗体各控件设定的值保存于第一个参数中。
4.查询联系人信息
在当前项目中增加对话框,并创建器对应的实类CQueryPeopleDialog,他有一个公共数据成员m_peopleName,在对话框中设定的姓名就保存在该成员变量中,然后主程序取得它的值执行具体的查询工作。
查询工作在函数OnOk中实现(查询按钮对应的功能函数)
在执行查询时,以用户输入的姓名为条件,在存在符合指定姓名的情况下,函数从树控件最上面的组开始查找联系人所在的位置,其定位依据是通过GetItemData方法取出存储在联系人节点中的联系人ID,如果查找到与当前查询记录相符的联系人,则让其处于当前选中状态。
而如果存在有姓名相同的联系人,还使用函数MessageBox弹出一个对话框询问用户是否要查看下一个联系人的信息。
5.“增加”按钮响应事件在函数OnButtonAppend中实现
函数首先调用函数CheckInputInfo(获得当前组ID的函数)检查输入的新的联系人信息是否合法,如果合法则调用函数GetCurrentSelGroupId获取的当前组的ID,然后调用SwitchData取得输入的信息并根据是否成功取到组ID生成不同的INSERT插入语句,获取ID失败时,插入联系人将不插入组ID而根据数据库的设计,将组默认为“未分组”的ID。
在生成SQL指令以后,通过CDatabase的ExecuteSQL方法执行,而在将新的联系人插入的数据库之后,则清空界面当前显示,然后调用函数RefurTree(刷新树控件的函数),以便及时将新添加的联系人也显示于左侧的树控件之中。
6.修改联系人信息
“更新”按钮的事件处理函数为OnButtonEdit,其主要操作是先通过函数SwitchData将界面设定的信息存入INTERFACECTRLDATA类型的结构体变量中,然后取得当前联系人的ID,并依据该ID将界面数据更新到数据库中。
7.删除联系人
“删除”按钮的事件处理函数为OnButtonRemove首先判断当前选中的是组还是联系人。
如果为联系人通过调用函数RemovePeople完成对指定ID的联系人删除。
函数RemovePeople首先使用CDatabase的Open方法都闪开数据源连接,然后根据作为参数传入的联系人ID生成SQL删除指令,最后调用ExecuteSQL执行删除指令。
如果为组则先识别是否为“未分组”,“未分组“被设计为不可删除组,因此为”未分组“时(未分组在数据库设计阶段已写入数据库并且其组ID为1),程序将弹出警告,并拒绝删除该组;如果选择其他组,则调用RemoveGroup执行组的删除工作。
8.追加组
增加对话框并创建对话框实类CAppendNewGroupDialog并为对话框中的编辑框添加控件变量m_groupName为该窗口上的“增加“按钮添加响应函数OnOk,函数首先从界面更取得用户设定的组名,并检查组名是否为空,然后以输入的组为条件查询当前系统是否已存在该组名。
如果不存在,则调用类CGroupInfo的AddNew方法添加一条新纪录,并将新组名赋予CGroupInfo的数据成员m_groupName,最后通过Update方法提交记录到数据库中
3.4开发环境以及部署环境要求
开发环境VC++6.0
应用ODBC建立数据源
.5主要源码
1.树控件事件响应
voidCAddressListDlg:
:
OnSelchangedTreeList(NMHDR*pNMHDR,LRESULT*pResult)
{NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;
HTREEITEMhItem=m_tree_list.GetSelectedItem();
if(hItem!
=NULL)
{if(m_tree_list.GetParentItem(hItem)==NULL)
{//选中组
//收起所有展开项
CollapseTree();
//展开选中的组
m_tree_list.Expand(hItem,TVE_EXPAND);
m_tree_list.EnsureVisible(hItem);
//清空联系人信息
INTERFACECTRLDATAtemp;
SwitchData(temp,true);
//更新按钮禁用
GetDlgItem(IDC_BUTTON_EDIT)->EnableWindow(FALSE);
//增加按钮启用
GetDlgItem(IDC_BUTTON_APPEND)->EnableWindow(TRUE);}
else
{//选中联系人
CDatabasedb;
CPeoplepeople(&db);
CStringstrSql;
strSql.Format("SELECT*FROMpeopleWHEREid=%d",
m_tree_list.GetItemData(hItem));
people.Open(AFX_DB_USE_DEFAULT_TYPE,strSql);
INTERFACECTRLDATAinterfaceData;
if(!
people.IsEOF())
{if(people.m_sex)
{interfaceData.bSex=true;}
else
{interfaceData.bSex=false;}
interfaceData.strCompany=people.m_company;
………..
interfaceData.strQq=people.m_qq;}
SwitchData(interfaceData,true);
//更新按钮启用
GetDlgItem(IDC_BUTTON_EDIT)->EnableWindow(TRUE);
//增加按钮禁用
GetDlgItem(IDC_BUTTON_APPEND)->EnableWindow(FALSE);}
}*pResult=0;}
2.收缩Tree控件
voidCAddressListDlg:
:
CollapseTree()
{HTREEITEMhtiItem=m_tree_list.GetRootItem();
while(NULL!
=htiItem)
{m_tree_list.Expand(htiItem,TVE_COLLAPSE);
htiItem=m_tree_list.GetNextSiblingItem(htiItem);}}
3.与界面交换数据
voidCAddressListDlg:
:
SwitchData(INTERFACECTRLDATA&info,boolflag)
{if(flag)
{//更新界面
m_address=info.strHomeAddress;
………….
m_qq=info.strQq;
if(info.bSex)
{m_sex=0;//男}
else
{m_sex=1;//女}
UpdateData(FALSE);}
else
{//取数据
UpdateData(TRUE);
info.strHomeAddress=m_address;
info.strHomeAddress.TrimLeft();
info.strHomeAddress.TrimRight();
……………(中间略)
info.strQq=m_qq;
info.strQq.TrimLeft();
info.strQq.TrimRight();
if(m_sex==0)
{info.bSex=true;}
else
{info.bSex=false;}}}
4.查询按钮响应
voidCAddressListDlg:
:
OnOK()
{CQueryPeopleDialogdlg;
if(dlg.DoModal()==IDOK)
{//取得待查询联系人名
CStringstrPeopleName=dlg.m_peopleName;
//执行查询
CDatabasedb;
CPeoplepeople(&db);
CStringstrSql;
strSql.Format("SELECT*FROMpeopleWHEREfullName='%s'\
ORDERBYgroupIdDESC,id",
strPeopleName);
people.Open(AFX_DB_USE_DEFAULT_TYPE,strSql);
if(people.GetRecordCount()==0)
{MessageBox("没有找到要查询的联系人!
","信息",\
MB_OK|MB_ICONINFORMATION);
return;}
//显示结果
while(!
people.IsEOF())
{//取得联系人ID
intnId;
nId=people.m_id;
HTREEITEMhtiItem=m_tree_list.GetRootItem();
while(NULL!
=htiItem)
{m_tree_list.GetItemData(htiItem);
m_tree_list.Select(htiItem,TVGN_CARET);
//清空联系人信息
INTERFACECTRLDATAtemp;
SwitchData(temp,true);
//选中组下的联系人
HTREEITEMhPeople=m_tree_list.GetChildItem(htiItem);
while(NULL!
=hPeople)
{if(nId==m_tree_list.GetItemData(hPeople))
{m_tree_list.Select(hPeople,TVGN_CARET);
gotoSEEKEND;}
hPeople=m_tree_list.GetNextSiblingItem(hPeople);}
htiItem=m_tree_list.GetNextSiblingItem(htiItem);}
SEEKEND:
//移至下条记录
people.MoveNext();
if(!
people.IsEOF())
{if(MessageBox("还有满足条件的联系人,继续查看下一条吗?
","确认",
MB_YESNO|MB_ICONQUESTION)==IDNO)
{break;//中断查询,跳出循环}}}
people.Close();
db.Close();}}
5.增加按钮
voidCAddressListDlg:
:
OnButtonAppend()
{//输入合法
if(CheckInputInfo())
{//取得当前选定组
intnGroupId=GetCurrentSelGroupId();
//取得界面数据
INTERFACECTRLDATAinterfaceCtrlData;
SwitchData(interfaceCtrlData,false);
CDatabasedatabase;
database.Open(_T("address"));
//生成插入指令
CStringstrSql;
if(nGroupId==-1)
{CStringstrFormat="INSERTINTOpeople(fullName,sex,company,\
phoneInCompany,homeAddress,phineInHome,mobile,mail,qq,\
msn,memory)VALUES('%s',%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s')";
strSql.Format(strFormat,
interfaceCtrlData.strName,
………………………….,
interfaceCtrlData.strMemory);}else
{CStringstrFormat="INSERTINTOpeople(groupId,fullName,sex,company,\
phoneInCompany,homeAddress,phineInHome,mobile,mail,qq,\
msn,memory)VALUES(%d,'%s',%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s')";
…………………………}
//执行插入
database.ExecuteSQL(strSql);
database.Close();
//清空界面显示
INTERFACECTRLDATAtemp;
SwitchData(temp,true);
RefurTree();//刷新Tree}}
/*检查界面输入数据*/
boolCAddressListDlg:
:
CheckInputInfo()
{//取得界面数据
INTERFACECTRLDATAinterfaceCtrlData;
SwitchData(interfaceCtrlData,false);
//姓名
if(interfaceCtrlData.strName.IsEmpty()
||interfaceCtrlData.strName.GetLength()==0)
{MessageBox("请输入姓名!
","警告",MB_OK|MB_ICONWARNING);
returnfalse;}
………………
//MSN
if(interfaceCtrlData.strMsn.GetLength()>0)
{bInputFlag=true;
returnbInputFlag;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 课程设计报告 课程设计 报告