中学教务管理软件本科毕业论文.doc_第1页
中学教务管理软件本科毕业论文.doc_第2页
中学教务管理软件本科毕业论文.doc_第3页
中学教务管理软件本科毕业论文.doc_第4页
中学教务管理软件本科毕业论文.doc_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高等教育自学考试计算机应用专业本科生毕业论文高等教育自学考试本科毕业论文(计算机应用专业)中学教务管理软件第50页毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名: 日期: 年 月 日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。涉密论文按学校规定处理。作者签名:日期: 年 月 日导师签名: 日期: 年 月 日摘 要本论文主要介绍了开发的系统所要完成的功能和开发的过程。重点说明了数据库的设计思想、程序的设计思想,以及设计中的重点、难点技术和解决方案。开发本系统时使用microsoft visual c+ 6.0作为开发平台,microsoft access2000作为数据库管理系统,使用microsoft data access objects 3.60(dao)访问数据库。系统主要完成学生信息,老师信息,考试信息的添加、删除、查询、浏览,考试成绩的分析(及格率,优秀率等的分析),以及用户管理等功能。其中查询功能可以分为模糊查询、精确查询等功能.用户管理功能分为添加,删除用户以及用户权限的授予和撤消。其中权限设计使用了较为灵活的方法为每一个菜单设置了使用权限,保存权限时只使用了一个长整数(32位)可保存多达32种权限,并且易于管理和判断。由于dao不能将数据库中的表或是查询直接显出来,所以设计系统时扩展了windows的两种基本控件-列表控件(clistctrl)和组合框控件(ccombobox),使它与dao记录集对象结合在一起完成数据的显示。由于列表控件是本系统的主要数据容器,所以给它加入了排序功能,用户只要点击列表表头就能对列表中任意一列进行升序降序排列,并且编程时只使用了两个函数。同时,对记录集也作了扩展,将数据库参照完整性维护的细节交给了记录集。通过对控件和记录集进行扩展后,只要用一两个方法就能构造出一个友好、实用的界面,并且数据库的操作也大大简化了。本系统的特点是界面友好,操作方便,权限管理灵活。设计时充分利用c+语言的继承、重载、默认参数,宏和静态成员变量等的特性,灵活地实现了系统的各种要求。关键词:数据库,控件,记录集,教务管理,mfc ,vc+。序 言本论文讲述了开发本系统的过程,通过联系具体的程序侧重介绍了系统的设计思想、数据库的设计思想、具体编程的细节,以及设计中的重点、难点技术和解决方案。论文中列举了大量程序,并对主要程序段的参数、各个变量和算法方法都作了详细解释。论文分为五章:第一章绪论,主要讲述了开发系统的背景、目前应用现状、系统需求。第二章系统开发工具,主要介绍了系统所使用的数据库、开发工具、开发工具对所选数据库的支持。第三章数据库的设计,主要介绍了数据库设计的全过程,建立了数据字典、各局部er模式、全局er模式、数据库关系模式、最后导出了数据库的物理结构。第四章软件系统的具体设计,主要介绍了扩展控件和记录集的思想和具体做法、主要模块的设计、具体的编程过程、画出了软件结构图,以及设计中遇到的中的重点、难点sql和解决方案。第五章结束语。开发系统的软件环境:本系统使用的开发工具是vc+6.0。数据库使用的是microsoft access20000。操作系统是windows me。开发系统的硬件环境:处理器:pentiumii 内存:128m本系统所附的软盘中有系统的可执行程序和所有源程序。软盘内容如下:a:data 数据库所在目录。a:jwgl.exe 系统可执行程序。可以拷贝到任何目录中运行,但data目录也要一起拷贝。a:源程序 系统源程序,源程序可在任何目录中编译。目 录摘 要i序 言ii目 录iii第一章 绪 论11.1 系统开发背景11.2 系统需求11.3 系统设计思想1第二章 系统开发工具32.1 access 简述32.2 vc+6.0简介32.3 mfc dao(数据访问对象)编程简介3第三章 数据库的设计53.1 数据字典53.2 各局部er模式的设计53.3 全局er模式63.4 数据库关系模式93.5 数据库的物理设计9第四章 软件系统的具体设计124.1 软件结构图124.2 数据库访问的组织134.2.1三个全局dao对象134.2.2扩展的记录集类134.3 用户界面的设计154.4 对列表控件和组合框控件的扩展164.4.1对列表控件的扩展164.4.2对组合框的扩展214.4.3一组用于简化参数的宏的设计234.5 用户权限管理的设计244.6 增加、删除、修改方面的设计254.7查询模块的设计344.7.1多表查询的实例364.7.2难点sql及解决方案384.7.3 判断表是否存在的解决方法39第五章 结束语41致 谢42参考书目43附录a 列表控件事件处理函数44附录b 系统全局函数、变量和宏的定义45public.h文件45public.cpp文件46第一章 绪 论1.1 系统开发背景在中学里,学校教务资料繁多,包含很多数据的管理,随着计算机成本的不断下降,现今,有很多的中学都已经配置了计算机机房用于教学,但却未使用计算机进行数据库管理。根据调查得知,他们的管理主要方式是手工处理,对于学生成绩的统计和核实等往往采用计算器等工具进行,对学生考试资料,以及成绩管理也是手工进行,需要抄写大量文字。很显然,用手工管理大量信息容易出错、丢失、且不易查找。尽管有的学校有计算机,但是尚未用于教务管理之中,没有发挥它的效力,资源闲置比较突出,这就是开发本系统的基本前提。基于这些问题,我认为有必要建立一个中学教务管理软件,使学校闲置的计算所被利用起来,同时也可以提高信息处理的速度和准确性,并能够及时、准确、有效的查询和修改教务档案。1.2 系统需求中学教务管理现状已在“系统开发背景”一节已有介绍不再赘述。这里主要介绍中学教务管理的内容。通过深入学校与教务管理员个别交谈、查看业务记录,得出中学教务管理的内容主要包括已下几个方面:学生管理,老师管理,考试管理,课程管理,班级管理,学校基础设施的维护与管理,其中学生管理包括:学籍管理、学生考勤、卫生检查,学生信息的查询;老师管理包括:老师资料管理,老师资料的查询;考试管理包括:考试设置与安排,成绩的分析与统计(优秀率,及格率,平均分,最高分的分析与统计)、成绩的查询;课程管理包括:课程设置,课程表按排;班级管理包括:班级设置,为新生分班;学校基础设施的维护与管理包括对学校设施使用情况进行统计与分析。其中查询功能要求有模糊查询和精确查询。另外,在使用计算管理时还需要设置权限。1.3 系统设计思想通过需求分析可以看出中学教务管理的内容相当的多,要开发出全部功能并不是一个版本能解决了的问题,所以准备分阶段开发,从低版本开始向上升级,开发出第一版后投入使用,在软件的整个生存周期中对其进行升级。本系统当前版本是1.0,命名为教务管理系统1.0。当前版本主要完成学生信息,老师信息,考试信息的添加、删除、查询、浏览,考试成绩的分析(及格率,优秀率等的分析),以及用户管理等功能。其中查询功能可以分为模糊查询、精确查询等功能.用户管理功能分为添加,删除用户以及用户权限的授予和撤消。其中权限设计使用了较为灵活的方法为每一个菜单设置了使用权限,保存权限时只使用了一个长整数(32位)可保存多达32种权限,并且易于管理和判断。充分利用c+语言的继承、重载、默认参数,宏和静态成员变量等的特性,灵活地实现了系统的各种要求。设计本系统时使用microsoft visual c+ 6.0作为开发平台,microsoft access2000作为数据库管理系统,使用microsoft data access objects 3.60(dao)访问数据库。设计的步骤是先按照中学教务管理的需求对数据库进行设计,包括:制作数据字典、画出er模型、关系模式、最终得到可在access上运行的物理数据库;设计完数据库之后再对数据库进行编程、按照界面要求设计应用程序。第二章 系统开发工具2.1 access 简述access是一个数据库管理系统。它被集成到office中,它与其他的数据库系统相比更加简单易学,一个普通的计算机用户可以很快地掌握它。access 2000的功能也十分强大,利用它可以方便地实现对信息保存、维护、查询、统计、打印、交流、发布。这些功能对一个普通用户来说已经足够了。作为一个办公人员,如果手头有大量的信息要处理,access 2000将是最好的选择之一。access2000对建立数据库表、建立查询、建立表间关系等方面提供了强有力的工具,建立及维护相当方便。在数据库完整性方面access2000还提拱了:级联更新、级联删除、主键约束、有效性文本、默认值等功能,大大简化了编程。2.2 vc+6.0简介早期windows编程只能用c语言,需要一段一段地重复调用复杂的windows api,写冗长的消息处理switch语句,现在大部分开发人员都使用c+进行windows编程。很多工具开发商也将windows api封装到一个个c+类库之中,并称之为“应用程序框架”(application framework)。开发人员可以利用它更高效地进行编程。visual c+的“应用程序框架”类库是mfc(microsoft foundation class),mfc功能十分强大,提供了appwizard(应用程序向导),classwizard(建类向导)等工具开发专业windows程序。同时还提供了大量windows基本控件的c+类,并允许对它们进行扩展,其中一些最常用的类是:cstatic(静态文本)、cbutton(按钮)、cedit(编辑控件)、clistctrl(列表控件)、ccombobox(组合框)。在数据库方面,从功能简单的数据库(如jet engine)到复杂的大型数据库系统(如oracle),vc+6.0都提供了一些编程接口,主要有以下五种:1. odbc api;2. mfc odbc类;3. mfc dao类;(数据访问对象)4. mfc的ole/db;5. activex数据对象(ado)。开发本系统时使用mfc dao类;(数据访问对象),所以下面重点介绍它的编程方法。2.3 mfc dao(数据访问对象)编程简介dao用于和微软的access数据库接口。在数据库应用程序如果只需与access数据库接口时,使用dao编程较方便。其主要类如下。cdaoworkspace:cdaoworkspace对象可以让一个用户管理从登陆到离开期间,指定的密码保护的数据库会话全过程。大多数情况下不要多个工作区也不要创建明确的工作区对象。因为在打开数据库和记录集对象时,它们可以使用dao缺省工作区。cdaodatabase:代表一个数据库连接,可用它提供的方法执行除select以外的所有sql。cdaorecordset:用来选择记录集并操作。开发本系统时对其进行了扩展。cdaorecordview:记录视图类,可用来查看数据库中的记录。cdaoexception:用来表示与数据库有关的异常。cdaotabledef:表示基本表或附加表的定义。每个dao数据库对象包括一个称为tabledef的收集,包含所有存储的dao表定义对象。cdaotabledef对象可以用来控制表定义。cdaoquerydef:cdaoquerydef对象表示了一个查询定义(querydef),用它可以执行一个查询。mfc dao仅用来支持access数据库,应用范围相对固定。第三章 数据库的设计3.1 数据字典通过需求分析得到了系统所要处理的数据,下面制作了一张简化了的数据字典,对数据的类型、长度、逻辑含义作了说明。 表3-1数据项名说明类型长度取值范围及含义学号所有学生的唯一编号,格式为入学年份+班代号+班中序号字符1014位:入学年份第58位:班代号910位:班中序号满分 优秀分 及格分划分成绩等级的分数线小数由学校按考试科目数设定。课程性质分为主课,副课,普通课,其它字符6课程代号课程的唯一编号字符3考试性质分为小考,单元考试,月考,中考(期中),终考(期末),会考。字符4考试名考试的唯一标识字符30老师编号老师的唯一编号字符4场地要求有些课程需要特定场地,如实验课需要实验室,计算机课需要机房等。记录这些信息后系统可以为学校进行基础设施管理提供信息字符20由学校根据本校情况设定班号(班代号)班的唯一编号,也是班的主要称呼。一般称呼一个班为:年级+代号,如:g147称呼为“高147班”或就称“147班”字符5第1位:初中高中标记,初中、高中第25位:用户自定义年级学校的年级划分字符4取值只有:初一、初二、初三、高一、高二、高三班别名为班取的名字,如:奥赛,体特。一般的班就取班代号除去第一位,例如:147班的别名为147班字符103.2 各局部er模式的设计通过分析学校教务管理工作所涉及的内容得到了五类实体:学生,课程,老师,班,考试。(下划线标记的属性为主键,各属性的说明参见表3-1):学生的实体和属性描述如下:学生(学号,姓名,性别,民族,出生年月,家庭住址,电话)课程的实体和属性描述如下:课程(课程代号,课程名称,课程性质,场地要求)老师的实体和属性描述如下:老师(老师编号#,姓名,性别,民族,职务,职称,专业,联系电话)班的实体和属性描述如下:班(班号,班别名,班主任,可容纳人数,成立时间,所属年级,文/理科)考试的实体和属性描述如下:考试(名称,考试性质,建立时间,满分,优秀分,及格分)各实体的er图如图3.1所示。实体定义完后结合需求分析对他们之间的联系进行分析得出了以下联系: l 联系一个学生学习多门课程,同一门课程有多名学生学习。l 联系一个学生参加多种考试,同一种考试有多名学生参加。l 联系一种考试设置有多门课程,同一门课程(如:语文)可能在多次考试中都有,例如:期中和期末考试中都设置有语文这门课程。l 联系一个班由多名学生组成,一个学生只属于一个班,l 联系一个班由一位老师管理,一位老师可能管理多个班各联系的局部图如图3.2所示。3.3 全局er模式得到局部er模式后就要将其合并为全局模式,合并全局模式不在于把若干局部er模式形式上合并为一个er模式,而在于消除冲突。通常在局部er模式中是不允许存在冗余的,但在合并为全局er图之后可能存在冗余。在合并过程中发现联系1和联系2存在冗余的属性成绩。并且一个学生的成绩无法确定,因为一个学生的成绩只能是在某一次考试中某一科目的成绩,例如:李明在2000年初一期中考试中语文的成绩。而这两个联系都缺一个唯一确定成绩的关键字。所以这两个联系要合并为一个联系。实际上学生学习课程与学生参加考试都是学习过程的一部分。因而可以合并为一个名为“学习”的联系。而关系3实际上可由合并了的学习关系导出,所以可以取消。经过消除冗余属性与联系之后得到的全局er图如图3.3所示。教员教员编号姓名职称专业职务民族性别电话学生姓名性别民族出生年月家庭住址电话学号班班代号班主任可容纳人数成立时间所属年级文/理科别名考试性质建立时间满分优秀分及格分名称课程课程代号课程名场地要求课程性质所属年级图3.1各实体er图学生班组成n1n学生成绩考试参加mn课程m设置考试n学生课程学习n成绩m班管理n老师1图3.2 实体联系图学生课程班学习分数组成n1nm考试p图3.3 全局er图3.4 数据库关系模式由于概念设计的结果是与dbms无关的er图,在设计本系统时选用的是关系型数据库,因此有必要将数据库转化为关系模式。将er图转化为关系模式有几点原则:l 对于实体类型,将每个实体类型转换成一个关系模式,实体的属性即为关系模式的属性,实体的标识符即为关系模式的键。l 对于联系类型有以下原则:u 如果联系是1:1的联系型,可以在两个实体类型转换成的两个关系模式之中的任意一个加入另一个关系模式的键和联系类型的属性。u 如果联系是1:n,则在n端加入1端实体关系模式的键和联系类型的属性。u 如果联系是m:n,则将联系也转换成关系模式,其属性为两端实体的键加上联系的属性,所组成的关系模式的键则为两端实体键的组合。按照上面的原则和前面设计的er图设计的教务助理系统数据库关系模式如下表(下划线标记的属性为主键):表3-2班 (班代号,别名,班主任,可容纳人数,成立时间,所属年级,文/理科)学生(学号,班号,姓名,性别,民族,家庭住址,电话)成绩(学号,课程号,考试名,分数)课程(课程代号,课程名称,课程性质,场地要求)老师(老师编号,姓名,性别,民族,职务,职称,专业,联系电话)考试(考试名,名称,性质,建立时间,满分,优秀分,及格分)3.5 数据库的物理设计在设计该系统时选用的是microsoft access2000。设计的方法是,首先按照关系模式生成基本数据库表,然后根据全局er图,建立各个表之间的联系。下面是用microsoft access2000设计的物理数据库:图3.4 课程信息表结构图3.5 班信息表结构图3.6 考试设置信息表结构图3.7 老师信息表结构图3.8 学习成绩信息表结构图3.9 学生信息表结构图3.10 各表间联系第四章 软件系统的具体设计4.1 软件结构图通过已得出的需求分析绘制的软件结构图如下:图4.1 软件结构图中学教务管理软件学生资料管理教师资料管理考试管理班级信息管理课程设置系统管理成绩查询增加删除修改资料 查询浏览修改用户密码用户权限授予与撤消增加删除用户录入学生资料浏 览增加删除修改班信息考试设置浏览分析打印成绩增加删除改修成绩4.2 数据库访问的组织4.2.1三个全局dao对象系统设置了三个全局dao对象,它们的命名及作用见表4-1,其中前缀g_表示是全局变量,以后系统中所有全局变量都遵循这一命名规则。表4-1/全局数据库对象cdaodatabaseg_db; / 用于执行除select之外的所有sql语句cdaoquerydefg_qd; / 用于执行只涉及多个表的select语句cdaorecordsetg_qd(&g_db); / 用于收集select语句的结果系统中除了这三个全局数据库对象外,还设置了只与每一张表相关的专用记录集。这些专用记录集可以执行只涉及一张表的查询以及收集查询结果。实际上,设置专用记录集最重要的原因不在此,而在于让它完成与表相关的其它任务。也就是说专用记录集已不再只是收集数据的简单对象了,设计时对它进行了扩展,具体的扩展方法在下一节中讨论。4.2.2扩展的记录集类数据库已经有全局记录集对象了,它可以执行所有查询,不管是涉及一张表的还是多张表的查询。但是,仍有必要为每一张表设计一个专用记录集,这是因为,表间有联系,必须维护它们之间的参照完整性,而且记录集中的数据最终要显示给用户。这些任务如果留给每一个模块自己解决,势必会增加编程量,并且在编写与业务相关的模块时还要分一部分精力来编写与显示和维护完整性有关代码。其中,由记录集维护参照完整性是指由记录集负责删除或更新有参照完整性要求的字段的细节。而在安排显示任务的时候并没有将显示的底层操作安排在记录集,因为显示的底层与记录集不相关,实际上记录集只是组织显示。这就要求记录集知道它的数据应该显示在什么地方以及显示哪些字段,并给负责显示的其它类发送显示请求完成实际的显示。显示的底层是由列表控件和组合框控件完成的,在后面的设计中也对它们进行了扩展,扩展后它们能与记录集结合在一起很方便地完成显示任务,这在后面的章节中会提到。具体扩展记录集的做法是使用c+语言的继承,从cdaorecordset类派生专用记录集类,扩展的记录集对象的类结构如下:扩展的记录集类方法:显示所有字段的值显示指定字段的值删除特定字段更新特定字段获取字段中文名与英文名的映射其中,“获取字段中文名与英文名的映射”的方法是为了完成显示任务而设计的。因为数据库中的字段名是英文而显示给用户的字段名要求是中文,所以必需要知道它们之间的映射关系,很显然,这个映射由记录集来维护最合适。这个方法主要是在设置列表表头时被调用。如图4.2,学生信息列表的表头文字就是调用这个方法获得的。图4.2 列表表头样式系统定义了扩展的记录集共六个。它们类名与对应的数据表如表4-2所示,其中前缀rs表示该类是记录集,以后系统中所有记录集类都遵照该命名规则。表4-2 六个专用记录集类名对应的表rsclassclassrsstudentstudentsrsteacherteachersrsexamexamrscoursescoursesrsscorescore当记录集知道怎样显示自已的数据后,其它模块要显示数据时只要向上面6个记录集之一发送消息即可,如上图中学生列表中的数据是由删除学生模块向rsstudent记录集发送“显示c025班学生”消息(rsstudent:showstudent(m_ctlstudentlist,”c025”))的运行结果。同样,因为每个记录集都知道怎样维护参照完整性,所以当要删除有参照完整性要求的字段时,也只要向上面6个记录集之一发送消息即可,记录集会维护其参照完整性,例如:要删除一个班就要考虑到参照完整性,通过分析数据库关系模式可以发现在“学生表”中有一个外键-班代号,所以不能只作简单的删除,这类操作是一类特殊的删除操作,将这类删除操作设计到记录集类中可以简化编程,也易于维护,若关系发生变化只要修改一处代码而且不会影响其它模块。对记录集进行这样扩展的好处是:很多与业务无关的细节被封装起来了,设计查询时可以将主要精力放在sql语句的设计上,至于如何与数据库交互和如何显示查询结果以及维护参照完整性,都完全由记录集实现。同时封装还具有很强的适应性,只要不改变方法名、参数个数及类型、返回值类型,修改方法内部实现细节是不会影响到其它模块的,并且随时可以添加新的方法而不影响其它模块。4.3 用户界面的设计为了方便用户输入,查询,浏览。系统为用户收集已存在的数据和系统生成周期中固定不变的数据,并将其放在组合框中供用户选择,这样做的好处还可以减少输入错误,特别是日期,它是只能是数字并且还有取值范围,如果日期格式不正确,写入数据库时程序会发生异常,虽然不会导致系统崩溃但会影响用户界面。还有一类数据,它要满足参照完整性要求。例如:在其它地方要引用老师姓名,那么这个老师姓名就必须已经以存在,如果老师姓名不存系统也会发生异常。另外,查询结果的显示、数据的浏览以及系统自动为用户收集的供参考的数据都是由列表控件完成。其中,浏览数据时用户可能还想删除或修改某一些数据。除了显示数据外,如果列表还具有单击列表表头就能对相应的列进行排序的功能,那将为界面增色不少并且更具实用价值。下图就是一个界面实例。图4.3 界面实例当用户在年级组合框中选择了某个年级之后,在列表框中会自动列出该年级已有的班,供用户参考,当用户输入一个新班后列表框中的内容也会变化以反应更新情况。并且组合框中的数据改变会影响到列表控件的内容,也就是说数据是动态的。实际上组合框的改变也会影响其它组合框的内容,如:班级组合框中列出的班应该只是属于某一年级的班,而不是全校所有的班(列出全校所有的班级由于班可能很多反而还不利用户操作),那么年级组合框的改变则班级组合框中的内容也要改变。另外在列表控件中可进行选择操作,并且可进行多项选择,主要是考虑到用户删除数据时的方便性。图4.4就是一个完成删除操作的对话框,其中的列表是可进行多项选择的。图4.4 删除班对话框4.4 对列表控件和组合框控件的扩展列表控件和组合框控件不仅是主要的界面元素之一,而且还是主要的数据容器。他的功能强大与否将影响到以后的编程效率,所以有必要对其进行扩展使其能适合本系统的要求。扩展的做法是使用c+的继承。系统所用的列表控件和组合框控件样式如下:图4.5 列表控件样式图4.6 组合框样式4.4.1对列表控件的扩展列表控件在系统中使用频率相当高,扩展的重点是要使它操作方便、界面美观、每一列都可按升/降序排序。操作方便的具体要求是:只要发一个方法就能完成数据的显示,同时要能方便地获取用户双击的列中任意单元格的内容;界面美观具体要求是:要与原始控件有较大的区别;排序的具体要求是:单击列表表头能对相应的列进行升/降序排列。对列表控件扩展了三个方法和一个处理单击列表表头事件的函数,由于双击事件与具体的应用有关所以不由列表控件负责,这里只扩展了获取用户双击的行中某一单元格(列)的内容的方法。事件的处理函数的源程序在附件中,源程序中有详细注释,这里不作详细介绍。为列表控件扩展的三个方法是:void setliststyle(dword s = 0);cstring getselectedstr( cstring strcol );void filllist(cdaorecordset &rdbset, char *pfield);三个方法完成的功能是:l filllist方法:在列表中填充rdbset所指记录集中的数据,pfield指示要填充哪些字段。l getselectedstr方法:获取用户双击的行中某一单元格(列)的内容,单元格由参数指出,如果不封装就只能使用无意义的数字访问单元格,封装后就可以用行号和列名来访问单元格。l setlistsytle方法:设置列表控件风格,设置的风格有:显示表格网格、整行选中等。修改该方法将影响所有列表控件风格这三个方法在程序中使用频度很高。其中,这里的filllist方法与组合框控件中的filllist方法几乎完成所有的具体显示任务,实际上有三个filllist方法,因为在组合框控件中有一个重载版。下面对列表控件的三个方法进行具体编程,编程思路在代码中作了详细解释。void listctrlex:filllist(cdaorecordset &rdbset, char *pfield) /*rdbset是数据库记录集,是要显示数据的来源。其中可能有多个字段,但并不一定都要显出来,这要看具体应用。究竟要显示哪些字段?由*pfield指定,*pfield包含有字段名信息,如果有多个字段则用|分 隔,由于数数据库中的字段名是英文,而要显示给用户看的字段名要求是中文,解决的办法就是在pfield 中加入中文信息,也用一个符号分开,这里选择的符号是&号,因此,pfield中的内容的格式是: 英文字段名&中文字段名|英文字段名&中文字段名.。下面举一个系统中的实例来说明该方法的使用:系统要在列表中显示学生的信息,于是传递的pfield=code& 学 号 |name& 姓 名 |sex&性别|class& 班代号 |nation&民族|birthday&出生年月|phone&电 话|homeaddress&家庭地址,注意中文中有空格,这是为了满足数据的显示宽度,英文中不能有空格,因为要用它来访问数据库,即使有空格也会在解析时清除。因为*pfield中包含多种信息,所以要解析*pfield, 并将解析出的英文字段名存放在strenfield字符串数组中,以备访问数据库时使用,把解析出的中文字段名存放在strfield 字符串数组中,中文字段名将作为表头被显示在列表中.*/const intmaxfield = 20; / 可显示的最大字段数const intmaxfieldtextlen = 50; / 每个字段名的最大长度intifield = 0; / 字段个数记数器intifieldtextlen = 0; / 字段长度记数器/ 解析出来的一个字段信息,包括英文、&号、中文charword maxfieldtextlen+1 ; char*ppos = null; / &号的位置,获取方法是ppos = strstr( word, & );cstringstrfield maxfield ; / 解析出的中文字段名cstringstrenfield maxfield ; / 解析出的英文字段名colevariant fieldvalue; / 从记录集中获取字段值时使用/ 解析pfield,以便确定要在列表中填充哪些字段。if( pfield = null ) return;while( *pfield)memset( word, 0, sizeof( word ) ); / 初始化ifieldtextlen = 0;/获取一个由号隔开的字符串,字符串存放在word中,包括英文、&号、/中文,不包括|号。循环在遇到一个|号后结束,然后继续执行下面的程序解/析word中的&号以获得英文和中文。while( *pfield != 0 & *pfield != | & ifield maxfield)word ifieldtextlen+ = *pfield+;/在word中确定英文和中文的分界位置。ppos = strstr( word, & );if( ppos = null ) return;*ppos = 0; / 使英文和中文成为两个独立的字符串,这两个字符串的首地址分别是word和ppos+1/将解析出来的英文和中文保存到字符串数据中作为解析结果strenfield ifield = word;strfield ifield = +ppos;/英文字段名中不能有空格,如果有空格下面的代码将清除其中的空格strenfield ifield .replace( , );ifield+;pfield+;/ 跳过|号/ 清空列表控件中的所有内容deleteallitems();while( deletecolumn(0) ); / 删除列表控件中所有列/ 设置表头int iitem;int i;for( i = 0; i ifield; i+ )insertcolumn( i, strfield i , lvcfmt_center, strlen( strfield i )*8 + 16 );/ 向列表中填充内容iitem = 0;/记录集没有打开或没有数据则返回if( ! rdbset.isopen() | rdbset.getrecordcount() = 0 ) return;/指向记录集中的第一条记录rdbset.movefirst();/遍历记录集中所有记录,并将记录集中字段名在strenfield数组中的字段值填充到列表while( ! rdbset.iseof() )fieldvalue.clear();rdbset.getfieldvalue( strenfield 0 , fieldvalue );insertitem( iitem, varianttostr(fieldvalue).getbuffer(0) );for( i = 1; i ifield; i+ )fieldvalue.clear();rdbset.getfieldvalue( strenfield i , fieldvalue );setitemtext( iitem, i,varianttostr( &fieldvalue ).getbuffer(0) );iitem+;rdbset.movenext();/*该函数完成从二维列表中获取选中行的某一单元格的内容*/cstring listctrlex:getselectedstr(cstring strcol)/参数strcol是指定要获取内容的单元格所在的列的列名(不能有空格),列名就是表头中的文字。cstringstrret=;/ 返回值cstring strcolname; / 列名charbuff40; / 缓冲,用于存放从单元格中获取的数据lvcolumncolumn; / windows定义的代表一个列的结构intiitem = -1;/ 列表中行指示器isubitem = -1; / 列表中列指示器inti; / 循环计数器if( strcol.isempty() )afxmessagebox(没有指定列!);gotoret; /如果没有指定列,下面的操作没有意义,程序返回column.mask = lvcf_text;column.psztext = buff;column.cchtextmax = 40;/*所指定的列名可能在列表中没有定义,下面的操作遍历列表中所有列,取出列名与指定的列名比较,如果遍历完毕,比较仍没有成功,说明指定的列不在这个列表中,程序返回*/for( i = 0; getcolumn( i, &column ); i+ )strcolname = column.psztext; /获取列名strcolname.replace( , );/清除列名中的空格if( strcol = strcolname ) / 比较isubitem = i;break;if( isubitem = -1 ) /isubitem = -1 说明比较未成功afxmessagebox(没有找到列!);gotoret;/下面获取用户在列表中选择了第几行if( ( iitem = getnextitem( iitem, lvni_selected ) ) 0 )gotoret;/取出iitem行isubitem列单元格中的内容strret = getitemtext( iitem, isubitem );ret:returnstrret;/*设置列表控件风格*/void listctrlex:setliststyle(dword s)/* 该方法除了能为列表框设置共有风格外还可以在共有风格的基础上附加特殊风格s。s指出特殊列表控件要设置的风格值,如:带有复选框的列表控件。函数原形中定义了s的默认值。原形为: void setliststyle(dword s = 0);s=0说明没有特殊风格。在程序中大多数情况下使用的是默认值 。使用默认值将为列表设置以下风格: lvs_ex_headerdragdrop | lvs_ex_fullrowselect | lvs_ex_gridlines */dwordstyle = s | lvs_ex_headerdragdrop | lvs_ex_fullrowselect | lvs_ex_gridlines; /* 所有列表框共有的风格*/ 设置列表风格为style变量中的风格setextendedstyle( style );modifystyle(null,lvs_showselalways);/ 使列表看起来更加友好insertcolumn(0,准备显示数据,双击表头项目可以进行排序, lvcfmt_left, 19*2*8+32)4.4.2对组合框的扩展图4.8 日期组合框范例对组合框也扩展了几个方法,扩展的主要目的是为了使组合框控件与记录集对象结合起来完成数据的显示以及对用组合框选择日期的处理(如图)。数据的显示与前面扩展的列表相似,只是传入的字段名只有一个,这是因为列表框一次只能显示一列数据。日期的处理包括从组合框中获取用户选择的日期和将指定的日期显示到组合框中。这是一件比较麻烦的事,因为日期的年月日分别放在三个组合框中(如图所示)。对于获取用户选择的日期,要先从这三个组合框中获取字符串,然后组合成数据库可接受的日期。对于将日期显示到组合框中去,要先将日期分解为三个字符串,再填到组合框中去。如果不将这个任务交组合框类处理,那么涉及到日期的编程将会很烦琐。交给组合框之后只要调用两方法传递三个组合框控件引用和日期,就可以完成日期的组合与显示。由于这两个方法参数较多,实际使用时很少直接调用它们,而是使用了一套宏,使用这套宏后组合日期不需要任何参数,显示日期也不需要传递控件引用了,在很大程度上简化了编程。宏的设计稍候在其它小节中介绍。下面是扩展组合框的类结构和主要部分程序代码的设计,编程思路在代码中作了详细解释。:扩展组合框类方法:组合日期显示日期获取当前选择的字符串显示记录集中一个字段的值扩展组合框类结构部分程序代码如下:/与该类相关的宏:#definedefault_list_content_t(请选择) /*组合框在还没有被选择时所显示的默认内容,是为了界面友好而置*/类的方法:cstring mycombobox:getstring(bool breal)/*该方法完成从组合框获得当前选择的字符串。从列表中获得当前选择的字符串只要使用ccombobox的函数getwindowtext。当用户没有选择组合框的时候getwindowtext可能返回空字符串,也可能返回default_list_content。但在具体应用中对字符串是否能为空字符串的要求各有不同。还有,default_list_content是没有意义的,在有些情况下可能要将其替换成其它的字符串。所以,对getwindowtext函数获取的字符串要稍加处理后才能返回。一个典型的字符串不能为空字符串的例子是:当字符串要写入数据库的时候如果是空字符串就会发生异常。这是因为ms access不接受空字符串(但接受空值)。但有的时候需要真实地反映组合框中的内容,也就是说对于getwindowtext获取的字符串不作任何处理即可返回。这种情况的典型例子是:当组合框中的字符串作为sql查询条件的一部分时可能需要通过判断字符串是否是空串来决定该查询是否被真正执行。例如要通过组合框中的内容生成有这样一个查询:select na

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论