您的位置:首页 > 其它

C++面向对象课程设计 通信录

2010-10-02 23:25 309 查看
通讯录软件工具》
一、题目简介
   利用 Microsoft Visual C++ 软件工具设计一个通讯录软件。
通讯录是我们日常生活中经常用到的抽象通讯管理工具,用其自身的功能给人们带来通讯的方便。在本次的课程设计中我利用 Microsoft Visual C++ 软件工具设计这个工具。本工具实现了通讯录的添加、修改、删除 , 排序及查询功能。界面的列表框能显示本程序保存的全部名单 , 单击列表中的每一条记录能立即更新显示该记录的全部信息。在浏览状态下不能对人员信息进行修改。添加新记录,可向数据库添加记录并保存。修改当前记录,能够修改除此记录的信息。删除当前记录,删除记录之前提供确认信息。供有排序功能,即程序能够按照“姓名”、“关系”进行排序。当然少不了查询功能 , 此程序提供了两种不同的查询方式 , 可列出满足条件的人员名单。设计界面直观、实用 , 容易操作 .

二、系统概述
1. 系统介绍:
此通讯录是用 Microsoft Visual C++ 设计的 , 利用 ODBC 连接数据库 ,, 通过此工具可对数据库可靠读取 , 修改 , 筛选 , 录入 , 保存等操作 , 可对编译通过后 , 生成可执行文件 , 执行此程序可对人员信息进行管理.

2. 系统功能:

ü 流程图
无法显示
ü 具体实现
1) 显示所有已记录的资料:打开程序可看到一个列表, 表中记录了数据库中现在的所有记录。
2) 显示某个记录的详细资料:某人记录的记录除了可以在列表中看得到, 但为了直观, 也可点击列表中的某一条记录, 即可在界面上看到所指向的记录的具体资料.

3) 修改当前记录:当 用户点击了” 修改当前记录” 的按钮后, 会弹出一个新的对话框, 进行当前记录的数据的修改, 修改完之后, 点击确定即可把修改后的数据保存在数据库中.

4) 删除记录: 点击了” 删除当前记录” 的按钮, 会弹出一个对话框, 确认要删除当前记录, 点击确定后, 便可删除被选中的记录.

5) 添加记录: 点击了” 删除当前记录” 的按钮, 弹出一个新的对话框, 用户按照姓名、电话、手机、QQ 、电子邮件地址、地址、备注的顺序录入,输完之后, 点击确定即可把数据直接录入数据库中.

6) 查询记录 本程序可通过姓名和关系两种途径来查询资料。点击了“查找”的按钮,会弹出一个新的对话框,提示用户选择哪种方式进行查询,选择完后确定,便可对数据库里的记录进行查找,若找不符合要求的记录,则提示“找不到该记录”,并返回主界面,若找到相符合的记录,则把相关的记录显示在主界面的列表中。

7) 排序:为了列表的直观,方便查找,本程序利用了数据库的筛选功能实现了排序的功能,并且提供了两种不同的排序方式,一是按姓名,二是按关系。点击“排序”按钮后,便弹出一个新的对话框,提供用户选择排序的方式,点击确定后,程序使全对数据库里的记录进行排序,并把排序后的记录重新载入到列表中。

8) 其它功能,本程序除了可利用按钮进行操作之外,也提供了多种操作方式,如菜单操作,工具条操作,例如,当你想添加记录时,除了可以点击“添加记录”按钮外,还可以点击菜单栏的“操作——> 添加记录”。想滚动查看记录,可利用程序上方的工具条进行操作。

9) 退出系统 想退出本程序时,直接点击关闭即可,不需要再保存,因为对用户的操作与数据库更新是同步的。


三、系统设计

基础类为 CRecordset( 记录集类 ) , CRecordView( 记录视图类 ) CMySet , CMyView
它们之间的关系如下图
无法显示
视图类为 CMyView 对话框类有 CDialogAdd , CFindDialog DialogOrd ,他们的关系如下图:
无法显示

四、关键技术
1. CDatabase
要建立与数据源的连接,首先应构造一个 CDatabase 对象,然后再调用 CDatabase 的 Open 成员函数. Open 函数负责建立连接 . 要从一个数据源中脱离,可调用函数 Close 。在脱离后,可以再次调用 Open 函数来建立一个新的连接.调用 IsOpen 可判断当前是否有一个连接,调用 GetConnect 可返回当前的连接字符串。
2. CMySet
CMySet 是从 CRecordset 派生出来的一个类,继承其父类的一些基本功能,CRecordset 类代表一个记录集.该类是MFC 的ODBC 类中最重要、功能最强大的类。
变量:
m_strFilter // 记录的过滤变量
m_strSort // 记录的排序变量
long m_ID;
CString m_column1; // 姓名
CString m_column2; // 关系
CString m_column3; // 电话
CString m_column4; // 手机
CString m_column5; // 地址
CString m_QQ; //QQ
CString m_Email; // 电子邮箱
CString m_column6; // 备注

