从我们的应用程序中,我们使用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在编辑过程中仍然可见。有什么理由可以做到这一点?据我所知,使用某种远程计算的客户(如托管客户端等)会出现问题。是否有一些额外的属性可以处理仅在远程桌面连接等情况下有效的应用程序可见性?我对这些事情知之甚少: - (
答案 0 :(得分:3)
我正在为我们的软件维护Word自动化,并且还有Citrix客户端中出现Word窗口的报告。我不知道是什么原因以及如何摆脱它。
只有一种方法可以模拟Word再次可见,并且在应用程序处理时打开Word文档。但我不认为这是你问题的原因。
PS:您调用TWordApplication.Connect,然后将Visible设置为False。知道当你调用Connect并且你没有更改ConnectKind时,它将连接到正在运行的Word实例。当您的客户正在编辑文档时,该文档将突然消失。也许最好将ConnectKind设置为NewInstance,这样您就可以使用新的winword.exe进程。现有的winword.exe将保留给您的客户端,并且当您的应用程序正在处理另一个时,他可以继续处理他的文档。
当然,这种方法也有一些缺点:
答案 1 :(得分:3)
使用CreateOLEObject:
而不是使用TWordApplicationvar 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;