2010-10-12 9 views
5

Von unserer Anwendung verwenden wir OLE-Automatisierung, um ein ziemlich komplexes Word-Dokument zu erstellen. Ich möchte Word während der Erstellung des Dokuments unsichtbar machen, da viel Einfügen und Einfügen ziemlich lange dauert.Wie man Word während der OLE-Automatisierung von Delphi aus unsichtbar macht

Ich verwende den folgenden Code ein Word-Verbindung herzustellen:

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;  

Und ich verwende den folgenden Code ein vorhandenes Dokument zu öffnen, die dann durch meine Anwendung bearbeitet wird.

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; 

Es funktioniert auf meinem Computer! (TM)

Für einige unserer Kunden bleibt Word während des Bearbeitungsprozesses sichtbar. Welche Gründe kann es dafür geben? Soweit ich das beurteilen kann, tritt das Problem bei Kunden auf, die irgendeine Art von Remote-Computing verwenden, wie verwaltete Clients usw. Gibt es einige zusätzliche Eigenschaften, die sich mit der Anwendungssichtbarkeit befassen, die nur während Remote-Desktop-Verbindungen usw. wirksam sind? Ich bin nicht sehr kenntnisreich über solche Dinge :-(

Antwort

4

Ich halte die Word-Automatisierung für unsere Software und hatte auch Berichte von Word-Fenstern in Citrix-Clients auftauchen. Ich weiß nicht, was dies verursacht und wie loswerden

Es gibt nur einen Weg, wie ich Word simulieren kann, das wieder sichtbar wird und das ein Word-Dokument öffnet, während Ihre Anwendung verarbeitet. Aber ich glaube nicht, dass das die Ursache Ihrer Probleme ist.

PS: Sie rufen TWordApplication.Connect und dann setzen Sie Visible auf False.Kennen Sie, dass wenn Sie Connect aufrufen und Sie ConnectKind nicht geändert haben, wird eine Verbindung zu einer laufenden Instanz von Word hergestellt.Wenn Ihr Client bearbeitet a dokumentieren dieses Dokument wird plötzlich verschwinden. Vielleicht ist es besser, ConnectKind auf NewInstance zu setzen, damit Sie immer in einem neuen winword.exe-Prozess arbeiten. Die vorhandene winword.exe bleibt für Ihren Kunden verfügbar und er kann weiter an seinem Dokument arbeiten, während Ihre Anwendung die andere verarbeitet.

Ofcourse diesem Ansatz hat einige Nachteile zu:

  • Wenn Ihr Client öffnet ein neues Word-Dokument, es in die Instanz von Word
  • Sie geöffnet wird, kann auf Normal.dot erhalten Fehler, die durch modifiziert werden eine andere Anwendung
+0

Vielen Dank für die Eingabe. Ich werde versuchen, ConnectKind zu NewInstance zu ändern.Ich werde diese Frage offen lassen, wenn Sie also eine Antwort auf die Sichtbarkeitsfrage finden, schreiben Sie bitte eine Zeile :-) –

1

Statt TWordApplication zu verwenden, verwenden CreateOleObject:

var WordApp: Variant; 

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

Um es anmutig zu schließen:

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

Wenn Sie schließen es nicht, wird Word-Anwendung auch nach Ihrer Nähe Ihrer Delphi-Anwendung geöffnet.

einige nützliche Ressourcen, wo Sie weitere Optionen Word-Dateien zum Öffnen/Schließen finden:

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

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