函数说明:
void MoveNext( ); // 后退一个记录(由 CRecordset 继承)
void MovePrev( ); // 前进一个记录(由 CRecordset 继承)
void MoveFirst( ); // 滚动到记录集中的第一个记录(由 CRecordset 继承)
void MoveLast( ); // 滚动到记录集中的最后一个记录(由 CRecordset 继承) int GetMaxID() // 获得数据库里的记录数(自定义)

3. CMyView
CMyView 是从 CRecordView 派生出来的一个类,继承了父类的基本功能, CRecordView (记录视图)是 CFormView 的派生类,它提供了一个表单视图来显示当前记录.一个典型的记录视图,用户可以通过表单视图显示当前记录.通过记录视图,可以修改、添加和删除数据.
变量
CListCtrl m_ListCtrl; 列表控件对象
CMySet* m_pSet; 记录集指针

函数说明:
void OnRecordNew(); // 向数据库添加新记录
void OnOrdName(); // 对数据库里的记录按姓名排序
void OnOrdRelation(); // 对数据库里的记录按关系排序
void OnFindName(); // 按姓名查找记录
void OnFindRelation(); // 按关系查找记录
void OnButtonAdd(); // 添加新的记录
void OnButtonAll(); // 在主窗口的列表显示全部记录
void OnClickListctrl(NMHDR* pNMHDR, LRESULT* pResult); // 获得所点击的列表项的指向位置
void OnButtonDelete(); // 删除当前的记录
void OnButtonModify(); // 修改当当前的记录
void OnButtonFind(); // 查找记录
void OnButtonOrd(); // 对记录进行排序
int Show(); // 把数据库里的记录显示在主窗口的列表当中

4. Record
这是一个记录类,用来储存某一用户的资料,并对其属性进行操作
变量:
CString m_name; // 姓名
CString m_relation; // 关系
CString m_tel; // 电话
CString m_cell; // 手机
CString m_address; // 地址
CString m_qq; //QQ
CString m_email; // 电子邮箱
CString m_ps; // 备注
函数说明:
CString GetName(); // 获取姓名
CString GetRelation(); // 获取关系
CString GetTel(); // 获取电话
CString GetCell(); // 获取手机
CString GetAddress(); // 获取地址
CString GetQQ(); // 获取 QQ
CString GetEmail(); // 获取电子邮箱
CString GetPs(); // 获取备注
void Register(CString name,CString ,CString relation,CString tel,CString cell,CString address,CString qq,CString email,CString ps); // 向记录储存资料
五、效果及存在问题
1 、运行效果:

l 主界面如下图:



l 点击“修改当前记录”,弹出一个新的对象框,修改后按确定,如下图所示:



l 点击“删除当前记录”,提示用户是否删除当前记录:



l 点击“添加记录”,弹出一个新的对话框,进行输入,如下图所示:



l 点击“查找”,会提示按哪种方式查找:



如选择输入“朋友”后,显示结果如下图:



选择“姓名”的查找方式,输入“张龙江”后,显示结果如下图:



l 点击“排序”,提示选择排序的方式,进行排序,如下图所示:



选择“按名字排序”,显示结果如是下:



选择“按关系排序”,显示结果如下:



2 、不足:
我们本来是利用主对话框来构建程序的,但最终由于技术上的一些问题,我们最终还是选择了单文档视图( SDI )来构建程序。数据库的链接方式有两种—— ODBC 和 DAO , DAO 比 ODBC 的功能更好,便由于考虑到 DAO 在实现方面相对较难,我们最终选择了 ODBC ,但如果使用 DAO 技术的话,相信我们的程序可以做得更完善,功能更齐全,以后两点都是我们的课程设计的一些小小不足,我相信通过改进之后,我们可以做得更好。

