Ir al contenido


Foto

Acceder a Printer.ColorMode


  • Por favor identifícate para responder
2 respuestas en este tema

#1 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 09 mayo 2013 - 07:09

Tengo unas impresoras PDF que de vez en cuando se pasan a monocromo y no hay forma de convencerlas de que vuelvan a color, y he leído que hay que fijar el printer.colormode a acPRCMColor (esto se escribe así en VBA), que es una constante que vale 2, pero el caso es que delphi no tiene esa propiedad en las TPrinter

¿Alguien sabe como hacerlo desde delphi?

  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 09 mayo 2013 - 08:10

Puedes hacerlo haciendo uso de la Api WinsPool de Windows amigo mio. Mira este código que hace lo que necesitas:



delphi
  1. uses winspool;
  2.  
  3. procedure SetPrinterInfo(APrinterName: PChar);
  4. var
  5.   HPrinter : THandle;
  6.   InfoSize,  BytesNeeded: Cardinal;
  7.   PI2: PPrinterInfo2;
  8.   PrinterDefaults: TPrinterDefaults;
  9. begin
  10.   with PrinterDefaults do
  11.   begin
  12.     DesiredAccess := PRINTER_ACCESS_USE;
  13.     pDatatype := nil;
  14.     pDevMode := nil;
  15.   end;
  16.   if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then
  17.   try
  18.     SetLastError(0);
  19.     if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
  20.     begin
  21.       PI2 := AllocMem(BytesNeeded);
  22.       try
  23.         InfoSize := SizeOf(TPrinterInfo2);
  24.         if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
  25.         begin
  26.           // para monocromo el valor de DMcolor es 1
  27.           //PI2.pDevMode.dmColor := 1;
  28.           // para color es 2
  29.           PI2.pDevMode.dmColor := 2;
  30.           PI2.pSecurityDescriptor := nil;
  31.           if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^,
  32.                                 PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then
  33.           begin
  34.             SetPrinter(HPrinter, 2, PI2, 0);
  35.           end;
  36.         end;
  37.       finally
  38.         FreeMem(PI2, BytesNeeded);
  39.       end;
  40.     end;
  41.   finally
  42.     ClosePrinter(HPrinter);
  43.   end;
  44. end;
  45.  
  46.  
  47.  
  48. procedure TForm1.Button1Click(Sender: TObject);
  49. begin
  50.   SetPrinterInfo('HP 2500C Series');
  51.   TPrintDialog.Create(Self).Execute;
  52. end;


  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 09 mayo 2013 - 11:37

Suponia que solo las win32 me ayudarían... y era cierto, menos mal que todo este código que envías ya lo tenía, solo me falta añadirle lo del ColorMode, muchas grácias poliburro, mañana lo pruebo (hoy estoy con la simulación de los karts, que es un vício).
  • 0




IP.Board spam blocked by CleanTalk.