Einzelnen Beitrag anzeigen

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, 22: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