2010-10-12 8 views
5

Dalla nostra applicazione utilizziamo l'automazione OLE per creare un documento Word piuttosto complesso. Mi piacerebbe rendere Word invisibile mentre il documento è in fase di realizzazione, dal momento che ci sono molte incisioni e inserimenti che richiedono molto tempo.Come rendere invisibile Word durante l'automazione OLE da Delphi

Io uso il seguente codice per stabilire una connessione di 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;  

e io uso il seguente codice per aprire un documento esistente, che viene poi modificato dalla mia domanda.

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; 

Funziona sul mio computer! (TM)

Per alcuni dei nostri clienti, Word rimane visibile durante il processo di modifica. Quali ragioni possono esserci per questo? Per quanto posso dire il problema sorge per i clienti che usano una sorta di computer remoto, come client gestiti, ecc. Ci sono alcune proprietà aggiuntive che riguardano la visibilità delle applicazioni che hanno effetto solo durante le connessioni desktop remote, ecc? Non sono molto ben informato su queste cose :-(

risposta

4

Gestisco l'automazione di Word per il nostro software e ho anche segnalazioni di finestre di Word che spuntano nei client Citrix. Non so cosa causa questo e come

Esiste un solo modo per simulare che Word diventi nuovamente visibile e che stia aprendo un documento Word durante l'elaborazione della tua applicazione, ma non credo che sia la causa dei tuoi problemi

PS: Si chiama TWordApplication.Connect e quindi si imposta Visible su False. Sapere che quando si chiama Connect e non si è modificato ConnectKind, esso si connetterà a un'istanza in esecuzione di Word. Quando il client sta modificando un documentare questo documento scomparirà improvvisamente. Forse è meglio impostare ConnectKind su NewInstance in modo da lavorare sempre con un nuovo processo winword.exe. Il winword.exe esistente rimarrà disponibile per il tuo cliente e potrà continuare a lavorare sul suo documento mentre l'applicazione sta elaborando l'altro.

Naturalmente questo approccio ha alcuni svantaggi troppo:

  • Quando il client apre un nuovo documento Word, si apre nella vostra istanza di Word
  • È possibile ottenere gli errori sul Normal.dot venga modificato da un'altra applicazione
+0

Grazie per l'input. Proverò a cambiare ConnectKind in NewInstance.Lascerò questa domanda aperta, quindi se dovessi trovare una risposta alla domanda di visibilità per favore lascia una riga :-) –

1

Invece di usare TWordApplication, utilizzare CreateOleObject:

var WordApp: Variant; 

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

Per chiudere con grazia:

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

Se non si chiude, l'applicazione Word sarà aperta anche dopo che il vicino l'applicazione Delphi.

Alcune risorse utili, dove è possibile trovare ulteriori opzioni per aprire/chiudere Word Files:

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

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

Problemi correlati