Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Word-Automation im Hintergrund (https://www.delphipraxis.net/145272-word-automation-im-hintergrund.html)

bpel 28. Dez 2009 11:20


Word-Automation im Hintergrund
 
Hallo,
in verschiedenen Eigenentwicklungen in unserem Hause wurde für die Textverarbeitung Corel-WordPerfect erfolgreich eingesetzt. Nach einer Lizenzänderung wird nun in unserem Hause nur noch MS-Word verwendet und alle Verfahren müssen nun auf MS-Word umgestellt werden. Dabei bin ich auf ein Phänomen gestoßen, welches ich z.Z. nicht erklären kann und bitte nun um fachmännischen Rat:

Ich verwende die Komponente TWordApplication aus dem dclofficexp70-package und habe WordApplication.Visible := false gesetzt.
Bei der Programmschleifen-Wiederholungen stellt sich Word aus unerklärlichen Gründen auf sichtbar um und in den Vordergrund - dies geschied nach bzw. in der close-Anweisung des gedruckten Dokuments. Word soll aber ganz unsichtbar bleiben. Ich habe hin und her probiert und am Ende versucht mit absichtlichem Zurücksetzen des visible auf false eine verwendbare Version zu erhalten. Trotzdem flackert Word kurz auf, was mir nicht gefällt.
Im folgenden Code arbeite ich mit einem flag, da es Anwender gibt, die Word manchmal separat schon geöffnet hatten, dann soll Word sichtbar beiben....

Delphi-Quellcode:
  procedure TFormPruefZeit.tvAufruf (docName : String);//neuer tvAufruf mit Word und Vorlage
var tmpDot : OleVariant;
    tRange : Range;
    tName : OleVariant;
    tWhat : OleVariant;
    myDoc :_Document;
    OleStrFileName: OleVariant;
    OleTrue : OleVariant;
    flagWordSchonDa:boolean;//231209BP
begin
screen.Cursor:=crHourGlass;
if FormHaupt.Word.Visible = true then //231209BP
    flagWordSchonDa:=true
else
    flagWordSchonDa:=false;

tmpDot:= ExtractFilePath (Application.ExeName)+ docName;  //080409BP ExtractFilePath...
myDoc:=FormHaupt.Word.Documents.Add(tmpDot, emptyParam, emptyParam, emptyParam);
myDoc.Activate;
FormHaupt.Word.ScreenUpdating:=false;

//Daten in Textmarken übertragen
  tWhat:= wdGoToBookmark;
   tName:= 'TMAdresse1';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= FormHaupt.CoBoAnrede.Text;
   tName:= 'TMAdresse2';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= FormHaupt.EdVorname.Text + ' ' + FormHaupt.EdName.Text;
   tName:= 'TMAdresse3';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= FormHaupt.CoBoStrasse.Text + ' ' + FormHaupt.EdHNr.Text;
   tName:= 'TMAdresse4';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:=FormHaupt.EdPlz.Text + ' ' + FormHaupt.EdOrt.Text;
   tName:= 'TMAdresse5';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:='';
   tName:= 'TMAdresse6';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= '';
   tName:= 'TMAnrede';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:=FormelleAnrede;
   tName:= 'TMZeit';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= Prueftag + ', dem '
                          + FormHaupt.MEdPruefDat.Text
                          + ' um ' + PruefZeit + ' Uhr';
   tName:= 'TMOrt';
   tRange:=FormHaupt.Word.ActiveDocument.GoTo_(tWhat, emptyParam, emptyParam, tName);
   tRange.Text:= Treffpunkt;

   FormHaupt.Word.ScreenUpdating:=true;

   tmpdot:='C:\Temp\zulass.doc';
   MyDoc.SaveAs(tmpDot, emptyParam, EmptyParam, EmptyParam, //231209BP
                                    EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                    EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                    EmptyParam, EmptyParam, EmptyParam, EmptyParam);

   MyDoc.PrintOut(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                  EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                  EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

 
   MyDoc.Close(EmptyParam,EmptyParam,EmptyParam); //231209BP
   if Not flagWordSchonDa then //231209BP - aus irgend
   FormHaupt.Word.Visible:=false;
   screen.Cursor:=crDefault;
end;
Beim ersten Aufruf läuft alles, wie erwartet durch. Erst bei einem erneuten Aufruf der Druckroutine beginnt das Maleur.
Was kann ich tun?

Gruß bpel

Bernhard Geyer 28. Dez 2009 11:27

Re: Word-Automation im Hintergrund
 
Probier mal jedesmal einen neue Instanze der Wrapper-Komponente zu verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz