![]() |
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: |
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... |
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; |
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:
ersetzt.
TRY
GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^); StretchDIBits(Canvas.Handle, 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 |
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:
Wenn ich den Netzwerkdrucker zum Standarddrucker mache, druckt meine Anwendung richtig.
Printer.PrinterIndex := 2;
(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.) |
Re: Netzwerkdrucker spuckt nur leere Seiten aus
Nur mal so als Test, versuch mal Folgendes:
Delphi-Quellcode:
Die Unit Printers.pas hat leider schon seit Jahren so ihre Tücken...
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); ... Uwe |
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) |
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. |
Re: Netzwerkdrucker spuckt nur leere Seiten aus
Gibts dafür nicht auch Befehle in der API von Windows.
Gruß Matthias |
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:
Ich hab' nun in meiner Anwendung alle Schreibzugriffe auf Printer.PrinterIndex durch Printer.Setprinter ersetzt:
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;
Delphi-Quellcode:
wobei die Variable Druckername mit einem Eintrag aus Printer.Printers besetzt wird.
Printer.SetPrinter(PChar(Druckername),PChar('WINSPOOL'),PChar(''),0);
Jetzt druckt auch der vorher so faule Netzwerkdrucker! :dancer: Danke an alle, die mitgeholfen haben! :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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