资源描述
WORD 文档分类管理模块的编写文档分类管理模块的编写 摘摘 要要 随着计算机普及和计算机科学技术的发展,并且由于电子文档具备方便性、 快捷性和易操作性,人们将大部分信息以电子文档形式储存和归档。面对与日 骤增的海量数据信息,对它们进行有效的整理和管理变得尤其重要。人们越来 越期望能在统一的文档操作界面上,对各类文档信息进行收集收藏、整理归档, 方便查询。 本文详细介绍了 Word 文档分类管理软件的设计和实现。软件对用户需求做 了充分的考虑,进行正确和较完整的设计,使得能在统一的文档界面上,方便地 对磁盘上所有文档(可包括其它存储介质,如:移动硬盘等,文档指 Microsoft Office 里的 Word 文档,后缀名为.doc)进行分类管理。文档管理功能包括:新建 记录、打开文档、编辑记录、删除记录或文档、添加文档等。 本软件以 Word 插件形式实现,在 Word 工具档里增加自定义工具,并实现 上述各种功能。系统根据 com 组件编程原理,用 Visual Basic 6.0 实现了一个 Word 插件,并用 Office 2003 Access 保存文档分类信息。 关键词关键词:COM 组件;Word 插件;文档分类器 The Design and Implementation of a Word Addin for Document Classification Management Abstract With the popularity of computer science and the development of computer technology, along with the advantages of electronic documents such as convenience, efficiency and ease to use, most of information is stored and archived in the form of electronic document. Faced with the fact that amount of information increasing ceaselessly, it is more and more urgent to find a way to manage and access information effectively and easily. It is expected that we can collect, archive and refer to any types of documents facilely in a unified document interface. This article introduces the design and implementation of a Word document classification management software. This system took the users entire requirement into consideration, and was designed correctly and completely, with which any types of document on the disk (including not only the Word documents but also other types on other media) can be classified and managed in a unified document interface. Its document management functions includes: creating, editing and deleting document records and adding or removing files into or from the records. The software is implemented in the form of a Word addin component, which adds a user-defined toolbar into the Word, and implemented the functions mentioned above from with the toolbar. Obeying the principles of COM component programming, it is implemented with Visual Basic 6.0 and saves the document classification information in a database of Office2003 Access. Key words: COM Component; Word Addin; Document Classifier 目目 录录 论文总页数:31 页 1引言1 1.1课题背景1 1.2本课题研究的意义.1 1.3本课题的研究方法.1 2组件、COM、接口、插件.1 2.1组件1 2.1.1使用组件的优点.2 2.1.2对组件的需求.2 2.2COM.4 2.3接口6 2.3.1IUnknown 接口7 2.3.2Dispatch.8 2.4插件8 3WORD 对象模型9 3.1WORD 中的对象模型(OBJECT MODEL)9 3.2WORD 对象模型抽象图.9 4系统分析和设计.10 4.1功能需求分析.10 4.2数据存储结构分析.11 4.3数据库设计.11 5系统实现13 5.1插件接口方法.13 5.2事件响应14 5.3系统实现15 5.3.1添加 Word 插件.16 5.3.2添加 Word 工具栏.17 5.3.3连接数据库.18 5.4功能模块设计和实现.19 5.4.1新建功能.21 5.4.2打开文档功能.23 5.4.3编辑记录功能.23 5.4.4添加文档功能.24 5.4.5删除文档和记录功能25 结 论28 参考文献28 第 3 页 共 31 页 1 1 引言引言 1.11.1课题背景课题背景 随着计算机普及和计算机科学技术的发展,电子文档具备有方便性、快捷性、 易操作性,人们将大部分信息以电子文档形式储存和归档。面对与日俱增的海 量数据信息,对它们进行有效整理和管理变得尤其重要。人们越来越期望能在 统一的文档操作界面上,对各类文档信息进行收集收藏、整理归档,方便查询。 1.21.2本课题研究的意义本课题研究的意义 Word 文档是实际工作学习中最为常用的文档格式之一,为了增强 Word、Excel 等软件的自动化能力,人们开发了各种提高办公效率的软件,它 们大多数实用、专业性强。为了避免用户做大量重复性的工作,提高 Office 办 公效率,达到提高其实用功能的目的,可根据具体工作内容要求,编写出最具 本地化、个性化、最合适的软件。 1.31.3本课题的研究方法本课题的研究方法 通过对人们日常 Office 办公情况及存在问题进行透彻分析,并根据办公习 惯,总结出较可行的解决方案。 2 2 组件、组件、COMCOM、接口、插件、接口、插件 2.12.1组件组件 一个应用程序通常是由单个的二进制文件组成。当编译器生成此应用程序 之后,在对下一版本重新编译并且发行新生成的版本之前,应用程序一般不会 发生任何变化。操作系统、硬件及客户需求的改变都必须等到整个应用程序被 重新编译之后才能够得以认可,整个软件工程就这样随着已发行软件而日益老 化。 目前这种状况已经发生了变化。人们认识到应用程序在发行之后不应保持 那种静止的状态。开发人员应找出一种方法,以能够给已经发行的软件不断地 注入新的活力。这种解决方案就是将整个的应用程序分隔成多个独立的部分, 也即组件。此作法的好处是可以随着技术的不断发展而用新的组件取代已有的 组件。此时的应用程序将不再像以前那样是一个在发行之前就已命中注定要过 时的静态实体,而是可以随着新组件不断取代旧的组件而趋于完善,并且从已 有的组件可以建立全新的应用程序。 传统的作法是将应用程序分割成文件、模块或类,然后将它们编译并链接 成一个铁板一块状的应用程序。它与组件建立应用程序的过程(称为是组件架 构)有很大的不同。一个组件同一个微型应用程序类似,即都是已经编译、链 接好并可以使用了,应用程序就是由多个这样的组件打包而得到的。各定制的 第 4 页 共 31 页 组件可以在运行时同其他组件连接起来以构成某个应用程序。在需要对应用程 序进行改进时,只需将构成此应用程序的组件中的某个用新的版本替换掉即可。 当然将铁板应用程序拆分成组件需要一个强大的工具。我们所用的工具就 是 COM。COM,即组件对象模型,是关于如何建立组件以及如何通过组件建 构应用程序的一个规范。目前 Microsoft 的几乎所有应用程序都使用了 COM。 2.1.12.1.1 使用组件的优点使用组件的优点 前面已经提到过组件架构的一个优点:应用程序可随时间的流逝而发展进 化。除此之外,使用组件还有一些可以使对已有应用程序的升级更加方便和灵 活的优点,如应用程序的定制,组件库以及分布式组件等。 1.组件架构从本质上讲就是可被定制的,因此用户可以用更能满足他们需 要的组件来将某个组件替换掉。 2.组件架构最引人注目的优点之一是快速应用程序开发。这一优点可以使 开发人员从某个组件库中取出所需的组件,并将其快速地组装到一块以构造所 需的应用程序,如同搭积木块一样。这种从标准的部件构造应用程序的做法, 很长时间以来一直是软件工程师们的一个未曾实现的梦想。但是现在这一梦想 随着 ActiveX 控件(以前被称作是 OLE 控件)的开发而正在被变为现实。 Visual Basic、C、C+以及 Java 程序员都可以利用 ActiveX 控件加速应用程序 及 Web 页面的开发。 3.随着网络带宽及其重要性的提高,对由分布在网络上的多个部分组成应 用程序的需求毫无疑问将保持强劲的增长势头。组件架构可以使得开发这类分 布过程得以简化。实际上客户机服务器式的应用就是向组件架构跨出的第一 步。在那里整个应用程序被分成两部分:客户机部分及服务器部分。 2.1.22.1.2 对组件的需求对组件的需求 使用组件的种种优点直接来源于可以动态地将它们插入或卸出应用程序。 当然为了实现这种功能,所有的组件必须满足两个条件。第一,组件必须动态 连接。第二,它们必须隐藏(或封装)其内部实现细节。两个需求是相互依赖 的。动态链接对于组件而言是一个至关重要的需求,而信息隐藏则是动态链接 的一个必要条件。 1.动态链接:我们的最终目标是使用户在应用程序的运行过程中能够将组 件替换掉。虽然并不是在所有的应用程序中都需要给用户提供这种控件,但我 们却希望能够将组件动态地链接到一起。 可以设想一下对于一个由组件构成的,但不能在运行时进行链接的应用程 第 5 页 共 31 页 序,当用户需要改变其中的某个组件时会发生什么。此时开发人员不得不将整 个程序重新链接或编译一遍,然后重新发行新的版本。但是这种重新编译或链 接对于最终用户几乎是不可能的事情。即使他们知道如何链接,但他们可能没 有链接程序,或者没有合适的链接程序。这种需要每次改变一个组件时就将其 链接一遍的程序和传统的铁板一块的程序实际上没有什么差别。 2.信息封装:为组成一个应用程序,需要将各组件连接起来。当需要将某 个组件用新的组件替换掉时,需要将此组件同系统断开,然后将新的组件连上 去。显然新的组件必须按同样的方式连接到系统中,否则将需要重新编写、重 新编译或重新链接这些组件。不论组件或应用程序是否支持动态链接,如果改 变了某个组件同其他组件的连接方式,那么整个系统的整体性实际已被破坏了, 此时至少需要将整个系统编译一遍,甚至可能需要重新编码。 对于一个应用程序或组件,如果它使用了其它组件,那么我们称之为一个 客户,客户通过接口同其他组件进行连接。如果某个组件发生了变化但其接口 没有任何变化,那么它的客户将不需要进行任何修改。类似地,若客户发生了 变化但没有改变其接口,那么它连接的组件也不需要任何改变。但是如果客户 或组件的修改导致了对接口的修改,那么接口的另一方也应发生相应的变化。 因此为充分发挥动态链接的功能,组件及客户都应尽可能不要改变它们的 接口。这意味着它们必须被封装起来。也就是说,组件及客户的内部实现细节 不能反映到接口中,接口同内容实现细节的隔离程序愈高,组件或客户发生变 化时对接口的影响将越小。在接口没有发生任何变化时,对组件的修改将几乎 不会对应用程序的其它部分产生什么影响。 这种将客户同组件实现相应隔离开来的要求对于组件加上了一些限制: 1.组件必须将其实现所用的编程语言封装起来。任一客户都应能使用任一 组件,不论他们是用什么编程语言实现的。将实现的编程语言暴露出来只会在 组件及客户间引入新的依赖。 2.组件必须以二进制的形式发布。如果想将实现组件的编程语言隐藏起来, 那么在发布时它们必须是已被编译、链接好并且马上就可以投入使用的。 3.组件必须可以在不妨碍已有用户的情况下被升级。一个组件的新版本必 须既能够同老版本的客户一起使用。也可以同新版本的客户一起使用。 4.组件在网络上的位置必须可以被透明地重新分配。组件及使用它的程序 应能够在同一进程中,不同的进程或不同的机器上运行。客户对远程组件的处 理方式应与对本地组件的处理方式是一样的。否则,当将某个本地组件移动到 网络上的另外某个地方时,客户程序必须被重新编译。 将以上几点加以说明: 第 6 页 共 31 页 1.与语言的无关性。为方便讨论起见,假定某个应用程序只能使用由 Objective C 编写的组件进行定制。这样一来,将不会有太多的人来为此应用程 序编写组件,因为大多数编程人员使用的是 C+。以后我们可能会用 C+来编 写组件,从而使得应用程序可用的组件多起来。但如果后来另外有一种语言, 假设是 Espresso Beans 变得流行起来,大家都放弃 C+,转而使用这一语言。 为了使用应用程序不被淘汰,我们需要用这种新语言来编写组件。如此就有了 三种截然不同的编写组件的方法。在一个与语言无关的架构中,任何人均可以 编写组件,并且这些组件不会因为编程语言的发展而过时。 2.用户可能会拥有使用同一个组件的两个客户应用程序。假定其中的某个 应用程序被指定使用某个组件的新版本而另一个应用程序被指定来使用其老版 本。显然人们希望老应用程序仍能够使用新安装的新版本组件。但这种向后兼 容的能力不应对组件的发展造成限制。强行改变某个组件的功能以使之适应新 应用程序的需要,同时使其能支持老的应用程序仍应是可能的。 2.22.2COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现 在的 COM 编程,目标只有一个,就是希望软件能像积方块一样是累起来的, 是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把 一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低 藕合。件工程的核心就是要模块化,最理想的情况就是 100%内聚 0%藕合。结 构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功 能的结构化方式是一个巨大的进步。面向功能的模块化方法它的着眼点是事物 之间的联系,它眼中看不到事物的概念它只注重功能。面向功能的结构化方法 因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生 大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了, 那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变, 只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只 是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界, 所以一点小小的变化也可能导致整个系统都要改变。 然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构 造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的 是类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的 重用是基于源码的方式,这是它的重大缺陷。首先它限制了编程语言。其次你 每次都必须重新编译,只有编译了才能与你自己的代码结合在一起生成可执行 文件。另一种重用方式很自然地就想到了是 DLL 的方式。Windows 里到处是 第 7 页 共 31 页 DLL,它是 Windows 的基础,但 DLL 也有它自己的缺点。总结一下它至少有 四点不足。(1)函数重名问题。DLL 里是一个一个的函数,我们通过函数名来调 用函数,那如果两个 DLL 里有重名的函数怎么办?(2)各编译器对 C函数 的名称修饰不兼容问题。对于 C函数,编译器要根据函数的参数信息为它 生成修饰名,DLL 库里存的就是这个修饰名,但是不同的编译器产生修饰的方 法不一样,所以你在 VC 里编写的 DLL 在 BC 里就可以用不了。不过也可以用 extern “C“来强调使用标准的 C 函数特性,关闭修饰功能,但这样也丧失了 C的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就 找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在 任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL 与 EXE 的 依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么 DLL,这种方式很简单,它在编译时就把 EXE 与 DLL 绑在一起了。如果 DLL 发行了一个新版本,我们很有必要重新链接一次,因为 DLL 里面函数的地址可 能已经发生了改变。 DLL 的缺点就是 COM 的优点。COM 和 DLL 一样都是基于二进制的代码 重用,所以它不存在类库重用时的问题。另一个关键点是,COM 本身也是 DLL,既使是 ActiveX 控件.ocx 它实际上也是 DLL,所以说 DLL 现在还是有重 用上有很大的优势,通 COM 本身的机制改变了重用的方法,以一种新的方法 来利用 DLL,来克服 DLL 本身所固有的缺陷,从而实现更高一级的重用方法。 COM 没有重名问题因为根本不是通过函数名来调用函数,而是通过虚函数表, 自然也不会有函数名修饰的问题。路径问题也不复存在,因为是通过查注册表 来找组件的,放在什么地方都可以,即使在别的机器上也可以。也不用考虑和 EXE 的依赖关系了,它们二者之间是松散地结合在一起,可以轻松地换上组件 的一个新版本。 简单地说,COM 是一种跨应用和语言共享二进制代码的方法。与 C+不同, 它提倡源代码重用。源码级重用虽然好,但只能用于 C+。它还带来了名字冲 突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。Windows 使 用 DLLs 在二进制级共享代码。这也是 Windows 程序运行的关键重用 kernel32.dll,user32.dll 等。但 DLLs 是针对 C 接口而写的,它们只能被 C 或理解 C 调用规范的语言使用。由编程语言来负责实现共享代码,而不是由 DLLs 本 身。这样的话 DLLs 的使用受到限制。MFC 引入了另外一种 MFC 扩展 DLLs 二进制共享机制。但它的使用仍受限制只能在 MFC 程序中使用。COM 通 过定义二进制标准解决了这些问题,即 COM 明确指出二进制模块(DLLs 和 EXEs)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何 第 8 页 共 31 页 组织 COM 对象。COM 定义的二进制标准还必须独立于任何编程语言。一旦满 足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责 所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进 制代码。在内存中 COM 对象的这种标准形式在 C+虚函数中偶尔用到,所以 这就是为什么许多 COM 代码使用 C+的原因。但是记住,编写模块所用的语 言是无关的,因为结果二进制代码为所有语言可用。 此外,COM 不是 Win32 特有的。从理论上讲,它可以被移植到 Unix 或其 它操作系统,但是好像还从来没有在 Windows 以外的地方听说过 COM。 2.32.3接口接口 由于组件向外部隐藏了其内部的细节,因此客户要使用组件时就必须通过 一定的机制,也就是说要通过一定的方法来实现客户与组件之间的通信,这就 需要接口。所谓接口就是组件对外暴露的、向外部客户提供服务的“连接点” 。 外部的客户见不到组件内部的细节,它所能看到的只是接口,客户也是通过接 口来获取组件提供的服务。这有点像 OSI 网络协议分层模型,每一层就像一个 组件,它内部的实现细节对于其他层是不可见的;而每一层通过“服务接入点” 向其上层提供服务,这就像这里所说的接口。一般来说,接口总是固定的,也 是公开的。组件的开发人员要实现这些接口,而客户则通过接口获得服务。正 是接口的这种固定和公开,才使得组件和客户能够在不了解对方的情况下达成 一致。 接口提供了两个不同对象间的一种连接。实际上计算机程序是通过一组函 数而连接起来的。这组函数实际上就定义了程序中不同部分的接口。DLL 的接 口就是它所输出的那些函数。COM 中的接口也涉及到一组由组件实现并提供给 客户使用的函数。对于 COM 来说,接口是一个包含一个函数指针数组的内存 结构。第一个数组包含的是一个由组件所实现的函数的地址。对于 COM 而言, 接口就是此内存结构,其它东西均是一个 COM 并不关心的实现细节。 接口的作用:在 COM 中接口就是一切。对于客户来说,一个组件就是一 个接口集。客户只能通过接口才能同 COM 组件打交道。从整体上讲,客户对 于一个组件可以说是知之甚少的。在某些情况下,客户甚至不必知道一个组件 所提供的所有接口。 可复用应用程序架构:说组件仅仅只是接口的实现细节当然有点言过其实。 不管怎么说,一个未被实现的接口实际上什么也不能完成。但是组件可从应用 程序中删除并可用另外一个组合来取代之。只要新的组件支持同组件相同的接 口,那么整个应用程序将仍然能够工作。单个的组件并不能对整个应用程序产 生决定的作用。相反,用以连接组件的接口将对整个应用程序产生决定性的作 第 9 页 共 31 页 用。只要接口保持不变,那么组件可以任意地更换。 接口同木板房中的大梁非常类似。这些大梁决定了整个房屋的结构。同样 可以将应用程序所用的组件替换掉,这样应用程序的行为将会发生变化,但从 结构上讲,整个应用程序并没有发生任何变化。使用组件来构造应用程序的最 大的优点在于可以复用应用程序的结构。如果接口设计得好的话,将可以得到 可复用极高的结构。当然使用接口除了可以设计出可复用的结构外,还有其它 若干优点。 COM 接口的其它优点:接口使得客户可以用同样的方式来处理不同的组件。 这种能力就被称作是多态。这些优点是通过接口将某个特定的行为封闭起来而 获得的。 2.3.12.3.1 IUnknownIUnknown 接口接口 COM 中的所有内容都起于接口,又最终归于接口。客户同组件的交互都是 通过一个接口完成的。在客户查询组件的其它接口时,也是通过接口完成的。 这个接口就是 IUnknown。IUnknown 接口的定义包含在 Win32 SDK 中的 UNKNWN.H 头文件中。这个接口实际上是所有的组件及客户都知道的,但它 的名字却表示出它是一个“未知的”接口。之所以使用这个名字主要也是为简 单起见。所有的 COM 接口都需要继承 IUnknown。因此若某个客户拥有一个 IUnknown 接口的指针,它并不需要知道它所拥有的接口指针到底是什么类型的, 而只需知道此接口可以用来查询其它接口就行了。 Interface IUnknown Virtual HRESULT_stdcall QueryInterface(const IID Virtual ULONG_stdcall AddRef()=0; Virtual ULONG_stdcall Release ()=0; ; 从上面可以看出 IUnknown 有三个方法: AddRef():通知 COM 增加它的引用计数。如果进行了一次接口指针的拷贝, 就心须调用一次这个方法,并且原始的值和拷贝的值两者都要用到。 Release():通知 COM 对象减少它的引用计数。 QueryInterface():从 COM 对象请求一个接口指针。当 coclass 实现一个以 上的接口时,就要用这个方法。 当使用 CoCreateInstance()创建对象的时候,你得到一个返回的接口指针。 如果这个 COM 对象实现一个以上的接口(不包括 IUnknown) ,你就必须用 QueryInterface()方法来获得任何你需要的附加的接口指针。 第 10 页 共 31 页 QueryInterface()的原型如下: HRESULT IUnknown:QueryInterface ( REFIID iid, void* ppv ); 以下是参数解释: Iid:所请求的接口的 IID。 ppv:接口指针的地址,QueryInterface()通过这个参数在成功时返回接口。 2.3.22.3.2 DispatchDispatch 自动化使得用解释性语言和宏语言访问 COM 组件更为容易,同时用这些 语言编写组件也将更为容易。自动化关注的是运行时的类型检查,这一点是以 速度的牺牲和编译时的类型检查为代价的。 自动化不是独立于 COM 的,而是建立在 COM 基础上的。一个自动化服务 器实际上就是一个实现了 IDispatch 接口的 COM 组件。而一个自动化控制器则 是一个通过 IDispatch 接口同自动化服务器进行通信的 COM 客户。自动化控制 器不会直接调用自动化服务器的那些函数,而是通过 IDispatch 接口中的成员函 数实现对服务器中函数的间接调用。IDispatch 接口同自动化的其它所有方法一 样,是作为 Visual Basic 的一部分开发出来的,以专门用于将一些应用程序如 Microsoft Word 和 Microsoft Excel 自动化。Microsoft Office 的开发 VBA 实际上 就是从 Visual Basic 发展来的。 通过 COM 接口提供的任何服务都可以通过 IDispatch 接口来提供。由于 IDispatch 为客户和组件提供了另外一种通信方式。有了 IDispatch 之后,COM 组件就可以通过一个标准的接口提供它所支持的服务,而无需提供多个特定于 服务的接口。简单地讲,IDispatch 将接收一个函数的名称并执行它。 2.42.4插件插件 插件是一种遵循一定规范的应用程序接口编写出来的程序。插件是一类特 殊的组件。它的目的不是为一般应用程序使用,而是专为特定的应用程序使用。 插件的本质是在不修改程序主体的情况下对软件功能进行加强,当插件的接口 被公开时,任何公司或个人都可以自己制作插件来解决一些操作上的不便或增 加一些功能。插件还可以支持多人合作开发,不同的功能可以由不同的人来完 成,而且由于不同插件之间互不影响,方便程序的调试和纠错。插件一般在宿 主应用程序上添加控制项,如菜单、工具按键等。插件响应宿主程序中对这些 项目的操作,并对宿主程序中的数据进行特定操作。插件类型从广义的范围来 看,插件有以下三种类型: 1类似批命令的简单插件。事实上这种插件的自由度非常低。运行这种插 第 11 页 共 31 页 件后,会一步步要求用户进行选择/输入,最后根据用户的输入来执行一系列事 先定义好的操作。这种插件一般是文本文件。功能比较单一,可扩展性极小。 优点是插件做起来非常方便,即使是对程序设计了解不多的人也可以制作。 2使用一种特殊的脚本语言来实现的插件。这种插件比较难写,需要软件 开发者自己制作一个程序解释内核。比如微软惹了很多麻烦的宏就是这种类型 的。有一套著名的 Office 辅助工具就是完全用 Office 内置的 VBScript 写成的。 这种方法的优点在于无需使用其它工具来制作插件,软件本身就可以实现,普 遍出现于各种办公自动化软件中。 3利用已有的程序开发环境来制作插件。例如 PhotoShop 等软件使用的方 法。使用这种方法的软件在程序主体中建立了多个自定义的接口,使插件能够 自由访问程序中的各种资源。这种插件的优势在于自由度极大,可以无限发挥 插件开发者的创意,这种插件是狭义范围的插件,也是真正意义上的插件。而 这种插件机制的编写相对复杂,对于插件接口之间的协调比较困难。 3 3 WordWord 对象模型对象模型 3.13.1Word 中的对象模型(中的对象模型(Object Model) 什么是对象模型?简单地说,用户在 Word 中操作和改变的每一个东西都 是一个对象,这些对象的相互关系组成了 Word 中的对象模型。在 Word 中,文 档、对话框、文本框、图形、图表甚至 Word 本身都是对象,同时,这些对象 都有自己的属性和方法,因此,用户可通过编程来访问这些已有对象,改变它 们的属性,以完成某些较高级的功能。在对象模型中,还有一个重要的概念是 集合(collections),所谓集合,就是由一组相近对象的组合,它们隶属于另一 个大对象,例如 sentences、words 和 characters 对象,就可看成一个集合,它们 都隶属于 Range 对象,集合的重要属性是我们可以对之进行整体操作,当然也 可对集合中的某个对象进行操作。 3.23.2Word 对象模型对象模型 第 12 页 共 31 页 图 1 对象模型抽象图 Application 对象包含 Document、Selection、Bookmark 和 Range 对象。 Word 提供了数百个可与之交互的对象。这些对象包括: Application 对象 Document 对象 Selection 对象 Range 对象 Bookmark 对象 Application 对象表示 Word 应用程序,是其他所有对象的父级。它的所有 成员通常作为一个整体应用于 Word。可以使用该对象的属性和方法来控制 Word 环境。 Document 对象 Microsoft.Office.Interop.Word.Document 对象是 Word 编程的中枢。当打开 文档或创建新文档时,就创建了新的 Microsoft.Office.Interop.Word.Document 对 象,该对象被添加到 Word 的 Documents 集合中。焦点所在的文档叫做活动文 档,由 Application 对象的 ActiveDocument 属性表示。 4 4 系统分析和设计系统分析和设计 4.14.1功能需求分析功能需求分析 Word 是微软公司的 Office 系列办公组件之一,是目前世界上最流行的文字 编辑软件,它无疑是现代办公中使用最多的字处理软件。现在已能把各种形式的 信息资料存储到 Word 文档中,如文字、图片、超连接等。面对大量文档信息, 对它们分类管理显得尤其重要。 由于日常工作中要处理的文档越来越多,而如果不对其分类整理将造成需 要时查找等麻烦。特别是处理文字文档较多的工作,如财务管理,文秘等工作。 解决以上问题有两种方法可行:一、利用 Windows 对磁盘文件、文件夹的分级 管理功能。如在 D 盘上新建几个文件夹,分别代表各类性质的文档。此方法解 决了对文档的分类存储问题,但极不方便。如在使用文档时,只能找到某个盘 下的某个目录,再进行新建文档、删除文档、重命名文档等操作,当文档多且 所分的等级较多时(就是盘符下面的文件夹级数多) ,将浪费时间,影响办公效 率,当要求多次重复此等操作时,更显其弊端。二、开发 Word 插件。此插件 在打开 Word 软件时被加载,以工具档里工具的形式出现。点击此工具,就可 对文档进行各种随心所欲的操作,但不改变文档内容,也就是说此插件是基于 文档的存储路径的,而不是基于文档本身。 首先,插件基于文档的存储路径,因此“存取自由”是它的一个特色。用 第 13 页 共 31 页 户可将文档存放在磁盘任何地方(建议不放在本地 C 盘或桌面) ,也包括来自 网络上的文档路径,当磁盘空间有限的时候,可以充分体现这一优势。 其次,插件允许用户对文档进行任何操作。包括新建、打开、编辑、删除 文档等等。 此插件还有一个重要特点,就是以工具栏里的工具形式出现,在启动 Word 软件时被加载。因此它很“轻量级” ,占用系统资源少,使用方便,容易卸载。 4.24.2数据存储结构分析数据存储结构分析 系统的数据存储方式可有两种理想的选择:XML 和 Access 关系数据库。 XML 提供了一套跨平台、跨网络、跨程序语言的数据描述方式,使不同系 统之间的数据交换更加高效。但如果从更高的技术角度出发,就会发现,对 XML 文档简单的文件管理是远远不够的:低效的存储组织、索引查询技术,不 提供事务、安全恢复机制,无法保证数据的完整性和一致性,没有并发控制、 移植工具等。用 XML 可方便实现无限层分类目录的保存。 关系数据库是实体间联系是固定的,有良好的完整性支持,对具有一对多的层 次关系,更为直接的描述现实世界,有良好的性能,存取效率较高,建立在严 格的数学概念的基础上,概念单一,实体与实体间的联系都用关系表示,数据 结构简单、清晰,存取路径对用户透明,有更高的数据独立性和更好的安全保 密性。Access 适用于小型商务活动,用以存贮和管理商务活动所需要的数据。 Access 不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利 用各种数据源,生成窗体(表单),查询,报表和应用程序等。使用 Microsoft Access,可以在单一的数据库文件中管理所有的信息。 基于系统需求分析和 Visual Basic 语言对 Access 数据库的强大支持,及 Access 自身具有的便捷、易使用等特点,系统选用 Access 数据库存储相关记录。 4.34.3数据库设计数据库设计 由于系统基于文档存储路径,操作修改对象大部分对于路径和相关记录, 因此数据库只对文档的路径和相关记录进行存储,而不是文档。系统把记录分 为三层,即三个部分,共三张表,分别用来存储目录、文件夹和文档路径。用 表 table1 存储目录,表 table2 存储文件夹,表 table3 存储文档记录。如图: 第 14 页 共 31 页 图 2 数据库表图 目录表 table1:用于存储记录的最高级目录。包括两列:sort_id,自动编号, 主键;sort,文本类型,储存目录名称。 图 3 目录表 table1 文件夹表 table2:用于保存记录的中间层,也就是目录的下一层。包括三 列:fold_id,自动编号,主键;ref_table1_id,数字类型,外键,用于关联 table1 的 sort_id;fold,文本类型,用于保存文件夹记录名称。 图 4 文件夹表 table2 第 15 页 共 31 页 文档路径表 table3:用于保存文档路径,文件夹的下一层也就是最底层。 包括四列:file_id,自动编号,主键;ref_table2_id,数字类型,外键,关联到 table2 的 fold_id;filename,文本类型,用于保存文档的文件名;filepath,文本 类型,用于保存文档的存储相对路径。 图 5 文档表 table3 表之间的关系如图: 图 6 表关系图 5 5 系统实现系统实现 5.15.1插件接口方法插件接口方法 当 VB 运行时,在 Add-In 菜单中装载组件以后,VB 就会调用组件中 IDTExtensibility 对象中的 OnConnection 方法。在 OnConnection 方法里定义 Application 对象变量,并调用 CommandBars.Add 方法,就可在程序运行时加载 工具栏。 在“引用”对话框中选择“Microsoft Office 8.0 Object library”复选框,可以通 过“对象浏览器”访问并浏览各种命令条对象。 因为菜单和工具栏属于相同的对象库,它们都将通过 CommandBarControl 对象被引用。一个菜单条命令条可以包括几个菜单项,每个菜单项本身也是一 个命令条,而且它又可以包括若干个菜单命令,每条命令依然是一个命令条。 第 16 页 共 31 页 利用这种模式可以很容易地在开发环境中放置外接程序。 使用 commandBars 集合对象用外接程序来添加命令栏和控件。在 OnConnection 事件过程定义 Application、commandbars 对象变量,此过程创建 新的命令条按钮,并返回对它的对象变量,并定义 commandbar 上按键的事件。 5.25.2事件响应事件响应 从结构上来看,一个 VB 插件实际上是一个 COM 组件,原则上组件可以 使用支持 COM 的开发工具。组件通过实现 COM 中的 IDTExtensibility 对象来 建立与 VB 的连接。组件注册以后,当 VB 运行中在 Add-In 菜单中装载组件后, VB 就会调用组件中 IDTExtensibility 对象中的相应方法(如在装载组件后会调 用 OnConnection 方法) 。这时整个插件就成为 VB 的一部分从而可以访问 VB 开 发环境中的各种对象和资源了。 在 Client 派生一个 IDispEventImpl 类来实现 IDispatch 接口的 Sink。在 OLE 中,连接点是指一种由调用接口的对象(称为“源” )和执行接口的对象(称为 “汇” )构成的机制。连接点执行一个流出接口,它能够在其他对象上开启动作, 比如激发事件和更改通知。通过揭示一个连接点,源就允许汇建立到此源的连 接。插件接口要响应 Word 事件,需要实现 IDispEvents 接口。 图 7 接口示意图 1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。也就是说 可以有多个发生“事件”的源头。图 7 中就有 3 个连接点。 2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。 连接点容器接口特别简单,因为只有 2 个函数,一个是 FindConnectionPoint(), 表示查找你想要的连接点;另一个是 EnumConnectionPoints()。 3、每一个连接点,可以被多个客户端的接收器(Sink)连接。 首先通过 VB 可以快速建立一个 IDTExtensibility 对象框架,其次 VB 对于 第 17 页 共 31 页 整个开发环境都提供了相应的对象供插件访问和控制,而使用插件的主要目的 就是通过插件来控制宿主程序,调试十分的方便,可以直接运行看结果,不需 要编译注册。 IDTExtensibility 库提供了 5 个可用来操纵加载项以及宿主应用程序的事件: OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete 和 OnBeginShutdown。由于接口是对象和 Visual Basic 之间的约定,必须确保实现 接口中的所有方法。这就意味着全部四种 IDTExtensibility 接口方法必须在类模 块中提供,每一种至少包含一个可执行语句。它能小到只有一个说明语句,但 是,它们必须至少包含一个可执行语句,以免编译程序把它们作为空过程删除。 1.OnConnection 事件 OnConnection 事件在 COM 加载项加载(连接)时发生。 2.OnDisconnection 事件 OnDisconnection 事件在卸载 COM 加载项时发生。可使用 OnDisconnection 事件过程运行能够恢复由加载项对应用程序所作任何更改的代码,并执行常规 清除操作。 3.OnStartupComplete 事件 当宿主应用程序完成启动例程时,就会发生 OnStartupComplete 事件,在这 种情况下,COM 加载项在启动时加载。如果加载项未在应用程序加载时加载, OnStartupComplete 事件就不会发生,即使用户在“COM 加载项”对话框中加 载加载项也是如此。如果此事件确实发生,则它将在 OnConnection 事件之后发 生。 4.OnBeginShutdown 事件 在应用程序关闭而 COM 加载项仍处于加载状态的情况下,如果宿主应用 程序开始其关闭例程时,就会发生 OnBeginShutdown 事件。如果应用程序关闭 时该加载项还没有加载,OnBeginShutdown 事件就不会发生。如果此事件确实 发生,它将在 OnDisconnection 事件之前发生。 5.OnAddInsUpdate 事件 当一组已加载的 COM 加载项发生更改时,就会发生 OnAddInsUpdate 事件。 当某个加载项加载或卸载时,就会在任何其它已加载的加载项中发生 OnAddInsUpdate 事件。 5.35.3系统实现系统实现 基于以上背景,及对用户需求的充分考虑和当前工作环境及条件,将功能 总结如下:新建记录、打开文档、编辑记录、删除文档和记录、添加文档记录。 第 18 页 共 31 页 1.新建记录:主要分三层结构,目录、文件夹、文档。可对目录、文件夹 新建,但对文档请使用添加功能。 2.打开文档:当在界面内选定某个文档后,用 WORD 打开此文档。 3.编辑记录:对记录(包括目录和文件夹)重命名。 4.添加文档:将本地磁盘的文档放入某个文件夹之下。 5.删除文档和记录:删除目录或文件夹(也就是记录) ,删除磁盘(介质) 上的 WORD 文档至回收站,永久删除磁盘上文档。 5.3.15.3.1 添添加加 WordWord 插件插件 1、创建“外接程序”工程 图 8 新建外接程序工程 2、打开“设计器”中的 Connect 设计器。 图 9 设计器 第 19 页 共 31 页 双击该 Connect 的图标。修改其中的工程名和应用程序。其中,“应用程 序”选择该插件是针对哪个具体的应用程序的。这里选 Microsoft Word。注意: 这里列出的应用程序都要求插件提供同一种接口:IDTExtensibility2。 3、添加对 Word 类型库的引用 系统缺省添加了对 Office 类型库的引用。由于开发的是 Word 插件,因此 需要存取 Word 中的对象。所以必须添加对 Word 的引用。工程-引用,选定 Microsoft Word 11 Object Library。 4、打开该设计器的代码窗口。 设计器的代码就是插件接口方法的实现。同 VC 中一样,IDTExtensibility2 有 5 个方法需要实现。但 VB 中不需要添加特殊代码的方法,没有必要定义其 过程。系统编译时自动添加。 5、调试 设置该工程的属性,将“调试”中的启动程序设置为本地的系统中安装 Office WinWord.exe 的绝对路径:例如 C:Programe FilesMicrosoft OfficeOFFICE11WINWORD.EXE。VB 中调试时结束后,自动删除插件的注册 项。因而独立打开 Word 时,并没有出现插件的工具栏。 5.3.25.3.2 添加添加 WordWord 工具栏工具栏 (1)删除系统缺省添加的代码。 系统缺省添加的代码是针对 VB 插件的,而不是 Word 或其它应用程序插 件的。因此删除它们。并在程序顶部添加以下代码: Option Explicit Private mAppWord As Word.Application 定义 word 对象变量 Private mBar As Office.CommandBar 定义工具栏对象变量 定义工具栏上按钮对象变量和事件响响应程序 Private WithEvents mBtn1 As Office.CommandBarButton (2)添加 AddinInstance 对象的 OnConnection 方法。 AddinInstance 就代表了该插件本身。 在其中添加代码,以便在 Word 中添加工具栏和按键,代码: Private Sub AddinInstance_OnConnection (ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom () As Variant) Set mAppWord = Application Set mBar = mAppWord.CommandBars.Add(“word manager“, , , True) Set mBtn1 = mBar.Controls.Add(Office.MsoControlType.msoControlButton) 第 20 页 共 31 页 SetButtonStyle(mBtn1,203,“Button1“,“Testtoaddabuttoninword“,msoButtonIco nAndCaption) End Sub 按键对象定义为 WithEvents,这样可以添加它的事件处理代码: Private Sub mBtn1_Click (ByVal Ctrl as Office.CommandBarButton, CancelDefault as Boolean) Dim doc As Word.Document 操作 word 对象 Form1.Show 取 Word 的当前活动文档,显示 Form1 窗 体 End Sub 5.3.35.3.3 连接数据库连接数据库 在 Visual Basic6.0 中,可使用三种数据访问接口,即 ActiveX 数据对象 (ADO) 、远程数据对象(RDO)和数据访问对象(DAO) 。数据访问接口是一 个对象模型,代表了访问数据的多种方法。ADO 又称 OLE 自动化接口,采用 了类似 DAO 和 RDO 的约定和特性,从而使其更易手于使用,它是由 Microsoft 推出的最新、功能最强,且容易使用的数据访问实例(OLE DB)的应用程序接 口。OLE DB 可以极高的性能访问数据源,其中包括关联和非关联数据库、电 子邮件和文件系统、文本和图形、定制商业对象等。 其中 ADO 是最新的,它最简单也最灵活。因此,此系统使用 ADO 作为数 据访问接口。 数据库控件使用:ADO Data 控件使用 Microsoft ActiveX Data 对象 (ADO)快速创建数据绑定控件和数据提供者之间的连接。能够执行数据绑定 的 ActiveX 控件包括 DataGrid、DataCombo、Chart 和 DataList。 DataCombo 和 DataList 控件都有五种特殊的属性: 1.DataSource:DataComno 和 DataList 控件被绑定的 ADODC 控件的名称 2.DataField:由 DataSource 属性所指定的记录集中的字段名称。 3.RowSource:将要用于填充列表的 ADODC 的名称。 4.BoundColumn:由 RowSource 属性指定的记录集中的字段名称。该字段 必须与用来更新列表的 DataField 的类型相同。 5
展开阅读全文