Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-07-2005
tiel tiel is offline
Miembro
 
Registrado: jul 2003
Ubicación: México, D.F.
Posts: 29
Poder: 0
tiel Va por buen camino
Lightbulb Impresora

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...0285#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:

Código:
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
__________________
“Daría todo lo que sé por la mitad de lo que ignoro”
Responder Con Cita
  #2  
Antiguo 11-09-2005
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 17-09-2005
tiel tiel is offline
Miembro
 
Registrado: jul 2003
Ubicación: México, D.F.
Posts: 29
Poder: 0
tiel Va por buen camino
Units

Las units que se están usando son:

Windows, Printers, sysutils, WinSpool
__________________
“Daría todo lo que sé por la mitad de lo que ignoro”
Responder Con Cita
  #4  
Antiguo 19-09-2005
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
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;

Última edición por serhasae fecha: 29-09-2005 a las 01:57:47.
Responder Con Cita
  #5  
Antiguo 10-04-2006
_Willa _Willa is offline
Miembro
 
Registrado: jun 2003
Ubicación: Madrid
Posts: 26
Poder: 0
_Willa Va por buen camino
Smile Cambiar el ppp de una Impresora!!

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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:49:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi