|
|
|||||||||||||||||||||
|
|||||||||||||||||||||
| [返回] |
| Delphi与Word之间的融合技术 |
| 一、VBA代码含义
Microsoft Word是一个集成化环境,是美国微软公司的字处理系统,但是它决不仅仅是一个字处理系统,它集成了Microsoft Visual Basic,可以通过编程来实现对Word功能的扩展。 Word的宏既有有利的一部分,因为它能够帮助我们实现文档的自动化,但是Word的宏也不是纯粹的有利,有时它可能危害我们的文档、计算机系统甚至网络,从最开始的Taiwan NO1宏病毒到现在的Melissa宏病毒,从最开始的简单的提示,耗尽系统资源到现在的乱发电子邮件,将个人的信息发送到网络上,甚至向硬盘的Autoexec.bat(自动批处理文件)中添加Deltree C: -y,破坏整个Windows系统。 二、Word中内嵌的Com技术 可以说Word是对Com技术支持最好的软件,这样说似乎是太极端了一点,但是Word提供的强大的编程接口技术却能够是我们通过程序控制Word的任何一部分。无论是文件的打开、存盘、打印还是文档中表格的自动绘制。 1、 在Delphi中调用Word软件/文件的方法 在Word中调用Word软件,归纳起来有三种方法: 。通过Delphi的控件TOleContainer 将Word嵌入 2、对几种方法的难易程度的判别 a.通过Delphi的控件TOleContainer 将Word嵌入 这是最简单的Ole嵌入,能够直接将Word文档调用,只需要使用ToleContainer.Run就可以将Word文档直接启动。且这样启动的Word文档与Delphi程序是一个整体(从界面上看),但是它存在不可克服的缺点,即不能通过Delphi控制Word文档,也就不能实现将灵活操纵Word的目的。 b.使用Delphi提供的Servers控件调用Word,使用Word的属性 c.通过真正的Com技术,将Office软件目录中文件MSWORD9.OLB中的类库全部导入Delphi中,利用Com技术编程利用真正的Com技术,将MsWord9.OLD文件类库导入,然后利用Com技术进行使用。整体上类似使用Delphi的Servers控件,稍微比Servers控件麻烦,优缺点与Servers控件相同。 d.使用CreateOleObject将启动Word,然后以Ole方式对Word进行控制。 本办法是使用以CreateOleObjects方式调用Word,实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码。 三、Word宏编辑器 Word能够真正地进行VBA代码的编辑,可以编写窗体、函数。 进入Word宏编辑器的方法:工具->宏->Visual Basic编辑器,可进入Visual Basic编辑器界面。Word的Visual Basic编辑器界面和真正的Visual Basic编辑器基本相同,在此不再向详述。在VBA代码中,可以添加用户窗体、模块、类模块。用户窗体、模块、类模块的概念和Visual Basic完全相同。注释也与Visual Basic完全相同。 可以将光标停留在窗体、模块的任何一个子程序上,直接按“F5”运行当前子程序。 四、Word的宏的概述 Word充分地将文档编辑和VB结合起来,真正地实现文档的自动化。使用Word编程,类似于使用Visual Basic,所不同的是,在Word中,能够直接运行某一个子程序,直接看见结果,Word的宏,只能解释运行,而Visual Basic,现在已经能够编写成真正的机器码,从代码的保护上来说,应该尽可能地减少Word的VBA代码数量,尤其是关键的代码。 VBA宏,可分成四种: 1、和命令名相同的宏 如FileSave,FileOpen,如果在VBA代码中包含与Word同名的函数,则直接执行这些VBA代码,忽略Word本身的命令。 2、Word内特定的宏 这些宏包含AutoExec(启动 Word 或加载全局模板)、AutoNew(每次新建文档时)、AutoOpen(每次打开已有文档时)、AutoClose(每次关闭文档时),AutoExit(退出 Word 或卸载全局模板时)。 3、相应事件的VBA宏 这些宏是由事件触发的宏,如Document_Close在文档关闭的时候触发事件,Document_New在新建文档的时候触发,Document_Open在打开文档的时候触发。 4、独立的宏 自己编写的VBA代码,即不属于上面几种情况的VBA代码,可以被其他VBA代码调用,更重要的是,可以被其他程序调用。 五、Word命令宏的详细描述 Word本身的命令函数包含很多,但是无论是word联机帮助还是MSDN帮助,都没有这方面的介绍,因此只能凭自己的实验取探索,初步探测的函数如下: 宏名 解释 注释 OleWord时一些用用的代码 一、Delphi程序启动Word 采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为: 二、Delphi程序新建Word文稿 格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible) 举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False); 三、Delphi程序打开Word文稿 格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument, FileName: 文档名(包含路径) 举例: Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False, 四、Delphi程序保存Word文稿 格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password, FileName: 文件名。默认为当前文件夹和文件名。 Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument, 五、从数据库读取文件到本地硬盘和从本地硬盘读取文件到数据库 在数据库上使用Image二进制字段保存,使用Stream流的方式。 创建文件流: Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate); 保存到数据库的Image字段: 从数据库读取文件到本地硬盘: 释放文件流: 六、全局消息的定义 因为word和Delphi程序是两个软件,相互之间通讯比较麻烦,所以使用全局消息的方法进行。全局消息必须首先注册,Windows返回系统空闲的消息号,当注册的消息相同时,Windows系统返回同一个值,这样就保证了使用这个消息号在两个程序之间通讯。 定义消息的办法: szMessageString: pchar = 'XIDIAN_11_Stone'; 发送消息的方法: SendMessage(对方句柄,消息,消息附带短变量,消息附带长变量) 七、Delphi程序接收消息的方法 Delphi接收消息有两种,一是重载特定消息,二是重载WndProc函数,在里面选择相应消息进行处理。 对于法二,声明如下: procedure WndProc(var Message: Tmessage);override 八、Word中Combo对话框的动态生成以及Change事件 建立类模块Combohander,在内部定义事件 定义Combo控件产生事件的模块 产生Combo对话框 进行文件句柄设置,以产生Combo_Change事件 产生事件后,在类模块Combohander内选择ComboBoxEvent的Change事件,即可书写事件代码 九、一些Word的事件 VBA代码中处理的Word事件有:Document_Close Document_Close:事件在文档关闭时产生事件 |