Saludos mis queridos foristas,
En internet encontré este código para obtener los papeles de una impresora usando el API de Windows y el objeto TPrinter de Delphi.
Aquí esta el código:
procedure GetPaperNames(sl : TStrings); type TPaperName = array[0..63] of Char; TPaperNameArray = array[1..High(Integer) div SizeOf(TPaperName)] of TPaperName; PPaperNameArray = ^TPaperNameArray; var Device, Driver, Port : array[0..255] of Char; hDevMode : THandle; I, NumPaperFormats : Integer; pPaperFormats : PPaperNameArray; begin Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDevmode); NumPaperFormats := DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil); if NumPaperFormats > 0 then begin GetMem(pPaperFormats, NumPaperFormats * SizeOf(TPaperName)); try DeviceCapabilities(Device, Port, DC_PAPERNAMES, Pchar(pPaperFormats), nil); sl.Clear; for I:= 1 to NumPaperFormats do sl.add( pPaperformats^[I] ); finally FreeMem(pPaperFormats); end; end; end;
Tomando este código como referencia he hecho una función para obtener el nombre del papel de la impresora pasando como parámetro el numero de papel. por ejemplo, si le paso a la función el código 1 (correspondiente a DMPAPER_LETTER) la función devolverá el papel "US Letter 8 1/2 x 11 in", si le paso el código 5 (correspondiente a DMPAPER_LEGAL) la función devolverá el papel "US Legal 8 1/2 x 14 in", si le paso el código 9 (correspondiente a DMPAPER_A4) la función devolverá el papel "A4 210 x 297 mm" y así sucesivamente.
Aquí esta la función que diseñe para obtener el nombre del papel :
function GetPaperName(IdxPrinter, Papel : Word) : string; type TPaperName = array[0..63] of Char; TPaperNameArray = array[1..High(Integer) div SizeOf(TPaperName)] of TPaperName; PPaperNameArray = ^TPaperNameArray; var Device, Driver, Port : array[0..255] of Char; hDevMode : THandle; I, NumPaperFormats : Integer; pPaperFormats : PPaperNameArray; begin Printer.PrinterIndex := IdxPrinter; Printer.GetPrinter(Device, Driver, Port, hDevmode); NumPaperFormats := DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil); if NumPaperFormats > 0 then begin GetMem(pPaperFormats, NumPaperFormats * SizeOf(TPaperName)); try DeviceCapabilities(Device, Port, DC_PAPERNAMES, Pchar(pPaperFormats), nil); for I:= 1 to NumPaperFormats do begin if I = Papel then begin Result := pPaperformats^[I]; Break; end; end; finally FreeMem(pPaperFormats); end; end; end;
Esta función que diseñe devuelve el nombre del papel pero de forma incorrecta.... pues lamentablemente no soy experto en el uso del API de Windows. Por eso les pido de favor que me ayuden a corregir dicha función ya que la necesito para pasársela a los reporteadores que uso (FastReport y ReportBuilder). Esta utilidad la usare para evitarle a los usuarios el tener que elegir el tamaño del papel cada vez que quieran imprimir. Como pista creo que el error esta en el bucle donde comparo el parámetro "Papel" con el índice del bucle.
Esperando que me hayan entendido les agradezco su ayuda y atención.
Att: Jorge