![]() |
Drucken auf „Ne: 0?“ - Leidensgeschichte
Hallo,
ich habe seit geraumer Zeit folgendes Problem, das mir langsam aber sicher die letzten Nerven raubt, daher auch ein längerer Text, sorry und Danke fürs Lesen. Wir haben auf Arbeit 3 Zimmer, in dem je ein Nadeldrucker für Durchschlagsdokumente steht, darauf Drucken jeweils 3-5 Personen. Zusätzlich hat jeder noch mind. 2 Laserdrucker eingerichtet, einen Thermal-Drucker für UPS-Aufkleber und irgendwelche Dummy-Drucker für andere Anwendungen. Jeder Bearbeiter hat so um die 5-7 Drucker eingerichtet und das unterscheidet sich pro Rechner auch. Die Nadeldrucker sind A3-Flachbettnadeldrucker und dafür ausgelegt, dass man jedes Blatt einzeln einlegt, kein Endlospapier, da wir auf die unterschiedlichsten Formulare drucken. Rechner sind alle W2K oder WinXP. Zu den Formularen: leider ist es unter Win2k nicht mehr möglich, eigene Papierformate zu vergeben. Man kann zwar eine Papiergröße z.B. 31x21 cm einstellen, der Druck wird auf dem Nadeldrucker aber verschoben und die Positionen stimmen nicht. Ich brauche aber größere Formate, die Formulare besitzen alle einen Perforationsrand, und ich komme mit dem normalen A4-Format nicht mehr hin und liege außerhalb des Druckbereichs. Deswegen sind fast alle Doks auf A3 eingestellt, sieht zwar nicht so schön aus, geht aber. Die Drucker sind auch alle auf A3 als Standardpapierformat eingestellt. Ich habe 2 Anwendungen, die Daten aufbereiten, die anschließend in eingerichtete Wordformulare übertragen werden und dann dort gedruckt werden. Den Dokumenten kann ein Drucker (Nadel oder Laser) zugewiesen werden und jeder Bearbeiter hat seine eingestellten Nadel und Laserdrucker. Die Dokumente können entweder sofort gedruckt oder erstmal zum Bearbeiten geöffnet werden. Damit man nicht jedes Mal die Drucker umstellen muß, macht das in beiden Fällen das Delphi-prog. Es stellt den Drucker ein und stellt auch den Drucker nach dem schließen des Doks zurück. Außerdem gibt’s in Word noch eine Extra-Schaltfläche in der Symbolleiste, das per Makro ebenfalls den Nadeldrucker einstellt, das Dok druckt und den Standdarddrucker wieder zurückstellt, da nicht alle Doks über die Delphi-programm gedruckt werden. Und da beginnen die Probleme und das gilt sowohl fürs Delphi-prog als auch fürs Druck-Makro. Ich habe früher immer die Wordapllication.activeprinter Eigenschaft genutzt, die hat aber einen Riesen Nachteil, der dort eingestellte Drucker wird gleich zum systemweiten Standarddrucker gemacht. Hatte ein Mitarbeiter gerade ein Dok für den Nadeldrucker offen und bekommt eine Mail oder muß noch mal durch irgendeinen Zwischenruf was anderes ausdrucken, wurde das auf dem Nadeldrucker ausgedruckt. Das hat er natürlich nicht gemerkt und der nächste, der sein Blatt in den Nadeldrucker legt, hat das falsche drauf. Teilweise sind das Zollformulare, die kann man nicht so einfach zerreissen und in die runde Ablage werfen. Das Delphi-programm hat auch dafür gesorgt, das nach dem schliessen des Doks auch wieder der vorher eingestellte Drucker (Netz-Laser) wieder eingestellt wird. Und genau dort haperts. Das Umstellen der Drucker ist nicht das Problem, aber der Drucker heißt nicht „Server/Druckername“ sondern „Server/Druckername auf NE:0?“. Setzt man bei word.activeprinter die erste Variante geht das problemlos, aber andere Anwendungen „spinnen“. In Excel ist im Druckerdialog kein Drucker mehr ausgewählt, beim Druck auf Drucken in der Symbolleiste (=Schnelldrucken) passiert nichts, weder ein Druck noch eine Fehlermeldung. Andere Anwendungen haben auch Probleme, manche starten nicht, weil kein Standdarddrucker ausgewählt ist, andere drucken nicht. Bei den Druckereinstellungen ist beim Standdarddrucker noch das Häkchen dran, man muß es aber noch mal setzen, dann ist wieder alles in Butter. Für was dieses z.B. „auf NE:02“ gut sein soll, weiß ich nicht. Es ist aber der „itemindex“ bei der Druckereinrichtung, ist der Drucker der erste in der Liste, dann ist es halt NE:01. Die Druckerreihenfolge ist bei jedem aber unterschiedlich und somit auch das NE, in Delphi ließe sich das schnell selbst ermitteln, in VB siehts da schlechter aus. Um das Problem mit dem systemweiten Standdarddrucker bei activeprinter umgehe ich wie folgt:
Delphi-Quellcode:
Damit wird der Drucker nur für Word gesetzt und nicht zum systemweiten Standarddrucker gemacht. Beim Programmstart wird der actuelle Drucker von Word ausgelesen und zwischengespeichert, dort ist auch das „auf NE01“ enthalten. Beim Zurückstellen gibt’s dann auch keine Probleme, bis auf einen Rechner. Dort habe ich die gleichen Probleme, als wäre das Papierformat nicht richtig und der Text wird beim Druck verschoben. Mit Setzen per Activeprinter geht’s aber. Ich könnte SCHREIEN :wall: und bin nicht einen Schritt weiter. Ich verstehs nicht, auf allen Rechnern läuft das gleiche ab.
Var dialog:olevariant;
begin dialog:=WordApplication1.Dialogs.Item(wdDialogFilePrintSetup); dialog.printer := Druckername; dialog.DoNotSetasSysdefault := True; dialog.execute; end; Hat einer auch solche Probleme und wie habt ihr die gelöst? Danke Frank |
Re: Drucken auf „Ne: 0?“ - Leidensgeschichte
Na dann wollen wir mal...
Zum 1. Punkt: Dieses Word verstellt Dir den Standarddrucker... Ich kann Dich beruhigen... nicht nur Dir. Und deshalb hab ich diese Routine entworfen, mit der Du zumindest von Delphi raus den Standarddrucker selbst auslesen kannst, und vor allem auch wieder setzen kannst. Somit brauchst Du Dir vor dem Drucken nur den aktuellen Standarddrucker zu merken, und anschliessend diesen auch wieder eizustellen. Auf einen Punkt solltest Du achten.. Das Zurückstellen des Standarddruckers geschieht über Windowsbotschaften. Und da kann es unter Umständen bischen dauern, bis das OS das mitkriegt. D.h., es kann sein, wenn du gleich einen zweiten Druckauftrag sendest, der Standarddrucker noch nicht zurückgesetzt ist. Deshalb die Sleep(300) Zeile im SetDefaultPrintername.
Delphi-Quellcode:
Zu die Punkte zwei:
unit PrinterSettings;
interface uses windows, sysutils, classes, dialogs, messages ; function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall; external 'winspool.drv' name 'GetDefaultPrinterA'; type TPrinterSettings = class private function getDefaultPrinterName: string; procedure SetDefaultPrinterName(const Value: string); public property DefaultPrinterName : string read GetDefaultPrinterName write SetDefaultPrinterName ; end ; var PS : TPrinterSettings ; implementation uses printers ; function TPrinterSettings.getDefaultPrinterName:string; var lprnName: PAnsiChar; lBufSize: DWord; begin GetMem(lprnName, 1000); try GetDefaultPrinterA(lprnName, lBufSize); Result := lprnName; finally FreeMem(lprnName); end; end; procedure TPrinterSettings.SetDefaultPrinterName(const Value: string); var Device: array[0..255] of char; Driver: array[0..255] of char; Port: array[0..255] of char; hDeviceMode: THandle; begin if Printer.Printers.IndexOf (Value) >= 0 then begin Printer.PrinterIndex := Printer.Printers.IndexOf (Value) ; Printer.GetPrinter(Device, Driver, Port, hDeviceMode); StrCat( Device, ','); StrCat( Device, Driver ); StrCat( Device, ','); StrCat( Device, Port ); WriteProfileString( 'windows', 'device', Device ); StrCopy( Device, 'windows' ); SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, longint( @Device )); sleep (300) ; end else begin end ; end; initialization PS := TPrinterSettings.create ; finalization PS.free ; end. Netzwerkdrucker werden in Windows als
Code:
angezeigt. Ansprechen kannst Du den über obige Klasse allerdings nur über
HP Laserjet an MeinServer
Code:
Ich hatte selbst auch lange mit diesen Druckergeschichten zu kämpfen, bin aber jetzt zu einem zufriedenstellenden Ergebnis gekommen.
\\MeinServer\HP Laserjet
|
Re: Drucken auf „Ne: 0?“ - Leidensgeschichte
Hallo
kannst dir ja mal auch die Dialog-Variante anschauen. Hätte evtl auch für dich Vorteile, da der Drucker nur für Word gesetzt wird. Deinen Code werde ich nächste Woche probieren, zu Hause hats keinen Sinn. Trotzdem belibt dann mein Problem beim Word-makro. Wenn es mir dort nicht gelingt, den Drucker wieder richtig zurückzusetzten, liest das Delphi-prog auch nur den Nadeldrucker als standard aus und setzt ihn wieder. Wo ich mich vor einem halben Jahr intensiv damit beschäftigt hatte, hatte ich codes für Vb gefunden, die auch das NE dahinter basteln, die waren aber ellenlang und auch noch für die Windowsversionenn unterschiedlich. Davor habe ich Angst, wenn da wieder was neues kommt, geht alles von vorne los. Allein die 2 XP-Rechner haben mir schon graue Haare beschert. Aber mich würde mal interessieren, ob das bei allen so ist, das beim Setzten der Activeprinter-Eigenschaft ohne "auf NE0?:" auch das gleiche Problem mit dem Verschwinden des Standarddruckers besteht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 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