Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Netzwerkdrucker spuckt nur leere Seiten aus (https://www.delphipraxis.net/127979-netzwerkdrucker-spuckt-nur-leere-seiten-aus.html)

Jelen 22. Jan 2009 08:31


Netzwerkdrucker spuckt nur leere Seiten aus
 
Moin!
Die Verzweiflung ist groß genug, ein neues Thema zu beginnen. :wall:

Ein Netzwerkdrucker ignoriert die Druckaufträge meiner Anwendung:
Printer.BeginDoc ... auf Printer.Canvas zeichnen ... Printer.EndDoc
und: Nichts. Gar nichts passiert.

Wenn ich in meiner Anwendung zum 3. Mal auf Drucken klicke, bequemt sich der Drucker, ein leeres Blatt auszugeben, was er fortan bei jedem Druckauftrag macht.

Der Druckauftrag erscheint kurz in der Druckerwarteschlange (mit 5.7 MB, die angeblich auch übertragen wurden) und verschwindet viel zu schnell wieder (Kopieren einer 6 MB Datei dauert ca. 8 s, geniale 10 MBit Leitung).

Andere Programme (Word z.B.) drucken in derselben Umgebung problemlos.
Wenn ich mein Programm auf dem Rechner laufen lasse, wo der Drucker lokal angeschlossen ist (USB), funktioniert der Ausdruck! :gruebel:

Beide Rechner sind Win XP SP2 und verwenden denselben Druckertreiber.

Hat jemand sowas schon mal gelöst oder 'ne Idee, wo ich suchen soll?
Danke für Eure Hilfe!
:hello:

Morphie 22. Jan 2009 09:23

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Wenn Word ohne Probleme drucken kann, würde ich den Fehler in deinem Code suchen.
Poste doch mal ein paar Zeilen...

Jelen 22. Jan 2009 11:08

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Die Orginal-Druckroutine ist reichlich komplex.
Ich hab' sie auf ein Minimum zusammengestrichen und in eine neutrale Testanwendung gesteckt. Diese "Minimalfunktion" zeigt dasselbe Problem, der Druckauftrag steht kurz in der Warteschlange und verschwindet dann. Allerdings kommt die Leerseite jetzt auch nicht mehr immer.
Folgenden Code habe ich verwendet:
Delphi-Quellcode:
procedure TForm1.DrucktestClick(Sender: TObject);
 var p,y: integer;
     zeile: string;
 begin
  Printer.PrinterIndex := 2;
  Printer.Orientation := poPortrait;
  Printer.Copies := 1;
  Printer.Title := 'Drucktest';
  Printer.BeginDoc;
  with Printer.Canvas
  do begin
      Font.Name := 'Arial';
      Font.Size := 8;
      Font.Style := [];
      Pen.Color := clBlack;
      Font.Color := clBlack;
     end;
  p := 1;   y := 0;
  while p <= 30
  do begin
      zeile := IntToStr(p)+'. Zeile';
      Printer.Canvas.TextOut(50,y,zeile);
      inc(y,200);
      inc(p);
     end;
  Printer.EndDoc;
 end;

matashen 22. Jan 2009 12:28

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Ich hatte mal vor langer Zeit das problem, aber nur beim Druck von Grafiken. Da war eine Fehlerhaftes Ergebnis bei getmem, und ich hab das dannmit

Delphi-Quellcode:
  TRY
    GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);

    StretchDIBits(Canvas.Handle,
ersetzt.

Bei deiner Textpositioniereung solltest du auch die Startposition und die Auflösung des Druckers mit einberechnen, sonst siehts auf jedem Drucker anders aus.

Gruß Matthias

Jelen 22. Jan 2009 12:46

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Das ist richtig. Im Originalprogramm ist das auch so gelöst.
Hier geht es mir nur um das Problem, das einfach gar nichts gedruckt wird und der Drucker leere Seiten auswirft.
Inzwischen hab' ich herausgefunden, das es irgendwie an der Auswahl des Druckers hängt:
Delphi-Quellcode:
  Printer.PrinterIndex := 2;
Wenn ich den Netzwerkdrucker zum Standarddrucker mache, druckt meine Anwendung richtig.
(Das kann aber nicht die Lösung sein, schließlich "merkt" sich mein Programm den zuletzt benutzten Drucker - unabhängig vom Windows-Standarddrucker - und spricht ihn beim nächsten Mal automatisch wieder an.)

Uwe Raabe 22. Jan 2009 13:18

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Nur mal so als Test, versuch mal Folgendes:

Delphi-Quellcode:
var
  tmpDevice, tmpDriver, tmpPort: array[0...1024] of Char;
  tmpDeviceMode: THandle;

...
Printer.PrinterIndex := 2;
Printer.GetPrinter(tmpDevice, tmpDriver, tmpPort, tmpDeviceMode);
Printer.SetPrinter(tmpDevice, tmpDriver, tmpPort, tmpDeviceMode);
...
Die Unit Printers.pas hat leider schon seit Jahren so ihre Tücken...

Uwe

WS1976 22. Jan 2009 13:20

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Hallo,

wie machst du das mit dem merken des Druckers?
Nimm mal Testweise den Printdialog mit rein und wähle den Drucker Testweise aus.
Ich habe das Gefühl du erwischst irgendwie einen falschen Druckertreiber.
Habt ihr, auf eurem Server, mehrere Druckertreiber parallel installiert?
Wir hatten das hier schon, dass ein Drucker für Winnt, Win2k und WinXP genutzt wurde und
dafür die entsprechenden Treiber parallel installiert wurden.
Das ist aber sicherlich eine Frage die du deinem Agmin stellen solltest.

Grüsse
Rainer (ehem. Systemadministrator)

Jelen 22. Jan 2009 14:10

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
@Uwe Raabe: GetPrinter/Setprinter ändert das Problem leider nicht.

@WS1976: "Merken" des Druckers: Druckername in Datei speichern, beim nächsten Ausdruck gespeicherten Druckernamen in Printer.Printers suchen und Printer.Printerindex entsprechend setzen.

Laut dem Fenster "Zusätzliche Treiber" unter den Eigenschaften des Druckers auf dem hier als Server dienenden Rechner ist nur ein Treiber für Win2K / XP installiert.

Aber: Wenn ich den PrintDialog verwende, funktioniert es! :thumb:
Das hilft nur leider nicht weiter, weil ich meinen eigenen Druckdialog einsetzen möchte ...
Im Sourcecode von PrintDialog werden Varianten von GetPrinter und SetPrinter verwendet.
Ich mach' mich an die Arbeit, den entscheidenden Unterschied rauszufinden.

matashen 22. Jan 2009 15:14

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Gibts dafür nicht auch Befehle in der API von Windows.

Gruß Matthias

Jelen 24. Jan 2009 08:25

Re: Netzwerkdrucker spuckt nur leere Seiten aus
 
Das Problem steckt vermutlich in den Schreibzugriffen auf Printer.PrinterIndex, die im besten Fall eine Auswahl des Standarddruckers auslösen, aber Zugriffe auf andere Drucker der Statussteuerung in TPrinter überlassen, die dann zwar einen Gerätekontext herstellt, aber keinen WIN API OpenPrinter Aufruf erzeugt (Zitat aus unit Printers): :warn:
Delphi-Quellcode:
procedure TPrinter.SetPrinterIndex(Value: Integer);
begin
  CheckPrinting(False);
  if (Value = -1) or (PrinterIndex = -1) then SetToDefaultPrinter
  else if (Value < 0) or (Value >= Printers.Count) then RaiseError(SPrinterIndexError);
  FPrinterIndex := Value;
  FreeFonts;
  SetState(psNoHandle);
end;
Ich hab' nun in meiner Anwendung alle Schreibzugriffe auf Printer.PrinterIndex durch Printer.Setprinter ersetzt:
Delphi-Quellcode:
  Printer.SetPrinter(PChar(Druckername),PChar('WINSPOOL'),PChar(''),0);
wobei die Variable Druckername mit einem Eintrag aus Printer.Printers besetzt wird.
Jetzt druckt auch der vorher so faule Netzwerkdrucker! :dancer:
Danke an alle, die mitgeholfen haben!
:cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 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