APP下载

Delphi实现考试系统数据库题目信息的压缩与解压缩

2011-01-13林远明田民格

武夷学院学报 2011年5期
关键词:缓冲区控件对象

林远明 黄 聪 田民格

(三明学院 数学与信息工程学院,福建 三明 365004)

Delphi实现考试系统数据库题目信息的压缩与解压缩

林远明 黄 聪 田民格

(三明学院 数学与信息工程学院,福建 三明 365004)

通过对Delphi压缩和解压缩流类的研究,结合第三方控件TRxRichEdit实现了压缩RTF格式数据的显示和编辑的方法,丰富了考试系统题目信息的存储和显示方式,解决了考试系统数据库题目信息量与存储容量和网络传输的矛盾问题。

压缩和解压缩;RTF格式数据;题目信息;数据库

考试系统[1-3]数据库题目信息若使用纯文本格式进行存储,存储容量少,但无法表示字体、数学公式、图片等信息,更无法达到图文并茂的效果;若使用RTF格式进行存储,丰富了题目的表示形式,但信息量却指数增长,特别是题目中的插图将转换为BMP格式,即无任何压缩的位图格式进行存储。一张35万象素的电子图片(约1/3页A4纸版面),以RTF格式存储需要1.05MB的存储空间 (每1象素RGB三色,每一种颜色1字节,35万象素共1050KB)。若一个题库有1000题,平均每题1张图片,则需要1000MB的存储空间;若一次考试有100个考生参加,每个考生随机抽取[4-5]50题,则需要5000MB的流量,这对于服务器的存储和网络的传输将造成巨大的压力。若采用本文的方法进行压缩处理,则只需要不到10%的存储空间和流量,将大大提高网络的传输和响应效率。

本文给出利用Delphi提供的两个流类实现关系数据库RTF格式数据的压缩和解压缩,用第三方控件TRxRichEdit[6]实现RTF格式数据的显示和编辑。

1 流数据压缩和解压缩的原理与实现

1.1 数据压缩流类工作原理

Delphi在zlib单元中定义了数据流压缩与解压缩的相关类,可以方便地实现流数据的压缩与解压缩,其中TCompressionStream为压缩流类,在进行数据流压缩时,首先定义一个压缩流类对象,然后通过压缩流类对象构造函数实参指定压缩类型和压缩后的目标流,接着将输入流对象中的数据通过缓冲区写入压缩流对象,触发压缩流对象基类的OnProgress事件实现了数据的压缩,这样,压缩流对象构造函数所指定的目标流对象就可以读取压缩后的数据。

压缩流类构造函数原型如下:

其中:CompressionLevel用于指定压缩类型,不同取值代表的意义如表1;

Dest用于指定压缩后的目标流。

表1 不同压缩类型代表意义

需要压缩的数据写入压缩流对象的函数原型如下:

其中:

buffer用于指定需要压缩的数据缓冲区;

count用于指定需要压缩的数据字节数。

数据的压缩是在压缩流内自动完成的,压缩后的数据通过构造函数指定的目标流对象读取。

1.2 数据压缩流类的实现代码

定义压缩过程Compress(InS,OutS)实现将输入流对象InS中待压缩数据读到缓冲区Buf,再将缓冲区Buf中数据写入压缩流对象CS进行压缩,以便从输出(目标)流对象中读取压缩后的数据。

具体代码如下:

1.3 数据解压缩流类工作原理

Delphi在zlib单元中定义的解压缩流类是TDecompressionStream,在进行数据流解压缩时,首先定义一个解压缩流类对象,然后通过解压缩流类对象构造函数实参指定压缩数据所在的输入流对象,在解压缩流对象将输入流对象中的压缩数据读入缓冲区时,触发了解压缩流对象基类的OnProgress事件实现了数据的解压缩,这样,只需定义一个输出流对象就可以将缓冲区中被解压缩的数据写入输出流对象。

解压缩流类构造函数原型如下:

其中Source用于指定需解压缩的数据所在的输入流对象。

