Autor Beitrag
dirksen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Win 7, Win 8, Win 2012 Server R2
Delphi 7, Delphi XE2, VS 2008
BeitragVerfasst: Do 17.11.16 14:37 
Hallo zusammen,

ich habe hier beim Drucken aus meiner Anwendung ein Problem.
Mein Druckauftrag wird an lokal angeschlossene Drucker ohne Probleme ausgedruckt, auch auf alle Netzwerkdrucker, die ich hier zur Verfügung habe.
Bei Kunden kommt es immer wieder vor, dass der Ausdruck bei Netzwerkdrucker nicht ausgedruckt wird. Der Druckjob wird in der Druckerwarteschlange
angezeigt mit der Anmerkung wird gedruckt, es passiert aber nichts. Der Druckauftrag bleibt in der Warteschlange. Stelle ich diese Drucker dann auf
"Druckaufträge direkt zum Drucker leiten" um, funktioniert das Ganze. Der Ausdruck aus z.B. Word auf diese Drucker funktioniert ganz normal.
Gedruckt wird der Inhalt eines Stringgrids über eine etwas abgewandelte Version des TJvGridPrinter bzw. TJvGridPreviewForm. Während des Ausdrucks kommt keine
Exception. Printer.BeginDoc und Printer.EndDoc werden ausgeführt, alles ganz normal.


Hat hier jemand von Euch eine Idee?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6213
Erhaltene Danke: 94

Windows 7
XE2
BeitragVerfasst: Do 17.11.16 15:00 
Bist du sicher, dass EndDoc durchgeführt wird?

Nach meiner Erfahrung:
Normalerweise beginnt der Druck erst mit erfolgreichem EndDoc. Auch wenn in der Warteschlange steht, dass gedruckt wird.
Die Umstellung auf direkten Druck, führt in der Regel dazu, dass tatsächlich sofort gedruckt wird, ohne auf EndDoc zu warten.

Es mag noch andere Ursachen geben, aber ich würde hier erst nochmal ganz sicher gehen wollen, ob EndDoc auch beim Kunden ganz bestimmt ausgeführt wird.
dirksen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Win 7, Win 8, Win 2012 Server R2
Delphi 7, Delphi XE2, VS 2008
BeitragVerfasst: Do 17.11.16 15:24 
Ja, bin sicher, da BeginDoc und EndDoc in try...finally gekapselt ist:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  Printer.Title := GridPrinter.PrintOptions.JobTitle;
  Printer.Copies := GridPrinter.PrintOptions.Copies;
  Printer.Orientation := GridPrinter.PrintOptions.Orientation;
  try 
    Printer.BeginDoc;
    DrawToCanvas(Printer.Canvas, pmPrint, 1, Grid.RowCount - 1);  
  finally
    Printer.EndDoc;
  end;
end;
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 150

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 18.11.16 05:17 
Das wird wohl der Grund sein, weil .EndDoc() im finally Block steht.
Scheint als würde die Methode DrawToCanvas() manchmal nicht gelingen, und dennoch versucht die Anwendung zu drucken, obwohl der Druckbereich unbekannt ist.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
dirksen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Win 7, Win 8, Win 2012 Server R2
Delphi 7, Delphi XE2, VS 2008
BeitragVerfasst: Fr 18.11.16 09:23 
Aber müsste dann nicht der gleiche Ausdruck, wenn ich ihn direkt zum Drucker sende nicht auch schief gehen bzw. unvollständig sein?
Werde mal in der DrawToCanvas Methode noch ein paar Logmessages einbauen und nach exceptions Ausschau halten.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6213
Erhaltene Danke: 94

Windows 7
XE2
BeitragVerfasst: Fr 18.11.16 09:48 
Das würde ich auch vermuten. Eine Prüfung kann aber sicher nicht schaden.

Aber prüfe doch mal, ob du irgendwo zwischendurch an den Drucker-Einstellungen etwas veränderst (Schacht, Auflösung, anderer Drucker zugewiesen, ...). Das könnte den Druckprozess stören und das EndDoc ins leere laufen lassen.