Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi WordApplication in Thread ausführen? (https://www.delphipraxis.net/108475-wordapplication-thread-ausfuehren.html)

bwolf 14. Feb 2008 11:33


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

Bernhard Geyer 14. Feb 2008 12:04

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.

Reinhard Kern 14. Feb 2008 14:49

Re: WordApplication in Thread ausführen?
 
Zitat:

Zitat von bwolf
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

Hallo,

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

ManuelR 14. Feb 2008 15:05

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;

SirThornberry 14. Feb 2008 15:38

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?

Ralf Kaiser 14. Feb 2008 16:31

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

shmia 14. Feb 2008 16:43

Re: WordApplication in Thread ausführen?
 
Zitat:

Zitat von bwolf
Mein Problem ist, das, wenn ein Serienbrief am drucken ist, meine Anwendung blockiert wird.

Schon versucht, Word im Hintergrund drucken zu lassen ?
Das könnte die Blockierungszeit so weit reduzieren, dass es akzeptabel wird.

bwolf 22. Feb 2008 15:34

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:

Zitat von shmia
Zitat:

Zitat von bwolf
Mein Problem ist, das, wenn ein Serienbrief am drucken ist, meine Anwendung blockiert wird.

Schon versucht, Word im Hintergrund drucken zu lassen ?
Das könnte die Blockierungszeit so weit reduzieren, dass es akzeptabel wird.

Ja das habe ich schon probiert...(das ging doch mit
Delphi-Quellcode:
word.PrintOut(false);
oder?)
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.

Chemiker 22. Feb 2008 22:51

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:
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;
Bis bald Chemiker

e-gon 2. Sep 2009 11:33

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:
ShowMessage('Alles Klar');
nichts ausdruckt???

Gruß
E-gon


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Seite 1 von 2  1 2      

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