需要解压缩数据读入缓冲区的函数原型如下:

其中buffer用于指定存放解压缩的数据缓冲区;Count用于指定解压缩数据缓冲区的大小。

数据的解压缩是解压缩流对象将压缩数据读入缓冲区时自动完成的,缓冲区中解压缩后的数据通过构造函数指定的目标流对象读取。

1.4 数据解压缩流类的实现代码

定义解压缩过程DeCompress(InS,OutS)实现解压缩对象DS将输入流对象InS中压缩数据解压缩到缓冲区Buf,再将缓冲区Buf中已解压的数据写入输出流对象Outs,以便从输出(目标)流对象中读取解压缩后的数据。

具体代码如下:

2 数据库RTF数据压缩和解压缩的原理与实现

由于数据库RTF数据是以ASCII和机内码或U-niCode形式存储的,一般是备注类型,而压缩后是二进制信息,因此,不能用备注类型存储经压缩的RTF数据。

从数据库中读取经压缩后的数据或将压缩后的数据写入数据库时,必须将字段对象转换为TBlob-Field类对象以适应流的操作。

2.1 压缩RTF的数据库设计

因为RTF数据压缩后是二进制信息,因此,若以SQL Server 2000作为后台数据库,必须使用图像类型(Image)作为数据存储的类型;若以Oracle作为后台数据库,必须使用BLOB类型作为数据存储的类型;若以Access作为后台数据库,必须使用OLE对象作为数据存储的类型。以下是以SQL Server 2000作为后台数据库创建题目信息表的SQL语句,此处省略了题目答案等信息。

2.2 RTF数据压缩写入数据库的工作原理

首先,通过第三方控件TRxRichEdit类的RE1对象将在RE1控件上显示的RTF数据存入输入流对象InS,然后,调用Compress(InS,OutS)压缩过程将输入流对象InS中数据压缩后存于输出流对象OutS中,最后,将Fn指定字段对象转换为TBlobField类对象从输出流对象OutS中读取经压缩后的数据,ADODataSet1数据集执行提交操作后就保存到数据库了。

2.3 RTF数据压缩的实现代码

定义Save(RE1,Fn)过程实现将第三方控件RE1上显示的RTF数据压缩后存入数据集对象ADODataSet1中Fn指定的字段。

具体代码如下:

2.4 读数据库压缩RTF数据的工作原理

首先,将ADODataSet1数据集中的Fn指定的字段对象转换为TBlobField类对象以便于将其存储的压缩RTF数据写入输入流对象InS,然后,调用De-Compress(InS,OutS)解压缩过程将输入流对象InS中数据解压缩后存于输出流对象OutS中,最后,通过第三方控件RE1对象将输出流对象OutS中经解压缩后的RTF数据载入并显示。

2.5 读数据库压缩RTF数据的实现代码

定义Load(RE1,Fn)过程实现将数据集对象ADODataSet1中Fn指定的字段内容解压缩后显示于第三方控件RE1上。

具体代码如下:

3 数据库RTF数据压缩和解压缩的事件处理

3.1 在窗体显示事件中创建对象并打开数据集

首先要定义全局的输入流对象InS和输出流对象OutS,然后在窗体OnShow事件中创建对象并打开数据集,最后在窗体OnClose事件中释放流对象。

具体代码如下:

3.2 数据集记录滚动后显示RTF数据

数据集记录滚动事件中调用字段内容解压缩过程Load(RE1,Fn)实现将指定的字段内容解压缩后显示于相应第三方控件上。

具体代码如下:

3.3 键盘按键事件进入编辑状态

由于第三方控件的Bug而无法感应到数据集的状态改变,因此必须在第三方控件键盘按键事件中触发数据集进入编辑状态。

具体代码如下:

3.4 数据集取消操作前提交数据

由于第三方控件的Bug而无法感应到数据集的数据改变,在数据集触发记录滚动事件之前不会触发提交事件,因此必须在数据集取消操作之前自动提交数据。

具体代码如下:

