2010-10-12 11 views
5

Desde nuestra aplicación utilizamos la automatización OLE para compilar un Word-document bastante complejo. Me gustaría hacer que Word sea invisible mientras se está haciendo el documento, ya que hay muchas pegadas e inserciones que llevan bastante tiempo.Cómo hacer que Word sea invisible durante la automatización OLE desde Delphi

uso el siguiente código para establecer una conexión Palabra:

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;  

Y uso el siguiente código para abrir un documento existente, que se editó luego por mi solicitud.

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; 

¡Funciona en mi computadora! (TM)

Para algunos de nuestros clientes Word permanece visible durante el proceso de edición. ¿Qué razones puede haber para esto? Por lo que puedo decir, el problema surge para los clientes que utilizan algún tipo de computación remota, como clientes administrados, etc. ¿Hay algunas propiedades adicionales que se ocupan de la visibilidad de la aplicación que solo tienen efecto durante las conexiones de escritorio remoto, etc.? No estoy muy enterado de tales cosas :-(

Respuesta

4

Estoy manteniendo la automatización de Word para nuestro software y también tuve informes de ventanas de Word apareciendo en clientes Citrix. No sé qué causa esto y cómo deshacerse de él.

Solo hay una forma en que puedo simular que Word vuelva a ser visible y que abre un documento de Word mientras se procesa su aplicación. Pero no creo que esa sea la causa de sus problemas.

PD: llama a TWordApplication.Connect y luego establece Visible en False. Sepa que cuando llame a Connect y no haya cambiado ConnectKind, se conectará a una instancia de Word en ejecución. Cuando su cliente está editando un documentar este documento desaparecerá repentinamente. Tal vez sea mejor configurar ConnectKind a NewInstance para que siempre trabaje en un nuevo proceso winword.exe. El winword.exe existente seguirá disponible para su cliente y puede continuar trabajando en su documento mientras su aplicación está procesando el otro.

Por supuesto este método tiene algunas desventajas también:

  • Cuando el cliente abre un nuevo documento Word, que se abre en su instancia de Word
  • Puede obtener errores en Normal.dot siendo modificada por otra aplicación
+0

Gracias por la entrada. Intentaré cambiar ConnectKind a NewInstance.Voy a dejar esta pregunta abierta, así que si alguna vez encuentras una respuesta a la pregunta de visibilidad, por favor escribe una línea :-) –

1

En lugar de utilizar TWordApplication, utilice CreateOleObject:

var WordApp: Variant; 

procedure OpenWordFIle(const Filename: String); 
begin 
    WordApp := CreateOLEObject('Word.Application'); 
    WordApp.Visible := False; 
    WordApp.Documents.Open(Filename); 
    Application.ProcessMessages; 
end; 

Para cerrar con gracia:

procedure CloseWordFile; 
begin 
    WordApp.ActiveDocument.Close($00000000); 
    WordApp.Quit; 
    WordApp := unassigned; 
end; 

Si no cierra, aplicación de Word estará abierta incluso después de su cierre su aplicación Delphi.

Algunos recursos útiles donde se puede encontrar más opciones para abrir/cerrar archivos de Palabra:

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

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

Cuestiones relacionadas