[center]OleWord时一些用用的代码[/center]
[center][email protected][/center]一、Delphi程序启动Word
采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:
首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,
则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word二、Delphi程序新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名称,
NewTemplate: 新建文档的类型,True表示为模板,False表示为文档
DocumentType: 文档类型,默认为空白文档
Visible: 打捞的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False);三、Delphi程序打开Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
                         PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
                         Format,Encoding,Visible)FileName: 文档名(包含路径)
Confirmconversions: 是否显示文件转换对话框
ReadOnly: 是否以只读方式打开文档
AddToRecentFiles: 是否将文件添加到"文件"菜单底部的最近使用文件列表中
PassWordDocument: 打开此文档时所需要的密码
PasswordTemplate: 打开此模板时所需要的密码
Revert: 如果文档已经,是否重新打开文档
WritePasswordDocument: 保存对文档更改时所需要的密码
WritePasswordTemplate: 保存对模板进行更改时所需要的密码
Format: 打开文档时所需使用的文件转换器
Encoding: 所使用的文档代码页
Visible: 打开文档的窗口是否可见举例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
            AddToRecentFiles:=False);四、Delphi程序保存Word文稿
格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
                          AddToRecentFiles, WritePassword, ReadOnlyRecommended, 
                          EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, 
                          SaveAsAOCELetter)FileName:              文件名。默认为当前文件夹和文件名。
FileFormat              文档保存的格式。
LockComments            如果为 True,则此文档只允许进行批注。
Password                打开文档时的口令。
AddToRecentFiles        如果为True,则将文档添至"文件"菜单中最近使用的文档列表中。
WritePassword           保存对文档的修改所需的口令。
ReadOnlyRecommended     如果为 True,在每次打开文档时,Word 将建议用户采用只读方式。
EmbedTrueTypeFonts      如果为 True,则将文档与 TrueType 字体一起保存。
SaveNativePictureFormat 如果为 True,则从其他系统平台(例如 Macintosh)导入的图形仅保存其 Windows 版本。
SaveFormsData           如果为 True,则将窗体中用户输入的数据存为一条数据记录。
SaveAsAOCELetter        如果文档包含一个附加,当此属性值为 True 时,将文档存为一篇 AOCE 信笺(同时保存邮件)。举例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
                          AddToRecentFiles=False);五、从数据库读取文件到本地硬盘和从本地硬盘读取文件到数据库在数据库上使用Image二进制字段保存,使用Stream流的方式。创建文件流:
     Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
     Word_FileStream.Position:=0;保存到数据库的Image字段:
     TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);从数据库读取文件到本地硬盘:
     TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);释放文件流:
     Word_FileStream.Free;六、全局消息的定义
因为word和Delphi程序是两个软件,相互之间通讯比较麻烦,所以使用全局消息的方法进行。
全局消息必须首先注册,Windows返回系统空闲的消息号,当注册的消息相同时,
Windows系统返回同一个值,这样就保证了使用这个消息号在两个程序之间通讯。定义消息的办法:
    szMessageString: pchar = 'XIDIAN_11_Stone';
    FMyJoinMessage := RegisterWindowMessage(szMessageString);发送消息的方法:
    SendMessage(对方句柄,消息,消息附带短变量,消息附带长变量)七、Delphi程序接收消息的方法
    Delphi接收消息有两种,一是重载特定消息,二是重载WndProc函数,在里面选择相应消息进行处理。
    法一,每次只能处理一条消息,而法二能够同时处理多条消息。    对于法二,声明如下:
       procedure WndProc(var Message: TMessage);override
     必须注意,使用时需要在处理完自己消息处理后继承WndProc(Message)函数,否则系统会崩溃!八、Word中Combo对话框的动态生成以及Change事件
    建立类模块Combohander,在内部定义事件
      Public WithEvents ComboBoxEvent As Office.CommandBarComboBox    定义Combo控件产生事件的模块
      Dim ctlComboBoxHandler As New ComboBoxHandler    产生Combo对话框
      Set Cbo_ChooseDoc = CommandBars("添加的菜单").Controls.Add(Type:=msoControlComboBox, Temporary:=True)    进行文件句柄设置,以产生Combo_Change事件
      Set ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc     产生事件后,在类模块Combohander内选择ComboBoxEvent的Change事件,即可书写事件代码
      Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)九、一些Word的事件
    VBA代码中处理的Word事件有:Document_Close
    Application事件中需要处理的有:DocumentBeforeClose,DocumentChange。    Document_Close:事件在文档关闭时产生事件
    DocumentBeforeClose:在文档被关闭以前先于Word判断文档是否保存,给出相应提示并进行相应处理。
    DocumentChange:文档切换,在文档从自己修改的文稿和其他人修改的文稿之间切换产生事件,
主要处理设置文档权限等。

