如何在 Delphi 的 OLE 自动化过程中使 Word 不可见
Posted
技术标签:
【中文标题】如何在 Delphi 的 OLE 自动化过程中使 Word 不可见【英文标题】:How to make Word invisible during OLE automation from Delphi 【发布时间】:2010-10-12 08:06:13 【问题描述】:在我们的应用程序中,我们使用 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 在编辑过程中仍然可见。这可能有什么原因?据我所知,对于使用某种远程计算的客户(例如托管客户端等)会出现问题。是否有一些额外的属性可以处理仅在远程桌面连接等期间有效的应用程序可见性?我对这些事情不是很了解:-(
【问题讨论】:
【参考方案1】:我正在为我们的软件维护 Word 自动化,并且在 Citrix 客户端中弹出 Word 窗口的报告。我不知道是什么原因造成的以及如何摆脱它。
只有一种方法可以模拟 Word 再次变得可见,即在您的应用程序处理时打开 Word 文档。但我认为这不是造成您问题的原因。
PS:您调用 TWordApplication.Connect 然后将 Visible 设置为 False。知道当您调用 Connect 并且您没有更改 ConnectKind 时,它将连接到正在运行的 Word 实例。当您的客户正在编辑文档时,该文档会突然消失。也许最好将 ConnectKind 设置为 NewInstance 以便您始终在新的 winword.exe 进程中工作。现有的 winword.exe 将仍然可供您的客户使用,他可以在您的应用程序处理另一个文档时继续处理他的文档。
当然,这种方法也有一些缺点:
当您的客户端打开一个新的 Word 文档时,它会在您的 Word 实例中打开 Normal.dot 被其他应用程序修改时会出现错误【讨论】:
感谢您的意见。我将尝试将 ConnectKind 更改为 NewInstance。我将保留这个问题,所以如果您找到可见性问题的答案,请写下一行:-)【参考方案2】:不使用 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?
【讨论】:
我相信@Josir 必须出于正当理由给出这个答案,并且获得了 3 票。请问为什么CreateOLEObject
而不是TWordApplication
可以解决问题?谢谢。【参考方案3】:
在我的情况下,它的发生与您描述的相似。即使您断开连接,我看起来应用程序仍在运行。第一次它不会显示,但是一旦您打开第二次,应用程序就会可见。就我而言,它有助于明确地应用程序。它退出只是在后台执行工作的实例。本地用户编辑的另一个打开的文档不会被触及。
WordDocument.Disconnect;
**WordApplication.Quit;**
WordApplication.Disconnect;
【讨论】:
以上是关于如何在 Delphi 的 OLE 自动化过程中使 Word 不可见的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 OLE 的情况下在 delphi 中将 word 文档转换为 pdf?
win7 delphi 调用 语音控件TSpVoice Speak 方法报 OLE error 8004503A 错 怎么解决?