Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Problema con API (https://www.clubdelphi.com/foros/showthread.php?t=14442)

tiel 21-09-2004 03:28:09

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.

bitzarray 01-02-2005 17:04:56

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 :D

Marco.

tiel 09-07-2005 02:59:24

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


La franja horaria es GMT +2. Ahora son las 06:16:08.

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