解决方案 »

  1.   

    delphi本身没有提供severs控件的帮助,你可以参考以下VBA中的帮助,函数的参数及函数的用法基本一致.
      

  2.   

    用那种方法调用word的程序和麻烦的,你可以用Api函数来实现很简单.
    使用WinExec()函数
      UINT WinExec( 
        LPCSTR lpCmdLine, // 包含要执行的命令行
        UINT uCmdShow // 定义了以怎样的形式启动程序的常数值。);  参数说明:
      LPCSTR lpCmdLine: 包含要执行的命令行。
      系统将在以下范围查找应用程序:
      1. 应用程序启动位置
      2. 当前目录位置
      3. Windows system目录
      4. Windows 目录
      5. path中设置的路径列表  UNIT uCmdShow: 定义了以怎样的形式启动程序的常数值。具体说明如下:
      SW_HIDE 隐藏窗口,活动状态给令一个窗口 
      SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
      SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
      SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
      SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
      SW_SHOWMINIMIZED 最小化窗口,并将其激活 
      SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
      SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
      SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
      SW_SHOWNORMAL 与SW_RESTORE相同 
      例如:启动当前目录下的abc.exe 程序:
      WinExec( "abc.exe",SW_SHOW )。
      

  3.   

    请问楼上 junjie_zhao_2001(不感冒) 这样调用以后怎么对Word文档进行操作呢?
      

  4.   

    torble(阿裕:
    请问你怎样得到打开的WORD文档的窗口句柄呢??/好象FindWindow()无法找到
      

  5.   

    使用OLE方式开发控制oleapplication方法,应该是比较好点的(我想应该适用于对ole对象操作比较少的情况下,如果操作内容比较多还是用winexec()的api函数来启动相应的应用程序来操作)。
      

  6.   

    我也有这个苦恼,后来我曲线救国:
    1、用OLECONTAINER把文件显示出来,拷贝其内容
    2、然后利用TWordObject(在AutoImpl.pas定有了)显示Word程序
    3、粘贴拷贝的内容
    虽然麻烦点,但还是成功了,希望能对你有点帮助
      

  7.   

    可以用dephi自带的控件,也可以完全由自己调用函数控制word,本人这方面呈研究过,自己调用函数控制word更方便,dephi自带的控件使用起来很不方便。如有需要我可以提供更多的帮助
      

  8.   

    可以用dephi自带的控件,也可以完全由自己调用函数控制word,本人这方面呈研究过,自己调用函数控制word更方便,dephi自带的控件使用起来很不方便。如有需要我可以提供更多的帮助
      

  9.   

    启动Word时用如下代码: 
    begin
    try 
    Wordapplication.Connect; 
    except 
    MessageDlg('Word may not be installed', mtError, [mbOk], 0); 
    Abort; 
    end; 
    Wordapplication.Visible := True; 
    WordApplication.Caption := 'Delphi automation'; 
    end; 关闭Word用如下代码。如果想保存Doc文件,请修改SaveChanges变量的内容: 
    var 
    SaveChanges, OriginalFormat, RouteDocument: OleVariant; 
    begin 
    SaveChanges := WdDoNotSaveChanges; 
    OriginalFormat := UnAssigned; 
    RouteDocument := UnAssigned; 
    try 
    WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument); 
    WordApplication.Disconnect; 
    except 
    on E: Exception do 
    begin 
    Showmessage(E.Message); 
    WordApplication.Disconnect; 
    end; 
    end; 
    end; 让Word打开一个指定的文件,需要先放置OpenDialog,然后调用WordApplication.Documents.Open: 
    var 
    ItemIndex :OleVariant; 
    FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, 
    PasswordDocument, PasswordTemplate, Revert, 
    WritePasswordDocument, WritePasswordTemplate, Format: OleVariant; 
    begin 
    if not dlgOpen.Execute then 
    Exit; {Open document} 
    FileName := dlgOpen.FileName; 
    ConfirmConversions := False; 
    ReadOnly := False; 
    AddToRecentFiles := False; 
    PasswordDocument := ''; 
    PasswordTemplate := ''; 
    Revert := True; 
    WritePasswordDocument := ''; 
    WritePasswordTemplate := ''; 
    Format := wdOpenFormatDocument; WordApplication.Documents.Open( FileName, ConfirmConversions, 
    ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, 
    Revert, WritePasswordDocument, WritePasswordTemplate, Format ); {Assign WordDocument component} 
    ItemIndex := 1; 
    WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex)); {Turn Spell checking of because it takes a long time if enabled and slows down Winword} 
    WordApplication.Options.CheckSpellingAsYouType := False; 
    WordApplication.Options.CheckGrammarAsYouType := False; 
    end; 让Word替换标记字符串要使用WordDocument.Range.Find.Execute,这里用Delphi替换了<#Name>: 
    var 
    FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, 
    MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace: OleVariant; 
    begin 
    FindText := '<#Name>'; 
    MatchCase := False; 
    MatchWholeWord := True; 
    MatchWildcards := False; 
    MatchSoundsLike := False; 
    MatchAllWordForms := False; 
    Forward := True; 
    Wrap := wdFindContinue; 
    Format := False; 
    ReplaceWith := 'Delphi'; 
    Replace := True; WordDocument.Range.Find.Execute( FindText, MatchCase, MatchWholeWord, 
    MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, 
    Wrap, Format, ReplaceWith, Replace ); end; 
      

  10.   

    用OLE ,你是在什么情况下要调用Word?