




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕 业 设 计(论 文)题 目 通讯录管理系统的设计与实现 摘 要随着交通的发展以及通信的发展,人们之间的距离越来越近了,范围也越来越大了,联系也越来越紧密了,这就迫切要求我们把所有人的联系方式统一管理起来,为此,本设计就为用户提供了一个管理联系方式的方法。本通讯录管理系统是用计算机管理电子通讯录的一种计算机应用技术的创新,在计算机还未普及之前通讯管理都是由联系人采用名片,笔录手工记帐的方式来操作的.现在的通讯录管理普遍都是采用计算机作为工具,通讯录管理程序来帮助人们进行更有效的通讯录信息管理;通讯录管理系统是典型的信息管理系统(IMS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面;对于前者要求建立起数据一致性和完整性强及安全性好的库;而对于后者则要求应用程序功能完备,易使用等特点;本系统将改变人类生活中关于通讯录管理这一块,使人们搜索联系方式更方便,此系统会更加促进人们之间的关系往友好方向发展。关键词:通讯录 ; 计算机应用技术 ; 数据库 ; IMS ; 程序AbstractAs the progress of transportation and communication,the distance between people is becoming nearer and nearer, the activity area of people is becoming wider and wider, and the contact is becoming more and more close.Therefore it pressing for us to manage all of the peoples contact information concentrately.Based on this point,this design provides a method to administrate contact information for users. Its a innovation in Computer Application Technology(CAT) for our contact management system to use the computer management of the electronic address book.Before the popularisation of computer, people often operate their name card by writing.Today, its common that computer as tools and address book program as medium for people making a better management of contact information.Contact management system ,the exploitation of which mainly includes two aspects of building and maintenance of background database and development of front application, is a typical Information Management System.Demand to setup consistency of the data and database with strong integrality and with good security as to the former;For the latter,the perfect function and easy using is needed.Our system will change the way people manage address book in their life,give them a more convenient avenue to contact others,promote a more friendly relationship between them.Key words:Contact management system ; CAT ; Database ; IMS ; Program目录摘要IAbstractII目录III1 绪论11.1 课题的研究背景11.2 课题的研究现状12 系统中的主要技术33 系统分析与设计53.1 需求分析53.2 模块设计63.3 数据库设计63.3.1数据表设计63.3.2 设计参照完整性规则113.4 创建表记录集类133.4.1 建立ODBC数据源133.4.2 扩展记录集类144 系统的实现174.1 主窗口设计174.1.1 主窗口信息显示174.1.2 查询联系人信息234.1.3 追加新的联系人信息244.1.4 修改联系人信息264.1.5 删除联系人信息274.1.6 追加联系人组274.1.7 删除联系人组294.1.8 修改密码314.1.9 更改组名314.2 登录界面设计324.2.1 登录模块实现324.2.2 注册模块实现344.2.3 密码找回模块实现365 总结和展望38致谢39参考文献40附录411 绪论1.1 课题的研究背景随着网络及现代通信技术的发展,人们之间的联系越来越便捷,这也使得同时与许多人保持联系成为可能,而单纯依靠人脑已经很难记住所有人的联系方式。对于存储电话号码到手机上的方式,比较方便,随时随地可以联系,不过只能通过电话联系,没有记录其他的联系方式,如果手机丢了可能就谁也联系不上了;对于记录电话等信息到本子上的方式,第一也可能丢失本子,第二是查找起来比较困难,需要人工查找,而且更新时不容易,需要涂改以前记录的信息,第三格式比较死板,不利于跟随用户的需求扩展;对于用名片夹存放名片的形式也是查找起来不方便,有丢失的危险;对于记录到WORD文档或打印出来的,也是扩展性不强,查找起来不方便。因此,以软件形式实现的通讯录成为了许多人保持联系方式的首选。本通讯录将极有普通通讯录的主要功能,它可以对联系人进行分组,并可以添加或删除组,也可以添加或删除联系人,或者对已经保存的联系人信息进行修改,查询功能也是必不可少的。1.2 课题的研究现状通讯录管理系统是每一个用户管理通讯录的不可缺少的一个管理信息系统,它的内容对于用户的管理者来说是至关重要的,所以通讯录管理系统应该能够为每一个用户的管理者提供充足的信息和快捷的查询手段,大大的方便用户合理的管理通讯录。 随着科学技术的不断提高,计算机科学日渐成熟,网上通讯工具的迅速发展,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。 作为计算机应用的一部分,使用计算机对通讯录进行管理,具有着手工管理所无法比拟的优点,如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高通讯录管理的效率,也是用户理财的科学化、正规化管理,与先进科学技术接轨的重要条件。 因此,开发这样一套管理软件成为很有必要的事情,对于我们即将计算机专业毕业的学员来说,也是一次将计算机应用于现实管理的一次很有意义的实践活动。2 系统中的主要技术本系统使用Microsoft的VS2008作为开发工具,SQL Server 2005作为数据库。程序主界面采用基于对话框技术,具体实现使用MFC数据库类及ODBC访问数据库。下面列出以浏览器为基础和以客户端为基础的应用程序技术的对比:1、 以浏览器为基础的应用程序的优缺点(1) 易于安装:可以用于许多桌面型计算机,并且与用户使用的操作系统平台无关,只要其安装浏览器就能运行程序。(2) 易于部署与维护:只需要在服务器端进行部署和维护工作。(3) 必须联网操作:工作效率和网络是否延迟有关。(4) 不能充分利用客户端计算机的资源:只能通过有限的HTML语言来呈现用户界面,没有利用客户端计算机的计算处理能力。只能利用浏览器的打印功能来打印资料,不适用于企业的报表打印。(5) 网络传输量大:由于客户端不能保存状态数据,因此必须在客户端和服务器之间传输用户界面内容以及所需的数据。(6) 安全性较低。对于服务器来说可以通过防火墙软件来过滤数据,因为所有传输内容都是基于HTTP端口。但很难对数据进行加密和签名以保证在传输过程中的完整性。(7) 适合电子商务或不要求严格控制客户端的应用程序。2、 客户端应用程序的优缺点(1) 充分利用客户端计算机的资源:可以为用户提供丰富的界面元素,可以存取本机磁盘与本机应用程序接口,执行速度较快。(2) 网络传输量较小:只需在客户端和服务器之间传输数据。(3) 安全性较高:可以方便的在客户端和服务器执行加密和解密操作。(4) 安装、部署和维护工作较为繁琐:对客户端计算机在操作平台和附加软件上有一定的限制和要求。(5) 可以离线工作:前提是本地必须有缓存数据的能力,这涉及到与服务器数据同步的问题。(6) 适合企业内部应用程序。3 系统分析与设计3.1 需求分析开发软件首先要进行的就是需求分析,通常这一步需要与客户进行广泛的交流,对于一个复杂一些的系统,可能需要与客户进行数次会议,甚至需要需求分析人员在客户处调查数月。对于本通讯录系统,我们可以先将自己作为通讯录的使用者,从自己的角度来考察需求(在真正的项目中,这一点是十分忌讳的,需求分析人员可以帮助,诱导客户说出他的需求,而绝不能从自己的角度替客户提出需求)。很显然,一个普通的通讯录系统,最基本的功能是记录一个联系人的信息,那么,联系人的信息需要有哪些呢?这是一个在需求分析中要特别注意的问题,一般而言,通讯录使用者可能需要的信息有以下这些:姓名、性别、工作单位、办公电话、住址、住宅电话、手机、邮箱、QQ、MSN、其他备注信息。这样开发者了解了需要保存的每个联系人的基本信息有哪些,同时,应当注意到,不是每一位联系人都有工作单位,也不是每一位联系人都有手机或者QQ。因此,除了姓名与性别外,其他信息都可以是空的,但既然是通讯录,其中也至应当记录该联系人的一项联系信息,所以,对上述信息记录时的要求应当为:姓名与性别是必需的,其他所有信息至少有一项不为空。与记录联系人信息相关的操作很容易联想到有增加联系人、删除联系人和对联系人信息进行更新3钟。所以对联系人的操作的需求归纳为以下3点:增加新的联系人、删除已存在的联系人、修改已存在的联系人的信息。软件形式的通讯录与传统纸面形式的通讯录比较起来,可以实现更为方便、有效的管理。为了便于查看及使用,通常通讯录需要对联系人进行分组管理,这又成为一个新的需求挖掘点。基于实例的简单性考虑,对于组操作假定仅有以下需求:组增加、组删除、组改名。对于组的操作还有一个细节性的问题,有时候有些联系人可能不会被归属于任何组,此时,该联系人会被归入“未分组”这个组。也就是说,“未分组”本身也需要成为一个组,而且,它不应当可以被删除。另外,为了避免所有人打开电脑都能随意查看机主的通讯录,本系统还应设置一个登录界面,即拥有机主的用户名和密码才能进入系统。而作为通讯录的拥有者,同时还会拥有一个数据库,可以方便的进行用户名的添加功能。同时登录界面也可以进行用户的注册,但是只有在拥有机主的密码才能注册成功。另外,注册成功的用户,如果忘记了密码,也可以通过找回密码功能找回自己的密码。3.2 模块设计从模块的角度来说,并没有刻意地进行模块的划分,相关的操作是集中在一起进行处理的。从类的角度来说,可以将系统分为登录窗口、注册窗口、找回密码窗口、主窗口、查询窗口,追加组窗口及数据库表记录集映射类几个模块。它们之间的关系如图3-1所示。通讯录管理系统信息管理系统管理查询系统用户管理退出系统信息维护信息录入修改密码关键字查询姓名查询图 3-1 模块划分及模块之间的关系3.3 数据库设计3.3.1数据表设计数据库应用系统的核心毫无疑问是存储在数据库中的数据。而要合理有效地存储数据,有赖于设计一个结构良好的数据库结构。同时,对于一些比较重要的系统,可能还需要考虑到备份、同步等问题。因此,一个系统选用何种数据库是要综合权衡各方面因素之后才能决定的。而对于通讯录而言,它主要应用于桌面,因此没有数据同步的要求,数据量也很小,备份工作也不需要经常地进行。所以,可以考虑用SQL Server 2005数据库作为存储手段。得到上面的数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。这些实体包括各种具体信息,通过相互之间的作用形成数据的流动。图3-2为用户实体E-R图;图3-3为联系人实体E-R图;图3-4为分组实体E-R图用户用户名密码注册找回密码图 3-2 用户实体E-R图联系人ID所属组ID姓名性别工作单位办公电话住址MSN邮箱住宅电话手机QQ备注图3-3 联系人实体E-R图分组组ID组名图3-4 分组实体E-R图在确定的使用数据库的类型之后,就可以对数据库进行详细的设计了。针对需求分析,现在已经知道需要保存的信息主要包含三个方面,即登录信息、组信息和联系人信息。在设计数据库时一般会遵循“一事一地”的原则,也就是说,一类实体存储于一张表中,一张表中也仅表示一类实体。根据这个原则,数据库中应当存在三张表,它们分别用来存储信息和联系人信息,它们的表结构如表3-1、表3-2和表3-3所示。表 3-1 组信息表groupInfo 结构字段含义类型长度默认值NULL/主键id组idint主键/自增groupName组名varchar20表3-2 用户登录信息表 user 结构字段含义类型长度默认值NULL/主键username用户名varchar50不允许空pwd密码varchar20不允许空answer密保答案varchar255question密保问题varchar255表 3-3 联系人信息表 people 结构字段含义类型长度默认值NULL/主键idIDint主键/自增groupId所属组IDint1外键fullName姓名varchar50sex性别是/否company工作单位varchar255phoneInCompany办公电话varchar15homeAddress住址varchar255phoneInhome住宅电话varchar15mobile手机varchar15mail邮箱varchar50qqQQvarchar15msnMSNvarchar50memory备注varchar255在以数据库为核心的程序中,数据库设计的重要性不言而喻。如果设计不合理,不仅操作数据比较麻烦,增加应用程序设计人员的工作量,数据库的性能也会受到影响。通过进行正规化的表格设计,可以令数据库具有可读性和扩展性,同时也会提升应用的性能。正规化就是在设计表格时,消除冗余性和不协调的从属关系的过程。本次数据库设计中,在表people中并没有直接保存组名信息,而只是保存了一个组的ID号,这实际上是遵循数据库规范化设计原则的结果。概念设计完成后就可以在SQL SERVER 2005里面进行表的设计了。图3-3为groupInfo表;图 3-4为people表;图3-5为user表图 3-3 groupInfo表的设计图 3-4 people表的设计图 3-5 user表的设计在需求分析阶段,已经明确指出“未分组”是不可以被删除的,也就是说,它应是系统固有的,而且,为了便于编程,“未分组”的组ID希望被设定为1,而字段id被设计为自增的字段。因此,表groupInfo建立完成后,应首先手工在其中输入组名“未分组”,以便其对应的id为1。3.3.2 设计参照完整性规则使用数据库存储数据与使用普通文件存储数据有一个区别是,在数据库中不仅可以存储数据,还可以保存数据之间的关系,这是数据库与普通数据文件之间的一个本质区别。在数据库中保证数据的完整性可以从实体完整性、域完整性及参照完整性三个方面入手。前两者是在表中完成的完整性规则,而参照完整性则正式通过表之间的关系来实现的。所谓参照完整性是指当插入、删除或修改一个表中的数据时,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确。所以关系对于保证数据的完整性有着非常重要的作用。在本实例中,数据库中的关系主要是表people中的字段groupId对应于表groupInfo的字段id,换句话说,表groupInfo的主键是字段id,表people的外键是字段groupId。在SQL SERVER 2005中,建立关系的步骤如下: 启动SQL SERVER,打开数据库address。 在菜单栏选择“表设计器”-“关系”,此时将显示关系窗口,如图3-6所示。图 3-6 外键关系对话框用鼠标选中左边的FK_people_people之后,点击右边的“表和列规范”,可以看到子分支下有四个选项:外键基表,外键列,主/唯一键基表,主/唯一键列。点击右边的“”,就会出现表和列对话框,如图3-7所示。图 3-7 表和列对话框在这里面就可以选择主外键关系。另外为了实行参照完整性,在外键关系对话框中的右边,还要将INSERT和UPDATA规范中的“更新规则”和“删除规则”选为“层叠”。默认情况下是“无操作”,这样就起不到级联的作用了。如图3-8所示。图 3-8 设定关系“更新规则”是指当表groupInfo中字段id的值发生变化时,表people中字段groupId的对应值也自动跟随变化。这样可以不因表groupInfo中字段id值的变化而丢失了原先在两张表中存在关系的数据。“删除规则”是指当删除表groupInfo中的某一条记录时,表people的字段groupId与表groupInfo被删除记录字段id值相同的记录也将被删除。使用“删除规则”可以确保每一个联系人都属于一个特定组,这样可以避免在表people中字段groupId的值在表groupInfo中找不到的情况。3.4 创建表记录集类3.4.1 建立ODBC数据源在MFC中创建记录集类时需要用到ODBC数据源,因此需要先为通讯录数据库设定ODBC数据源,其具体创建步骤如下: 进入“控制面板”,然后选择进入“系统和安全”。 在“系统和安全”窗口进入“管理工具”。 进入“管理工具”窗口之后,双击“数据源(ODBC)”。 在弹出的“ODBC数据源管理器”窗口中先选择“系统DNS”选项卡,然后单击“添加”按钮。 创建新数据源首先要选择数据源的驱动程序,通讯录的数据库采用SQL,因此,此处选择“SQL Server”,然后单击“完成按钮”。如图3-9所示。 在随后弹出的“创建到 SQL Server 的新数据源”对话框中将“名称”设定为“address”,“服务器”从下拉表中选择自己正在使用的SQL服务器。点击下一步继续。 接下来会弹出一个SQL Server验证登录ID的真伪对话框,此处选择“使用网络登录ID的Windows NT 验证”,继续下一步。 这时会让我们选择默认数据库,我们从下拉表中找到此前建立的数据库address,然后单击下一步。 最后一步默认系统的设定,直接单击“完成”。这样,“ODBC”数据源管理器的“系统DNS”选项卡中将出现新设定的数据源address。至此,ODBC数据源设定完成。图 3-9 选择数据源驱动程序3.4.2 扩展记录集类在设定完ODBC数据源后,就可以在程序中利用它自动生成与数据表相关联的记录集类了,其实现的具体步骤如下: 选择菜单“视图”-“类视图”,右键单击“Addresslist”,在弹出菜单中选择“添加”-“类”。如图3-10所示。图 3-10 添加类 此时将会显示一个如图3-11所示的对话框,此时我们在左侧选择“MFC”,右侧选择“MFC ODBC使用者”,单击添加。图 3-11 添加MFC ODBC类 随后将弹出如图3-12所示的对话框,点击“数据源”,在“机器数据源”中选择“address”点击确定。此时会弹出一个SQL Server登录对话框,单击确定进行连接。图 3-12 选择数据源 连接成功之后会出现如图3-13所示的选择数据库对象的对话框,在这里我们选择groupInfo,然后单击确定按钮,随后MFC会自动生成类CGroupInfo的代码。图3-13 选择数据库对象 参考上述生成类CGroupInfo的步骤,生成记录集类CPeople和Cuser的代码。4 系统的实现4.1 主窗口设计4.1.1 主窗口信息显示本系统采用了以对话框为主体的界面方案,在建立了程序框架及扩展了相关记录集后就可以开始进行具体功能上的实现了。通讯录最重要的功能便是显示联系人信息,因此主窗口的主要功能也应当是查询及显示联系人信息。根据此前对系统需求的分析,联系人的信息应包含姓名、性别、工作单位、办公电话、住址、住宅电话、手机、邮箱、QQ、MSN及备注信息,联系人的分组列表则可以用树控件进行显示,所以主窗口中应显示上述全部信息。基于上述考虑,在资源视图中更改对话框(即ID为ID_ADDRESSLIST_DIALOG 的对话框)的大小并按图4-1所示添加相应控件。其中有一个树控件,然后是多个静态文本和编辑框,一个单选按钮,数个按钮用来实现增删改查的功能。图 4-1 主界面控件添加好了之后,分别对它们进行添加变量,具体方法如下: 右键单击某个控件,在弹出的菜单中选择“添加变量”。 此时会弹出一个对话框,在里面可以选择变量的类型和类别,然后输入变量名,最后单击完成按钮即可完成一个变量的添加。如图4-2所示。图 4-2 添加变量 重复上述步骤,添加其他变量。在上述步骤中定义的变量在MFC中是如何与相应的控件联系起来的呢?通过在类CAddressListDlg中找到函数DODataExchange,可以发现MFC正是在这个函数中为变量和控件建立了映射关系,其代码如下:void CAddressListDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAddressListDlg)DDX_Control(pDX, IDC_TREE_LIST, m_tree_list);DDX_Text(pDX, IDC_EDIT_ADDRESS, m_address);DDX_Text(pDX, IDC_EDIT_COMPANY, m_company);DDX_Text(pDX, IDC_EDIT_MAIL, m_mail);DDX_Text(pDX, IDC_EDIT_MEMORY, m_memory);DDX_Text(pDX, IDC_EDIT_MOBILE, m_mobile);DDX_Text(pDX, IDC_EDIT_MSN, m_msn);DDX_Text(pDX, IDC_EDIT_PHONEATHOME, m_phoneInHome);DDX_Text(pDX, IDC_EDIT_PHONEINCOMPANY, m_phoneInCompany);DDX_Text(pDX, IDC_EDIT_QQ, m_qq);DDX_Radio(pDX, IDC_RADIO_MAN, m_sex);DDX_Text(pDX, IDC_EDIT_NAME, m_name);/AFX_DATA_MAPDDX_Control(pDX, IDC_About, m_About);程序启动后,显示主窗口时需要对左侧的树控件进行初始化,它应显示当前系统中所有的分组及隶属于不同组的联系人成员。树控件初始化的工作由函数InitTreeList完成,它将在初始化函数OnInitDialog中被调用。函数InitTreeList首先调用树控件的DeleteAllItems方法清空控件中原有的项目,然后从数据库中查询组信息,并依次将组名插入到树控件中,在每插入一个组后,立即将隶属于该组的联系人添加到该组下。由MFC向导生成的记录集类在生成实例时需要传入一个CDatabase类型的引用参数,因此在使用类CGroupInfo及CPeople之前需要先构建CDatabase类的实例,然后将它的引用作为参数构建类CGroupInfo及CPeople的实例。在产生记录集的实例后(函数InitTreeList中的实例名分别为gi和people),将查询SQL语句传入其Open方法打开记录集,然后通过树控件的InsetItem方法将组名或联系人姓名作为树控件的一个条目插入,为了能够在控件中唯一地标识每一个组及联系人,还需要调用SetItemData方法将组ID或联系人ID绑定到控件中的相应条目上。在对数据库的操作方面,函数中还出现了记录集的MoveNext方法及数据库的Close方法,它们的作用分别是移动记录集指针到下一条记录,以及关闭当前数据库连接。InitTreeList()函数如下所示。void CAddressListDlg:InitTreeList()m_tree_list.DeleteAllItems(); CString strPeoPleQuery;strPeoPleQuery = SELECT * FROM groupInfo ORDER BY id DESC;CDatabase db1;CGroupInfo gi(&db1);gi.Open(AFX_DB_USE_DEFAULT_TYPE, strPeoPleQuery);while(!gi.IsEOF()HTREEITEM hGroup = m_tree_list.InsertItem(gi.m_groupName);m_tree_list.SetItemData(hGroup, gi.m_id);CString strPeoPleQuery;strPeoPleQuery.Format(SELECT * FROM people WHERE groupId = %d,gi.m_id);CDatabase db2;CPeople people(&db2);people.Open(AFX_DB_USE_DEFAULT_TYPE, strPeoPleQuery);HTREEITEM hPeople;while(!people.IsEOF()hPeople = m_tree_list.InsertItem(people.m_fullName, hGroup);m_tree_list.SetItemData(hPeople, people.m_id);people.MoveNext();db2.Close();gi.MoveNext();db1.Close();当用户在左侧的树控件中选中某一组时,程序将关闭此前展开的组而打开当前选中的组;而如果用户在左侧的树控件中选中的是一名联系人时,则在窗口右侧的区域中显示该联系人的详细信息。上述动作过程是以树控件的选择项改变响应函数OnSelchangedTreeList为核心完成的。1. 函数OnSelchangedTreeList要添加响应函数OnSelchangedTreeList,可以先切换到资源视图,然后选中主对话框左侧的树控件,并在其上点击鼠标右键,选中弹出菜单中的“属性”,此时将弹出属性窗口。在属性窗口中可以看到一个闪电的图标,把鼠标放在上面会有一个提示信息:控件事件。点击闪电图标,在下面的列表中找到TVN_SELCHANGED,单击和此事件相对应的右边空白处,会出现一个下拉列表:OnSelchangedTreeList。选择了之后VS2008将自动在程序中添加TVN_SELCHANGED事件的处理函数OnSelchangedTreeList,并在当前工作区中显示代码编辑窗口。函数OnSelchangedTreeList首先通过树控件的GetSelectdItem方法取得当前选择项,然后通过GetParentItem取得父节点。如果没有父节点,则表明其为组节点,否则表明其为联系人节点。如果是组节点,则应先通过函数CollapseTree收起当前所有展开项,然后通过Expand方法展开当前选中的组,最后通过SwitchData将此前显示的联系人信息清空,并将“更新”按钮禁用而将“增加”按钮启用。如果为联系人节点,则通过CPeople取得当前选定联系人信息,然后通过函数SwitchData将联系人信息显示于界面中,并将“更新”按钮启用而将“增加”按钮禁用。函数OnSelchangedTreeList部分代码如下: HTREEITEM hItem = 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);INTERFACECTRLDATA temp;SwitchData(temp, true);/ 清空联系人信息/ 更新按钮禁用GetDlgItem(IDC_BUTTON_EDIT)-EnableWindow(FALSE); / 增加按钮启用GetDlgItem(IDC_BUTTON_APPEND)-EnableWindow(TRUE); 2. 函数CollapseTree函数CollapseTree的功能是将所有展开的组收起,它实现的方式是首先取得树控件的第一项,也就是第一个组节点,并将其收起,然后依次取得其后继兄弟节点(即其他组节点)函数CollapseTree代码如下:void CAddressListDlg:CollapseTree()HTREEITEM htiItem = m_tree_list.GetRootItem();while(NULL != htiItem)m_tree_list.Expand(htiItem, TVE_COLLAPSE);htiItem = m_tree_list.GetNextSiblingItem(htiItem);3. 函数SwitchData在函数OnSelchangedTreeList中调用了SwitchData,其功能是将数据显示于窗口各控件或从窗口控件中取得当前输入的值,它的第一个参数为INTERFACECTRLDATA类型的引用,INTERFACECTRLDATA是在头文件AddressListDlg.h定义的结构体,其成员包含了联系人的各项信息,具体定义如下:typedef structCString strName;boolbSex;CString strCompany;CStringstrPhoneInCompany;CStringstrHomeAddress;CStringstrPhoneInHome;CStringstrMobile;CStringstrMail;CStringstrQq;CStringstrMsn;CStringstrMemory;INTERFACECTRLDATA;函数OnSelchangedTreeList的第二个参数是一个布尔型的参数,当它的值为逻辑真时,函数OnSelchangedTreeList将第一个参数中传入的联系人信息显示于窗口之上;而当它的值为假时,函数OnSelchangedTreeList则将当前窗体中各控件设定的值保存于第一个参数传入的INTERFACECTRLDATA结构体变量的各成员之中。函数SwitchData的部分代码如下:void CAddressListDlg:SwitchData(INTERFACECTRLDATA &info, bool flag)If (flag)/ 更新界面m_address = info.strHomeAddress;m_company = info.strCompany; else / 取数据UpdateData(TRUE);info.strHomeAddress = m_address;info.strHomeAddress.TrimLeft(); /删除数据前面的空格、换行符等info.strHomeAddress.TrimRight(); /消除从右侧起所遇到的所有空格字符4.1.2 查询联系人信息在通讯录中的联系人较多时,通过左侧的分组树进行联系人查找不是很方便,而且,有时候用户也记不清楚要查找的联系人被放人了哪个组之中,因此提供通过姓名进行查找的功能是必要的。在主窗口中单击“查询”按钮,将弹出一个输入姓名的对话框,然后程序通过设定的姓名在所有联系人中查找指定姓名的联系人。同样地,有时候用户可能不记得要查找的联系人的全名叫什么,只记得姓氏或者姓名中的某个字,这个时候模糊查询就起到作用了,只要在查询对话框中输入关键字,程序将会找到所有拥有此关键字的姓名。怎么样,是不是很方便?姓名查询对话框在实例中对应的类是CQueryPeopleDialog,它有一个公共数据成员m_peopleName,在对话框中设定的姓名就保存在这个成员变量中,然后主程序取得它的值后执行具体的查询工作。查询功能则是在主窗体类CAddressListDlg的函数OnOK中实现的(从函数名称可以知道,“查询”按钮是将“确认”按钮的标题更改之后实现的)。执行查询时,以用户输入的姓名为查询条件,并指定以组ID的降序、联系人ID升序返回查询结果,这样的排序安排可以在存在多个同名的联系人时,在界面左侧的树控件中由上而下地定位这些姓名相同的联系人。在存在符合指定姓名的情况下,函数从树控件最上面的组开始查找该联系人所在的位置,其定位依据是通过GetItemData方法取出存储在联系人节点中的联系人ID,如果查找到与当前查询记录相符的联系人,则让其处于当前选中状态。而如果存在有姓名相同的联系人,即对数据库的查询结果存在多条记录时,则还使用函数MessageBox弹出一个对话框询问用户是否要查看下一个联系人的信息。函数OnOK的部分代码如下: / 取得待查询联系人名CString strPeopleName = dlg.m_peopleName;/ 实现关键字查询CDatabase db;CPeople people(&db);CString checksql;checksql.Format(select * from people where fullName like %s% order by groupId desc,id,strPeopleName);people.Open(AFX_DB_USE_DEFAULT_TYPE,checksql);连接数据库要使用关键字查询的话,用format( select * from XX where username like %s% ,m_username); 其中,两个%在C中是作为一个%处理的。4.1.3 追加新的联系人信息在需要追加新的联系人信息时,需要先在左侧的树控件中选中准备将新联系人加入的组,此时界面上的各编辑框显示的信息将被清空,而“增加”按钮将变为可用状态,在各编辑框中输入新的联系人信息后单击“增加”按钮,即可将新的联系人加入到选定的组中。再选中组名时清空当前编辑框显示的信息,以及使得“增加”按钮可用是在时间响应重复。将新的联系人信息追加到数据库的功能是由“增加”按钮的事件响应函数OnButtonAppend完成的。函数OnButtonAppend首先调用函数CheckInPutInfo检查输入的新的联系人信息是否合法,如果通过检查,则先调用函数GetCurrentSelGroupId尝试取得当前选中的组的ID,然后调用函数SwitchData取得界面设定的新联系人信息,并根据是否成功取到组ID分别生成不同的INSERT插入语句。在取得组ID失败时,插入联系人信息时将不插入组ID信息,而根据数据库的设计,组ID将默认为“未分组”的ID。在生成SQL指令以后,通过CDatabase的ExecuteSQL方法执行它,而在将新的联系人插入到数据库之后,则先清空界面当前显示,然后调用函数RefurTree,以便及时将新添加的联系人也显示于左侧的树控件之中。当取得组ID失败时,默认将联系人信息添加到“未分组”里面去。函数OnButtonAppend部分代码如下:/ 生成插入指令CString strSql;If (nGroupId = -1) /取得组ID失败,即默认“未分组”CString strFormat = INSERT INTO people(fullName, sex, company, phoneInCompany, homeAddress, phoneInHome, mobile, mail, qq, msn, memory) VALUES(%s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s);strSql.Format(strFormat, interfaceCtrlData.strName,interfaceCtrlData.bSex,interfaceCtrlData.strCompany,interfaceCtrlData.strPhoneInCompany, interfaceCtrlData.strHomeAddress,interfaceCtrlData.strPhoneInHome,interfaceCtrlData.strMobile,interfaceCtrlData.strMail,interfaceCtrlData.strQq,interfaceCtrlData.strMsn,interfaceCtrlData.strMemory); 如果获取了组ID,则将联系人添加到该组,SQL语句应该加上一个groupId。在函数OnButtonAppend中调用的函数GetCurrentSelGroupId可以取得当前的组ID,如果当前选中项为组,则通过GetItemData直接取得其组ID;如果当前选中项为联系人,则先取得其父节点,即当前选中联系人所属的组节点,然后再取得其组ID。函数GetCurrentSelGroupId的部分代码如下:int CAddressListDlg:GetCurrentSelGroupId()int nGroupId = -1;HTREEITEM hSelItem = m_tree_list.GetSelectedItem();/ 取得当前选中项If
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酿造美酒的基础知识培训课件
- 诗词文言文对比阅读(解析版)-2026年中考语文复习试题(广东专用)
- 人教版八年级英语下册重点短语及专练(含答案)
- CN120193440A 一种改善纸张表面平滑度的湿端造纸工艺
- 人教版部编版语文九年级下册 第五单元测试及答案02
- 老人护理知识培训课件
- 2025宾馆客房租赁与设施租赁服务合同范本
- 2025版排水沟疏通与环保处理施工合同样本
- 2025年度外墙防水涂料施工与建筑防水质量监管合同
- 2025年城市综合体拆迁补偿及安置合同
- 培训行业的业务合同范本
- 汽车销售日常知识培训课件
- 2025广东广州市天河区人民武装部招聘民兵教练员5人备考题库及答案解析
- 科学版(2024)一年级全一册体育与健康全册教案
- 学前教育机构师资队伍薪酬激励与职业发展研究报告
- 小学朗读教学课件
- 患者身份识别管理标准WST840-2025学习解读课件
- 皮肤干细胞研究与应用
- 玄麦甘桔颗粒讲解
- 2024-2025学年广东省深圳高级中学高一(下)期末物理试题及答案
- 标准预防与隔离技术课件
评论
0/150
提交评论