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..255] of char; FDriver: array[0..255] of char; FPort: array[0..255] of 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; |