簡體   English   中英

如何在Delphi的OLE自動化過程中使Word不可見

[英]How to make Word invisible during OLE automation from Delphi

從我們的應用程序,我們使用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在編輯過程中仍然可見。 有什么理由可以做到這一點? 據我所知,使用某種遠程計算的客戶(如托管客戶端等)會出現問題。是否有一些額外的屬性可以處理僅在遠程桌面連接等情況下有效的應用程序可見性? 我對這些事情不是很了解:-(

我正在為我們的軟件維護Word自動化,並且還有關於Citrix客戶端中彈出Word窗口的報告。 我不知道是什么導致這種情況以及如何擺脫它。

只有一種方法可以模擬Word再次可見,並且在應用程序處理時打開Word文檔。 但我不認為這是你的問題的原因。

PS:您調用TWordApplication.Connect然后將Visible設置為False。 知道當你調用Connect並且你沒有更改ConnectKind時,它將連接到正在運行的Word實例。 當您的客戶正在編輯文檔時,該文檔將突然消失。 也許最好將ConnectKind設置為NewInstance,這樣您就可以使用新的winword.exe進程。 現有的winword.exe將保留給您的客戶端,並且當您的應用程序正在處理另一個時,他可以繼續處理他的文檔。

當然,這種方法也有一些缺點:

  • 當您的客戶端打開一個新的Word文檔時,它將在您的Word實例中打開
  • 您可以在Normal.dot上被另一個應用程序修改時出錯

而不是使用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;

如果您不關閉它,即使關閉Delphi應用程序,Word應用程序也將打開。

一些有用的資源,您可以在其中找到更多選項來打開/關閉Word文件:

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

如何調用documents.open並避免“正在使用的文件”對話框?

在我的情況下它發生的類似於你描述的。 即使斷開連接,我看起來應用程序仍在運行。 第一次它不會顯示,但只要你第二次打開,那么應用程序將是可見的。 在我的情況下,它有助於明確相當的應用程序。 它退出的只是在后台進行工作的實例。 不會觸及本地用戶編輯的另一個打開文檔。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM