AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Drucken auf „Ne: 0?“ - Leidensgeschichte
Thema durchsuchen
Ansicht
Themen-Optionen

Drucken auf „Ne: 0?“ - Leidensgeschichte

Ein Thema von Keldorn · begonnen am 25. Nov 2005 · letzter Beitrag vom 26. Nov 2005
Antwort Antwort
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Drucken auf „Ne: 0?“ - Leidensgeschichte

  Alt 25. Nov 2005, 22:03
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:
Var dialog:olevariant;
  begin
    dialog:=WordApplication1.Dialogs.Item(wdDialogFilePrintSetup);
    dialog.printer := Druckername;
    dialog.DoNotSetasSysdefault := True;
    dialog.execute;
  end;
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 und bin nicht einen Schritt weiter. Ich verstehs nicht, auf allen Rechnern läuft das gleiche ab.

Hat einer auch solche Probleme und wie habt ihr die gelöst?

Danke Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Drucken auf „Ne: 0?“ - Leidensgeschichte

  Alt 25. Nov 2005, 23:23
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:
unit PrinterSettings;

interface
uses windows, sysutils, classes, dialogs, messages ;

function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall;
       external 'winspool.drvname '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.
Zu die Punkte zwei:
Netzwerkdrucker werden in Windows als
Code:
HP Laserjet an MeinServer
angezeigt. Ansprechen kannst Du den über obige Klasse allerdings nur über
Code:
\\MeinServer\HP Laserjet
Ich hatte selbst auch lange mit diesen Druckergeschichten zu kämpfen, bin aber jetzt zu einem zufriedenstellenden Ergebnis gekommen.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Drucken auf „Ne: 0?“ - Leidensgeschichte

  Alt 26. Nov 2005, 08:57
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.

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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