六、心得体会
在上学期中,我们学习了面向对象这门课,了解了面向对象程序设计的基本思想,学习会了怎么利用 Microsoft Visual C++ 进行编程,为课程设得以顺利进行打下的良好的基础。 本次课程设计前前后后近半个月,我们从一开始的选题到现在的设计结束,从在课本上熟悉基本知识到到外面的相关图书中了解其他与设计通讯录有关的知识,我们不仅对课本的基本知识有了一定的掌握,还对其他方面的知识有所了解。
不过我们在设计的过程中也遇到过不少问题,我们选择了“通讯录软件工具”这个题目,题目要求利用数据库来储存数据,但我们在之前的课程都没涉及过数据库,所以我们要一切从零开始,去了解和理解数据库的使用。我们借了不少关于数据库编程的书籍,也充分利用了网络资源,我们熟悉了数据库链接的两种方式—— ODBC 与 DAO ,弄清楚了数据库的记录集与记录视图的相互关系。 所遇到的最大难题依然是数据库的编辑和链接及其代码的编写,不过通过一步一不的调试,慢慢地摸清了数据库编程的设计思想,找到解决问题的办法。 这个过程中,我们学到了很多东西。
把通讯录的基本功能实现之后,但为了把程序做得更完善些,我们去了解列表控件的使用,在主界面上建立一个列表,把数据库里的记录显示在列表中,这些能使程序更加直观,实用。最后我们也利用了 SkinMagic 工具为程序添加窗口皮肤,使程序更加美观。
因为课程设计安排在寒假,我们都各自在自己的家中,这给我们课程设计带来来了一定的阻碍,但通过我们的积极协调与合作,克服了种种困难,最终使课程设计顺利完成,这是我们团结合作的成果。

七、附录
************************ CMySe ****************************************

long CMySet::GetMaxID() // 获得数据库里的记录数(自定义)
{
MoveLast();
return m_ID;
}

****************** *** * CMyView ********************************************

void CMyView::OnButtonModify() // 修改当当前的记录
{
// TODO: Add your control notification handler code here
CDialogAdd dlg;
dlg.m_name=m_pSet->m_column1; // 把对话框的变量与记录的变量对应起来
dlg.m_relation=m_pSet->m_column2;
dlg.m_tel=m_pSet->m_column3;
dlg.m_cell=m_pSet->m_column4;
dlg.m_address=m_pSet->m_column5;
dlg.m_qq=m_pSet->m_QQ;
dlg.m_email=m_pSet->m_Email;
dlg.m_ps=m_pSet->m_column6;
if( dlg.DoModal()==IDOK)
{

m_pSet->Edit(); // 对数据进行修改操作
// 赋值
m_pSet->m_column1=dlg.m_name;
m_pSet->m_column2=dlg.m_relation;
m_pSet->m_column3=dlg.m_tel;
m_pSet->m_column4=dlg.m_cell;
m_pSet->m_column5=dlg.m_address;
m_pSet->m_QQ=dlg.m_qq;
m_pSet->m_Email=dlg.m_email;
m_pSet->m_column6=dlg.m_ps;
m_pSet->Update(); // 更新数据库
m_pSet->Requery();

UpdateData(FALSE); // 更新记录的数据显示

m_ListCtrl.DeleteAllItems();
this->Show();

}

} void CMyView::OnButtonDelete() // 删除当前的记录
{
// TODO: Add your control notification handler code here
// 确认用户要删除这个记录
if(MessageBox(" 真的要删除该记录吗? "," 删除记录 ",MB_YESNO|MB_ICONQUESTION)==IDYES)
{
m_pSet->Delete(); // 删除当前所指向的记录
// 移动到上一条记录
m_pSet->MovePrev();
UpdateData(FALSE); // 更新数据

m_ListCtrl.DeleteAllItems(); // 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中
}

}

void CMyView::OnButtonAdd() // 添加新的记录
{
// TODO: Add your control notification handler code here
CDialogAdd dlg; // 新建一个对话框提示输入
if( dlg.DoModal()==IDOK)
{

long m_lNewID=m_pSet->GetMaxID()+1;
m_pSet->AddNew(); // 为数据库准备添加新的记录
m_pSet->m_ID =m_lNewID;
m_pSet->m_column1=dlg.m_name;
m_pSet->m_column2=dlg.m_relation;
m_pSet->m_column3=dlg.m_tel;
m_pSet->m_column4=dlg.m_cell;
m_pSet->m_column5=dlg.m_address;
m_pSet->m_QQ=dlg.m_qq;
m_pSet->m_Email=dlg.m_email;
m_pSet->m_column6=dlg.m_ps;
m_pSet->Update();
m_pSet->Requery();
m_pSet->MoveLast();
UpdateData(FALSE); // 更新数据

m_ListCtrl.DeleteAllItems(); // 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中

}

}

void CMyView::OnFindName() // 按姓名查找记录
{
// TODO: Add your command handler code here
// TODO: Add your command handler code here
CFindDialog dlg; // 新建一个对话框,提示输入查找的内容
dlg.m_key=" 姓名: ";
CString str=" 姓名 ";
int result=dlg.DoModal();
if(result==IDOK)
{
str=str+"='"+dlg.m_keyval +"'";

m_pSet->Close(); // 关闭数据库
m_pSet->m_strFilter=str; // 筛选符合要求的数据记录
m_pSet->Open(); // 重新打开数据库
int recCount=m_pSet->GetRecordCount(); // 获取数据库里的记录数
if(recCount==0)
{
MessageBox(" 没有匹配的记录! "," 查找 ", MB_ICONWARNING);
m_pSet->Close();
m_pSet->m_strFilter="";
m_pSet->Open();
}
else
{
UpdateData(FALSE);
m_ListCtrl.DeleteAllItems();// 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中
}

}

}

