Impressao - usando winspool GetPrinter

Top  Previous  Next

// Recebido pelo news, sobre o Winspool.GetPrinter

// Postado por Fábio Bonfim

 

uses WinSpool, Printers;

 

procedure TForm1.ModifyDevmodeForNewNTFormName;

var

 hPrinter       : THandle;

 dwNeeded       : Integer;

 printerInfo2   : PPrinterInfo2A;

 printerDefaults: TPrinterDefaultsA;

 FDevice: array[0..255of char;

 FDriver: array[0..255of char;

 FPort:   array[0..255of char;

 FHandle: THandle;

begin

 

 Printer.GetPrinter(FDevice, FDriver, FPort, FHandle);

 

 with PrinterDefaults do begin

  pDatatype  := NIL;

  pDevMode   := NIL;

  DesiredAccess := PRINTER_ALL_ACCESS;

 end;

 

 if NOT OpenPrinter(fDevice, hPrinter, @PrinterDefaults) then

Exception.Create('OpenPrinter() failed.');

 

 GetPrinter(hPrinter, 2, NIL, 0, @dwNeeded);

 if dwNeeded = 0 then Exception.Create('First GetPrinter() failed.');

 

 GetMem(PrinterInfo2, dwNeeded);

 

 if NOT GetPrinter(hPrinter, 2, PrinterInfo2, dwNeeded, @dwNeeded) then

Exception.Create('Second GetPrinter() failed.');

 

 PrinterInfo2.pDevMode.dmFormName := 'Market01';

 PrinterInfo2.pDevMode.dmFields := PrinterInfo2.pDevMode.dmFields or DM_FORMNAME;

 PrinterInfo2.pDevMode.dmFields := PrinterInfo2.pDevMode.dmFields and (NOT (

                                      DM_PAPERSIZE or DM_PAPERLENGTH or DM_PAPERWIDTH ));

 

 if DocumentProperties(Self.Handle, hPrinter, fDevice, PrinterInfo2.pDevMode^,

  PrinterInfo2.pDevMode^,  DM_IN_BUFFER or DM_OUT_BUFFER) <> IDOK then

  Exception.Create('DocumentProperties() Failed.');

 

{ if NOT SetPrinter(hPrinter, 2, PrinterInfo2, 0) then

  Exception.Create('SetPrinter() failed.');

}

 // The Delphi TPrinter object is holding onto an old DevMode.

 // Calling Printer.SetPrinter() with DevModehandle = 0 will load the new DevMode.

 // If this step were skipped, the Tprinter would ignore the new NT configuration and

 // would print to the default form that was set when this program was started, perhaps

 // being the correct form, perhaps not.

// Printer.SetPrinter(FDevice, FDriver, FPort, 0);

 

 FreeMem(PrinterInfo2, dwNeeded);

 ClosePrinter(hPrinter);

end;