![]() |
automatische Druckerauswahl funktioniert nicht immer
Hi allerseits,
Delphi 4 (update 3), WinNT4 bzw. WinXP Ich habe eine Anwendung, die auf diverse Drucker drucken soll. Dabei soll der Benutzer nicht mit der Druckerauswahl belästigt werden, sondern ich habe die Auswahl des Druckers fest in einer ini-Datei eingebaut. Um den Drucker festzulegen, verwende ich folgenden Code (s.u.), der in diversen Newsforen empfohlen wurde.
Delphi-Quellcode:
Es ist jetzt schon zu häufig passiert, dass der Drucker nicht wechselt, sondern auf den Windows-Standard-Drucker ausgegeben wird. Erst beim Neustart des Programms funktioniert der Wechsel wieder. Der Fehler tritt unter NT4 auf, da unsere Clients vorwiegend NT-Maschinen sind.
procedure TFMain.SetDefaultPrinter(PrinterName: String);
var i: Integer; Device, Driver, Port : PChar; HdeviceMode: Thandle; aPrinter : TPrinter; begin Printer.PrinterIndex := -1; OriginalDrucker := Printer.Printers[Printer.PrinterIndex]; getmem(Device, 255); getmem(Driver, 255); getmem(Port, 255); aPrinter := TPrinter.create; for i := 0 to Printer.printers.Count-1 do begin if (uppercase(Printer.printers[i]) = uppercase(PrinterName)) then begin aprinter.printerindex := i; aPrinter.getprinter(device, driver, port, HdeviceMode); StrCat(Device, ','); StrCat(Device, Driver ); StrCat(Device, Port ); WriteProfileString('windows', 'device', Device); StrCopy( Device, 'windows' ); SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@Device)); end; end; Freemem(Device, 255); Freemem(Driver, 255); Freemem(Port, 255); aPrinter.Free; end; Woran kann das liegen? Oder kann mir jemand einen Tipp geben, wie ich das ganze umgehen kann? Gruß Peter P.S.: SORRY, habe gerade gemerkt, dass ich den falschen Code eingefügt hatte. Das ist aber jetzt korrigiert! |
Re: automatische Druckerauswahl funktioniert nicht immer
Deine Funktion macht keinen Mucks, wenn der übergebene Druckername nicht gefunden wird.
Hier solltest du besser eine Exception auslösen. Manchmal (abhängig vom OS) wird der Druckername in Printer.Printers[] so gemeldet:
Code:
Die könnte dazu führen, dass der Vergleich der Druckernamen fehlschlägt.
Druckername an LPT1:
Deskjet 1200 on LPT2: |
Re: automatische Druckerauswahl funktioniert nicht immer
Woran kann es denn liegen, dass es auf dem selben Rechner manchmal funktioniert und manchmal nicht?
Dieses Fehlverhalten habe ich von gestern auf heute an drei verschiedenen Rechnern feststellen können. |
Re: automatische Druckerauswahl funktioniert nicht immer
Hi,
ich habe eine ähnliche Vorlage gefunden wie shmia (von Peter Below, Team B) und abgewandelt :
Delphi-Quellcode:
Kann man das so verwenden ? Oder kann ich auch drucken, ohne dauernd diese Prozedur zu bemühen ? Gehen tut das schon so, auch mit Netzwerkdruckern.
procedure Drucke (st : string);
var BytesWritten: DWORD; hPrinter: THandle; DocInfo: TDocInfo1; begin if not WinSpool.OpenPrinter(DruckerName, hPrinter, nil) then raise exception.create('Drucker nicht gefunden !'); try DocInfo.pDocName := DruckerName; // von INI festgelegter Standard-Drucker // beeinflußt Win-Standarddrucker nicht ! DocInfo.pOutputFile := Nil; DocInfo.pDatatype := 'RAW'; if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then Abort; try if not StartPagePrinter(hPrinter) then Abort; try if not WritePrinter(hPrinter, @st[1], Length(st), BytesWritten) then Abort; finally EndPagePrinter(hPrinter); end; finally EndDocPrinter(hPrinter); end; finally WinSpool.ClosePrinter(hPrinter); end; end; procedure DruckLn (st : string); begin Drucke (st+chr (10) + chr (13)); end; Und dann noch das :
Delphi-Quellcode:
Habe festgestellt, daß eine Änderung von "RAW" dazu führt, daß der Drucker nicht druckt. Außerdem vermisse ich die Hilfe dazu. Ist die eventuell im Win-SDK ?
DocInfo.pDatatype := 'RAW';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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-2025 by Thomas Breitkreuz