PDA

Ver la Versión Completa : Impresora


tiel
14-07-2005, 18:03:26
Primeramente, mi problema es que quiero cambiar el tamaño del papel de la impresora.

Hace tiempo que plantee este problema en otro hilo, y ahora después de seguir investigando encontré este link, directo del soporte técnico de Microsoft http://support.microsoft.com/default.aspx?scid=kb;EN-US;140285#appliesto

Aqui explican cómo usando la API es posible cambiar las propiedades de la impresión, pero... lo estuve trasladando a Pascal y tengo un problema:


var

hPrinter: THandle;
dwNeeded: Dword;
pi2: ^PRINTER_INFO_2;
pDevMode: ^DevMode;
pd: PRINTER_DEFAULTS;

begin

hprinter := 0;
dwNeeded := 0;
pdevmode := nil;

ZeroMemory( @pd, Sizeof(pd) );
pd.DesiredAccess := PRINTER_ACCESS_ADMINISTER;

if OpenPrinter(PAnsiChar(Printer.Printers[Printer.PrinterIndex]), hPrinter, @pd ) then
begin
SetLastError(0);
GetPrinter(hPrinter, 2, nil, 0, @dwNeeded );
pi2 := Pointer( GlobalAlloc( GPTR, dwNeeded ) );

if not( GetPrinter(hPrinter, 2, pi2, dwNeeded, @dwNeeded) ) then
begin
ShowMessage( IntToStr(GetLastError) );
Exit;
end;


if pi2.pDevMode <> nil then
begin
pi2.pSecurityDescriptor := nil;
pi2.pDevMode.dmFields := DM_PAPERLENGTH and DM_PAPERWIDTH and DM_PAPERSIZE;
pi2.pDevMode.dmPaperLength := 1000;
pi2.pDevMode.dmPaperWidth := 2160;
pi2.pDevMode.dmPaperSize := DMPAPER_User;
end;

end;

end;


Se darán cuenta que no lo trasladé textualmente, y me salté algunas validaciones, porque las estoy haciendo con 'Watches' y ejecutando 'Paso a paso', pero en la línea marcada con negrita siempre me da FALSE y no logro entender porqué, a ver si pueden revisar el código original (escrito en c++) y me pueden echar una mano para corregir algo en lo que me haya equivocado o decirme "de plano nunca vas a poder cambiar el tamaño de papel" :(

PD: Nótese que según el soporte técnico de Microsoft, este código sirve para XP y NT, yo estoy usando XP Professional

serhasae
11-09-2005, 17:23:24
No tengo ni idea porque falla, pero a ver si los moderadores pueden echarle un vistazo, ya que es un tema interesante debido a que a mi me pasa con lo mismo ya que mi impresora laser no me permite definir un tamaño personalizado por estar mas abajo del minimo. Saludos y Animo.

tiel
17-09-2005, 18:05:00
Las units que se están usando son:

Windows, Printers, sysutils, WinSpool

serhasae
19-09-2005, 13:05:48
Prueba este codigo y dime que tal, me lo paso un amigo lo que pasa es que no tengo tinta en mi impresora para probarlo.

var
pcrDevice : array[0..255] of char;
pcrDriver : array[0..255] of char;
pcrPort : array[0..255] of char;
lDMode : THandle;
varPDMode : PDEVMODE;
begin
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(pcrDevice, pcrDriver, pcrPort, lDMode);
if (lDMode <> 0) then
begin
varPDMode := GlobalLock(lDMode);
if (varPDMode <> nil) then
begin
varPDMode^.dmFields := (varPDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH);
varPDMode^.dmPaperSize := DMPAPER_USER;
varPDMode^.dmPaperWidth := 100;
varPDMode^.dmPaperLength := 100;
varPDMode^.dmFields := (varPDMode^.dmFields or DMBIN_MANUAL); varPDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(lDMode); end;
end;
end;

_Willa
10-04-2006, 20:39:47
Estoy haciendo una clase de impresion atraves del canvas,
y no encuentro cual es la forma de cambiar el "ppp" "puntos por pulgada"
e visto que una impresora puede tener 600 o 300 por ejem. hp6620,
permite seleccionar este dato "calidad de impresión" ... si se selecciona
modo normal desde las propiedades imprime en 600, y si se selecciona
"calidad borrador" imprimi en 300, pero como hacer esto mismo por codigo...

He estado mirando PDEVMODE y no he encontrado cual de todos es...

Alguna Idea?

Gracias.
_Willa