3.5 数据集提交记录前压缩RTF数据

由于第三方控件显示的内容是非压缩的,因此,在提交之前必须调用压缩过程Save(RE1,Fn)实现将第三方控件上显示的RTF数据压缩后存储于数据集中指定的字段。

具体代码如下:

4 测试数据

为了说明采用本文方法的压缩效果,表2给出了四种情况的三种存储格式压缩前后存储容量的对比数据 (由于纯文本格式未压缩就已经丢失插图和数学公式等信息,故未列出压缩后的存储容量)。

由表2可知,对于仅含字体设置的题目信息,由Word格式转换成RTF格式后,容量由26KB降到5.49KB,主要是因为RTF格式少了Word格式的文件头部分,也因此压缩效率明显比Word文档直接用WinRAR压缩的效率还高;对于含有数学公式的题目信息,由Word格式转换成RTF格式后,容量略有减少,压缩效率仍比较高;对于含有插图的第三、第四种情况,由Word格式转换成RTF格式后,容量显著增加,因为Word格式中图片是压缩存储,而RTF格式中图片是无压缩存储,采用本文方法压缩后,容量基本接近于Word文档直接用WinRAR压缩的容量。

表2 不同题目信息不同存储格式容量比较

5 结束语

经过运行测试,若将Word文档转换为RTF格式存储后,其信息量将指数增长,如一个20MB的Word文档以RTF格式存储到数据库中会扩展成近400MB的信息量,这对于服务器存储和网络传输将造成巨大的压力;若经过本文方法压缩处理后,则这400MB的信息量只需占用约6MB的存储空间。具体压缩比例因不同RTF数据而异,含有图片的RTF格式数据其压缩率比较高。

以上方法可以推广到数据库音频和视频信息的存储,也可以达到比较好的压缩效果。

[1]田民格.Delphi开发无纸化考试系统 [J].三明学院学报,2005,22(2):214-218.

[2]田民格.无纸化考试系统防止考生作弊的实现措施[J].三明学院学报,2007,24(4):456-459.

[3]陈慈弟,林远明,黄聪,田民格.非标准化试题的智能评分[J].三明学院学报,2011,28(2):7-10.

[4]田民格,卢昌荆,陈秀琼.遗传算法在无纸化考试系统中实现随机抽题[J].三明学院学报,2007,24(2):200-203.

[5]田民格.改进的粒子群优化算法实现多目标智能组卷[J].三明学院学报,2009,26(4):403-406.

[6]田民格,卢昌荆.Delphi程序设计[M].北京:清华大学出版社,北京交通大学出版社,2007:9.

Delphi Realizes Compression and Decom pression of Database Exam ination Question Information

LIN Yuanming HUANG Cong TIAN Minge

(School of Mathmatics and Computer Science,Sanming University,Sanming,Fujian 365004)

Through the research of TCompressionStream and TDecompressionStream of Delphi,the display and editmethods of RTF format data compressed are realized with third-party control TrxRichEdit,the way of storage and display of examination system question information is enriched,the contradictions between the question information capacity of examination system and the storage capacity and network transmission is solved.

compression and decompression;RTF format data;question information;database

TP311.13

A

1674-2109(2011)05-0013-06

2011-06-17

福建省大学生创新性实验项目(项目编号:ZL0816/CS)。

林远明(1987-),男,汉族,主要研究方向:算法研究。田民格(1969-),男,汉族,副教授,主要研究方向:粗集与算法研究。

猜你喜欢

缓冲区控件对象
涉税刑事诉讼中的举证责任——以纳税人举证责任为考察对象
基于.net的用户定义验证控件的应用分析
关于.net控件数组的探讨
攻略对象的心思好难猜
基于网络聚类与自适应概率的数据库缓冲区替换*
基于熵的快速扫描法的FNEA初始对象的生成方法
一类装配支线缓冲区配置的两阶段求解方法研究
区间对象族的可镇定性分析
关键链技术缓冲区的确定方法研究
初涉缓冲区