如何在Delphi的OLE自动化过程中使Word不可见

时间:2010-10-12 08:06:14

标签: delphi ms-word ole

从我们的应用程序中,我们使用OLE自动化来构建一个相当复杂的Word文档。我希望在制作文档时使Word不可见,因为有很多粘贴和插入需要相当长的时间。

我使用以下代码建立Word连接:

function ConnectToWord : TWordAutomationResult;
begin
  WordApp := TWordApplication.Create(nil);

  try
    WordApp.Connect;
    WordApp.Visible := false; 
  except on E: Exception do
    begin
      Result := waeErrorConnectingToWord;
      exit;
    end;
  end;
end;      

我使用以下代码打开现有文档,然后由我的应用程序进行编辑。

function TWordAUtomation.OpenDocument(aFileName: string) : WordDocument;
var vFileName,
    vConfirmConversions,
    vReadOnly,
    vAddToRecentFiles,
    vPasswordDocument,
    vPasswordTemplate,
    vRevert,
    vWritePasswordDocument,
    vWritePasswordTemplate,
    vFormat,
    vEncoding,
    vVisible,
    vOpenConflictDocument,
    vOpenAndRepair,
    vWdDocumentDirection,
    vNoEncodingDialog  : OleVariant;
begin
  Result := nil;
  if not FileExists(aFileName) then exit;

  vFileName                := aFileName;
  vConfirmConversions      := True;
  vReadOnly                := False;
  vAddToRecentFiles        := False;
  vPasswordDocument        := EmptyParam;
  vPasswordTemplate        := EmptyParam;
  vRevert                  := True; 
  vWritePasswordDocument   := EmptyParam;
  vWritePasswordTemplate   := EmptyParam;
  vFormat                  := wdOpenFormatAuto;
  vEncoding                := EmptyParam;
  vVisible                 := False; //Document should be invisible
  vOpenConflictDocument    := EmptyParam;
  vOpenAndRepair           := EmptyParam;
  vWdDocumentDirection     := EmptyParam;
  vNoEncodingDialog        := EmptyParam;

  Result := WordApp.Documents.Open(vFileName, vConfirmConversions, vReadOnly, vAddToRecentFiles, vPasswordDocument, vPasswordTemplate, vRevert, vWritePasswordDocument, vWritePasswordTemplate, vFormat, vEncoding, vVisible, vOpenAndRepair, vWdDocumentDirection, vNoEncodingDialog);
end;

它适用于我的电脑! (TM)

对于我们的一些客户,Word在编辑过程中仍然可见。有什么理由可以做到这一点?据我所知,使用某种远程计算的客户(如托管客户端等)会出现问题。是否有一些额外的属性可以处理仅在远程桌面连接等情况下有效的应用程序可见性?我对这些事情知之甚少: - (

3 个答案:

答案 0 :(得分:3)

我正在为我们的软件维护Word自动化,并且还有Citrix客户端中出现Word窗口的报告。我不知道是什么原因以及如何摆脱它。

只有一种方法可以模拟Word再次可见,并且在应用程序处理时打开Word文档。但我不认为这是你问题的原因。

PS:您调用TWordApplication.Connect,然后将Visible设置为False。知道当你调用Connect并且你没有更改ConnectKind时,它将连接到正在运行的Word实例。当您的客户正在编辑文档时,该文档将突然消失。也许最好将ConnectKind设置为NewInstance,这样您就可以使用新的winword.exe进程。现有的winword.exe将保留给您的客户端,并且当您的应用程序正在处理另一个时,他可以继续处理他的文档。

当然,这种方法也有一些缺点:

  • 当您的客户打开一个新的Word文档时,它将在您的Word实例中打开
  • 您可以在正在被其他应用程序修改的Normal.dot上获得错误

答案 1 :(得分:3)

使用CreateOLEObject:

而不是使用TWordApplication
var WordApp: Variant;

procedure OpenWordFIle( const Filename: String );
begin
  WordApp := CreateOLEObject('Word.Application');
  WordApp.Visible := False;
  WordApp.Documents.Open( Filename );
  Application.ProcessMessages;
end;

优雅地关闭它:

procedure CloseWordFile;
begin
   WordApp.ActiveDocument.Close( $00000000 );
   WordApp.Quit;
   WordApp := unassigned;
end;

如果你不关闭它,即使你关闭了Delphi应用程序,Word应用程序也会打开。

一些有用的资源,您可以在其中找到更多选项来打开/关闭Word文件:

http://msdn.microsoft.com/en-us/library/office/ff835182.aspx

How can I call documents.open and avoid the 'file in use' dialog?

答案 2 :(得分:0)

在我的情况下,它发生的类似于你所描述的。即使断开连接,我看起来应用程序仍在运行。第一次它不会显示,但只要你第二次打开,那么应用程序将是可见的。在我的情况下,它有助于明确相当的应用程序。它退出的只是在后台进行工作的实例。不会触及本地用户编辑的另一个打开文档。

WordDocument.Disconnect;
**WordApplication.Quit;**
WordApplication.Disconnect;