Как сделать Word невидимым во время автоматизации OLE от Delphi - PullRequest
6 голосов
/ 12 октября 2010

Из нашего приложения мы используем 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 ]

4 голосов
/ 12 октября 2010

Я поддерживаю автоматизацию Word для нашего программного обеспечения и также получаю сообщения о появлении окон Word в клиентах Citrix. Я не знаю, что вызывает это и как от него избавиться.

Есть только один способ, которым я могу смоделировать, что Word снова становится видимым, это открыть документ Word во время обработки вашего приложения. Но я не думаю, что это является причиной ваших проблем.

PS: Вы вызываете TWordApplication.Connect, а затем устанавливаете Visible в False. Помните, что когда вы вызываете Connect и не изменили ConnectKind, он подключится к работающему экземпляру Word. Когда ваш клиент редактирует документ, этот документ внезапно исчезнет. Возможно, лучше установить ConnectKind на NewInstance, чтобы вы всегда работали в новом процессе winword.exe. Существующий файл winword.exe останется доступным для вашего клиента, и он сможет продолжить работу над своим документом, пока ваше приложение обрабатывает другой.

Конечно, у этого подхода есть и недостатки:

  • Когда ваш клиент открывает новый документ Word, он открывается в вашем экземпляре Word
  • Вы можете получить ошибки при изменении Normal.dot другим приложением
3 голосов
/ 14 сентября 2014

Вместо использования 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

Как я могу вызвать documents.open и избежать диалога «файл используется»?

0 голосов
/ 31 марта 2018

в моем случае это произошло так же, как вы описали. Я смотрю, приложение все еще работает, даже если вы отключите. В первый раз он не будет показан, но как только у вас откроется второй, приложение будет видно. в моем случае это помогло явно приложению. Это только тот экземпляр, который выполняет работу в фоновом режиме. Другой открытый документ, отредактированный локальным пользователем, не будет затронут.

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