2010-10-12 49 views
5

从我们的应用程序中,我们使用OLE自动化来构建相当复杂的Word文档。我希望在制作文档时让Word看不见,因为粘贴和插入的时间很长。如何让Word在Delphi自动化OLE自动化过程中不可见

我使用下面的代码来建立一个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在编辑过程中可见。这有什么原因?据我所知,使用某种远程计算的客户(如托管客户端等)会出现问题。是否有一些其他属性可以处理仅在远程桌面连接等情况下才有效的应用程序可见性?我没有这样的事情非常熟悉:-(

回答

4

我保持我们的软件的话自动化,还曾经的话语窗户Citrix客户端弹出的报告。我不知道是什么原因导致这个问题以及如何摆脱它

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

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

Ofcourse这种方法也有一些缺点,太:

  • 当你的客户端打开一个新的Word文档,它在你的Word实例打开
  • 你可以在Normal.dot错误被修正
+0

感谢您的输入。我会尝试将ConnectKind更改为NewInstance。我将把这个问题留给开放,所以如果你找到了可视性问题的答案,请放下一行:-) – 2010-10-15 08:11:22

1

而不是使用TWordApplication的其他应用程序,使用CreateOLEObject:

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; 

如果不关闭它,Word应用程序甚至会后你闭上你的Delphi应用程序是开放的。

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

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

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