void CMyView::OnFindRelation() // 按关系查找记录
{
// TODO: Add your command handler code here
CFindDialog dlg; // 新建一个对话框,提示输入要查找的内容
dlg.m_key=" 关系: ";
CString str=" 关系 ";
int result=dlg.DoModal();
if(result==IDOK)
{
str=str+"='"+dlg.m_keyval +"'";

m_pSet->Close();
m_pSet->m_strFilter=str; // 筛选符合要求的记录
m_pSet->Open(); // 重新打开数据库
int recCount=m_pSet->GetRecordCount(); // 获得数据库里的记录数
if(recCount==0)
{MessageBox(" 没有匹配的记录! "," 查找 ", MB_ICONWARNING);
m_pSet->Close();
m_pSet->m_strFilter="";
m_pSet->Open(); // 重新打开数据库
}
else
{
UpdateData(FALSE);
m_ListCtrl.DeleteAllItems(); // 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中
}
}
}
void CMyView::OnOrdName() // 对数据库里的记录按姓名排序
{
// TODO: Add your command handler code here
// TODO: Add your command handler code here
m_pSet->Close();
m_pSet->m_strSort=" 姓名 "; // 对姓名进行排序
m_pSet->Open();
UpdateData(FALSE);
m_ListCtrl.DeleteAllItems(); // 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中

}

void CMyView::OnOrdRelation() // 对数据库里的记录按关系排序
{
// TODO: Add your command handler code here
m_pSet->Close();
m_pSet->m_strSort=" 关系 "; // 对关系进行排序
m_pSet->Open();
UpdateData(FALSE);
m_ListCtrl.DeleteAllItems(); // 删除列表中的所有数据记录
this->Show(); // 把更新的数据记录显示在列表中

}

void CMyView::OnClickListctrl(NMHDR* pNMHDR, LRESULT* pResult) // 获得所点击的列表项的指向位置
{
// TODO: Add your control notification handler code here
POSITION tPos=m_ListCtrl.GetFirstSelectedItemPosition(); // 获得当前鼠标所指向的位置
int nItem = m_ListCtrl.GetNextSelectedItem(tPos);
m_pSet->SetAbsolutePosition(nItem+1);
UpdateData(FALSE);
*pResult = 0;
}

nt CMyView::Show() // 在主窗口的列表显示全部记录
{
int i=0;
m_pSet->MoveFirst();
do
{
CString s;
s=m_pSet->m_column1; // 使列表与数据库对应起来
m_ListCtrl.InsertItem(i,s,0);

m_ListCtrl.SetItemText(i,1,m_pSet->m_column2);

s=m_pSet->m_column3;
m_ListCtrl.SetItemText(i,2,s);

s=m_pSet->m_column4;
m_ListCtrl.SetItemText(i,3,s);

s=m_pSet->m_column5;
m_ListCtrl.SetItemText(i,4,s);

s=m_pSet->m_QQ;
m_ListCtrl.SetItemText(i,5,s);

s=m_pSet->m_Email;
m_ListCtrl.SetItemText(i,6,s);

s=m_pSet->m_column6;
m_ListCtrl.SetItemText(i,7,s);

i++;
m_pSet->MoveNext();

} while(!m_pSet->IsEOF());
m_pSet->MoveFirst();
return i;
}

void CMyView::OnButtonAll() // 在列表中更新显示数据库里的所有记录
{
// TODO: Add your control notification handler code here
m_ListCtrl.DeleteAllItems();
m_pSet->Close();
m_pSet->m_strFilter="";
m_pSet->Open();
this->Show(); // 更新列表

}

****************Record ********************************************

Record::Record()
{
m_name=" ";
m_relation=" ";
m_tel=" ";
m_cell=" ";
m_address=" ";
m_qq=" ";
m_email=" ";
m_ps=" ";

}

Record::~Record()
{

}

CString Record::GetName()
{
return m_name;
}
CString Record::GetRelation()
{
return m_relation;
}
CString Record::GetTel()
{
return m_tel;
}
CString Record::GetCell()
{
return m_cell;
}
CString Record::GetAddress()
{
return m_address;
}
CString Record::GetQQ()
{
return m_qq;
}
CString Record::GetEmail()
{
return m_email;
}
CString Record::GetPs()
{
return m_ps;
}
void Record::Register(CString name,CString ,CString relation,CString tel,CString cell,CString address,CString qq,CString email,CString ps)
{
name=m_name;
relation=m_relation;
tel=m_tel;
cell=m_cell;
address=m_address;
qq=m_qq;
email=m_email;
ps=m_ps;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: