![]() |
WordApplication in Thread ausführen?
Hi all,
ich benutze die WordApplication Componente um aus meinem Programm heraus Serienbriefe zu drucken. Mein Problem ist, das, wenn ein Serienbrief am drucken ist, meine Anwendung blockiert wird. Nun meine Frage, was es für möglichkeiten gibt dies zu unterbinden? Vermutrlich muß man mit Threads arbeiten - kenne mich dahingehend leider überhaupt nicht aus, und wollet mal schauen ob hier einer mal ähnliches gemacht hat. Evt. gibts ja auch eine ganz andrer Lösung - bin auf jeden Fall dankbar für eure Tips! Thx & Greets, ben |
Re: WordApplication in Thread ausführen?
Grundsätzlich ist sowas möglich. Jedoch solltest du hier die VCL-Wrapper vermeiden und direkt mit den COM-Objekten arbeiten. Und augrund meiner Erfahrungen mit Adobe-SW (ok, Adobe und SW-Qualität) ist es nicht umbedingt gesagt das dies im Thread ausgeführt stabil laufen muss. Aber Probieren geht über studieren.
|
Re: WordApplication in Thread ausführen?
Zitat:
Threads sind die übliche Lösung, aber zuvor sollte man nochmal nachdenken - meine Erfahrung ist, dass es in den meisten Fällen für die Hauptanwendung auch garnichts Sinnvolles zu tun gibt - also die Frage: was soll und kann deine Anwendung machen, während die Briefe gedruckt werden? Gruss Reinhard |
Re: WordApplication in Thread ausführen?
Hallo,
so bleibt nichts hängen:
Delphi-Quellcode:
procedure TForm1.WordStartenClick(Sender: TObject);
var Word: variant; begin inherited; Screen.Cursor := crHourglass; try {Es wird zuerst versucht, eine laufende Word-Instanz zu verwenden} word:=GetActiveOleObject('Word.Application'); except try {Läuft Word noch nicht, wird eine neue Verbindung aufgebaut} Word:=CreateOleObject('Word.Application'); except {Schlägt sie fehl (Word nicht installiert), gibt es eine Fehlermeldung} ShowMessage('Microsoft Word kann nicht starten.'); screen.cursor:=crDefault; exit; end; end; word.visible:=true; word:=unassigned; screen.cursor:=crDefault; end; |
Re: WordApplication in Thread ausführen?
warum bleibt so nichts hängen? Für mich sieht das so aus als ob einfach nur eine Sanduhr angezeigt wird aber sonst walles normal ist. (das soll keine Kritik sein sondern beschreibt das was ein Unwissender wie ich hier sehe)
wofür machst du zu beginn ein inherited? |
Re: WordApplication in Thread ausführen?
Noch was ist zu beachten:
Jeder Thread der mit COM arbeitet muss am Anfang "OLEInitialize" ausführen und am Ende "OLEUnInitialize"! Im Hauptthread einer Delphi-Anwendung muss man sich nicht darum kümmern, das macht das Laufzeitsystem schon. In eigenen Threads muss man sich allerdings selbst drum kümmern. Ciao, ralf |
Re: WordApplication in Thread ausführen?
Zitat:
Das könnte die Blockierungszeit so weit reduzieren, dass es akzeptabel wird. |
Re: WordApplication in Thread ausführen?
Hi all und Danke für eure ganzen antworten...werde nun nochmal versuchen den ganzen Kram in nen Thread zu packen, vieleicht klappts ja diesmal mit euren ratschlägen ;)
Zitat:
Delphi-Quellcode:
oder?)
word.PrintOut(false);
Das problem dabei ist: Es wird dann nicht mehr richtig ausgedruckt; der Drucker bekommt zwar seinen Auftrag und zeigt das er was drucken will, tut dies aber nicht. |
Re: WordApplication in Thread ausführen?
Hallo bwolf,
ich glaube nicht das man das mit einem Thread lösen kann, ich vermute vielmehr das, dass Problem an MSWord liegt. Mit PrintOut wird kein Ausdruck im Hintergrund ausgeführt. Wenn man also drucken will, so muss der Ausdruck im Vordergrund gestartet werden, was bedeutet das Word während dieser Zeit blockiert ist. Normaler Weise wird mit FALSE der Hintergrunddruck verhindert, sodass der Ausdruck auch erfolgt. Es gibt eine alternative zur PrintOut-Methode und zwar die Execute – Methode des Drucken – Dialogfeldes. Ich habe mal ein kleiner Code – Schnipsel als Beispiel. Er müsste natürlich noch an Deine Bedürfnisse angepasst werden. Für Serienbriefe habe ich die Exceute – Methode zwar noch nicht verwendet, aber vielleicht funktioniertes.
Delphi-Quellcode:
Bis bald Chemiker
procedure TForm1.Button1Click(Sender: TObject);
const coDoc= 'c:\Test.dot'; var Word: _Application; Doc: _Document; Para: Paragraph; aRange: Range; oleParam: OleVariant; begin Word:= CoWordApplication.Create; Word.Visible:= TRUE; oleParam:= coDoc; Word.Documents.OpenOld(oleParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam, EmptyParam); Word.Dialogs.Item(wdDialogFilePrint).Execute; ShowMessage('Alles Klar'); oleParam:= FALSE; Word.Quit(oleParam,EmptyParam,EmptyParam); end; |
Re: WordApplication in Thread ausführen?
Hallo,
ich suchte gerade nach einer Möglichkeit ein Worddokument über Delphi auszudrucken, da traf ich auf Chemikers Code. Allerdings stehe ich damit vor einem Rätsel! Kann mir bitte jemand verraten, warum der Code ohne Zeile 20
Delphi-Quellcode:
nichts ausdruckt???
ShowMessage('Alles Klar');
Gruß E-gon |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz