Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-09-2004
tiel tiel is offline
Miembro
 
Registrado: jul 2003
Ubicación: México, D.F.
Posts: 29
Poder: 0
tiel Va por buen camino
Problema con API

Yo estuve usando el siguiente código que encontré en este foro para inicializar Printer:

Código:
procedure SetPaperSize (intAlto,intAncho : Integer);
{aqui se define el tamaño del papel}
var
   ADevice, ADriver, APort : array [0..255] of Char;
   ADeviceMode : THandle;
   DevMode : PDevMode;
begin
   with Printer do
      begin
         GetPrinter (ADevice, ADriver, APort, ADeviceMode);
         SetPrinter (ADevice, ADriver, APort, 0);
         GetPrinter (ADevice, ADriver, APort, ADeviceMode);
         DevMode := GlobalLock(ADeviceMode);
         if not Assigned(DevMode) then
            ShowMessage('Ha entrado en -> if not Assigned(DevMode) ...')
         else
            begin
               with DevMode^ do
                  begin
                     dmPaperSize:= DMPAPER_User;
                     dmPaperLength := intAlto;
                     dmPaperWidth:= intAncho;
                     dmFields := dmFields or DM_PAPERSIZE or DM_PAPERLength or DM_PAPERWidth;
                  end;
               GlobalUnLock(ADeviceMode);
               SetPrinter(ADevice, ADriver, APort, ADeviceMode);
           end;
      end;
end;
Y había satisfecho mis propósitos, pero cuando quise cambiar el tamaño de la hoja de papel por otra que no es carta y no está definida en las constantes de la API de Windows, veo que aunque le ponga el tamaño que le ponga, no cambia nunca, siempre se queda en carta.

Así que quisiera saber si alguien ya tuvo este problema y cómo lo resolvió. O si alguien sabe cómo resolverlo.

El problema específicamente es hacer que el tamaño definido en dmPaperLength y dmPaperWidth sea usado por Printer para obtener ciertos valores como la mitad del ancho de página, etc... que son usados por Printer.Canvas.

De antemano, Gracias.
__________________
“Daría todo lo que sé por la mitad de lo que ignoro”
Responder Con Cita
  #2  
Antiguo 01-02-2005
bitzarray bitzarray is offline
Registrado
 
Registrado: abr 2004
Posts: 3
Poder: 0
bitzarray Va por buen camino
Talking encontraste respuesta ?

me gustaría saber si encontraste respuesta a este problema porque a mi me pasa lo mismo.
Te agradecería que lo publicaras

Marco.
Responder Con Cita
  #3  
Antiguo 09-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 Nueva duda

Bueno, hace tiempo que plantee este problema, 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 Delphi 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
Respuesta



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 11:24:28.


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