Page Sizes without a Print Setup Dialog

I would like to know a way of changing page sizes eg A4 to A5, or legal etc. without the use of a Print Setup Dialog box. It is possible to change page orientation and printer
types via standard programming commands within Delphi, but I reckon changing page sizes possibly means accessing the Print Setup structures and having abit of a fiddle ?
Dot072798Asked:
Who is Participating?
 
erajojCommented:
Hi,
A little bit of fiddeling is required, not too much however.
There is a record in the Windows unit that looks like this:

  TDeviceModeA = packed record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;
    dmOrientation: SHORT;
    dmPaperSize: SHORT;   // <<< Look here!
    dmPaperLength: SHORT;
    dmPaperWidth: SHORT;
    dmScale: SHORT;
    dmCopies: SHORT;
    dmDefaultSource: SHORT;
    dmPrintQuality: SHORT;
    dmColor: SHORT;
    dmDuplex: SHORT;
    dmYResolution: SHORT;
    dmTTOption: SHORT;
    dmCollate: SHORT;
    dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;

Changing the default record to whatever you want before printing will be what you'll have to do (this code is borrowed from UDDF):

var
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port   : array[0..255] of char;
  hDMode : THandle;
  PDMode : PDEVMODE;
begin
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
     // pDMode^.dmFields := pDMode^.dmFields or DM_COPIES;
     // pDMode^.dmCopies := 5;
      pDMode^.dmPaperSize:=DMPAPER_A4;

//        Predefined paper sizes:
//
//        DMPAPER_LETTER      = 1;  { Letter 8 12 x 11 in               }
//        DMPAPER_FIRST       = DMPAPER_LETTER;
//        DMPAPER_LETTERSMALL = 2;  { Letter Small 8 12 x 11 in         }
//        DMPAPER_TABLOID     = 3;  { Tabloid 11 x 17 in                }
//        DMPAPER_LEDGER      = 4;  { Ledger 17 x 11 in                 }
//        DMPAPER_LEGAL       = 5;  { Legal 8 12 x 14 in                }
//        DMPAPER_STATEMENT   = 6;  { Statement 5 12 x 8 12 in          }
//        DMPAPER_EXECUTIVE   = 7;  { Executive 7 14 x 10 12 in         }
//        DMPAPER_A3      = 8;      { A3 297 x 420 mm                     }
//        DMPAPER_A4      = 9;      { A4 210 x 297 mm                     }
//        DMPAPER_A4SMALL = 10;     { A4 Small 210 x 297 mm               }
//        DMPAPER_A5      = 11;     { A5 148 x 210 mm                     }
//        DMPAPER_B4      = 12;     { B4 (JIS) 250 x 354                  }
//        DMPAPER_B5      = 13;     { B5 (JIS) 182 x 257 mm               }
//        DMPAPER_FOLIO   = 14;     { Folio 8 12 x 13 in                  }
//        DMPAPER_QUARTO  = 15;     { Quarto 215 x 275 mm                 }
//        DMPAPER_10X14   = 16;     { 10x14 in                            }
//        DMPAPER_11X17   = 17;     { 11x17 in                            }
//        DMPAPER_NOTE    = 18;     { Note 8 12 x 11 in                   }
//        DMPAPER_ENV_9   = 19;     { Envelope #9 3 78 x 8 78             }
//        DMPAPER_ENV_10  = 20;     { Envelope #10 4 18 x 9 12            }
//        DMPAPER_ENV_11  = 21;     { Envelope #11 4 12 x 10 38           }
//        DMPAPER_ENV_12  = 22;     { Envelope #12 4 \276 x 11            }
//        DMPAPER_ENV_14  = 23;     { Envelope #14 5 x 11 12              }
//        DMPAPER_CSHEET  = 24;     { C size sheet                        }
//        DMPAPER_DSHEET  = 25;     { D size sheet                        }
//        DMPAPER_ESHEET  = 26;     { E size sheet                        }
//        DMPAPER_ENV_DL  = 27;     { Envelope DL 110 x 220mm             }
//        DMPAPER_ENV_C5  = 28;     { Envelope C5 162 x 229 mm            }
//        DMPAPER_ENV_C3  = 29;     { Envelope C3  324 x 458 mm           }
//        DMPAPER_ENV_C4  = 30;     { Envelope C4  229 x 324 mm           }
//        DMPAPER_ENV_C6  = 31;     { Envelope C6  114 x 162 mm           }
//        DMPAPER_ENV_C65  = 32;    { Envelope C65 114 x 229 mm           }
//        DMPAPER_ENV_B4   = 33;    { Envelope B4  250 x 353 mm           }
//        DMPAPER_ENV_B5   = 34;    { Envelope B5  176 x 250 mm           }
//        DMPAPER_ENV_B6   = 35;    { Envelope B6  176 x 125 mm           }
//        DMPAPER_ENV_ITALY          = 36;  { Envelope 110 x 230 mm               }
//        DMPAPER_ENV_MONARCH        = 37;  { Envelope Monarch 3.875 x 7.5 in     }
//        DMPAPER_ENV_PERSONAL       = 38;  { 6 34 Envelope 3 58 x 6 12 in        }
//        DMPAPER_FANFOLD_US         = 39;  { US Std Fanfold 14 78 x 11 in        }
//        DMPAPER_FANFOLD_STD_GERMAN = 40;  { German Std Fanfold 8 12 x 12 in    }
//        DMPAPER_FANFOLD_LGL_GERMAN = 41;  { German Legal Fanfold 8 12 x 13 in  }
//        DMPAPER_ISO_B4             = 42;  { B4 (ISO) 250 x 353 mm               }
//        DMPAPER_JAPANESE_POSTCARD  = 43;  { Japanese Postcard 100 x 148 mm      }
//        DMPAPER_9X11               = 44;  { 9 x 11 in                           }
//        DMPAPER_10X11              = 45;  { 10 x 11 in                          }
//        DMPAPER_15X11              = 46;  { 15 x 11 in                          }
//        DMPAPER_ENV_INVITE         = 47;  { Envelope Invite 220 x 220 mm        }
//        DMPAPER_RESERVED_48        = 48;  { RESERVED--DO NOT USE                }
//        DMPAPER_RESERVED_49        = 49;  { RESERVED--DO NOT USE                }
//        DMPAPER_LETTER_EXTRA       = 50;  { Letter Extra 9 \275 x 12 in         }
//        DMPAPER_LEGAL_EXTRA        = 51;  { Legal Extra 9 \275 x 15 in          }
//        DMPAPER_TABLOID_EXTRA      = 52;  { Tabloid Extra 11.69 x 18 in         }
//        DMPAPER_A4_EXTRA           = 53;  { A4 Extra 9.27 x 12.69 in            }
//        DMPAPER_LETTER_TRANSVERSE  = 54;  { Letter Transverse 8 \275 x 11 in    }
//        DMPAPER_A4_TRANSVERSE      = 55;  { A4 Transverse 210 x 297 mm          }
//        DMPAPER_LETTER_EXTRA_TRANSVERSE = 56;     { Letter Extra Transverse 9\275 x 12 in  }
//        DMPAPER_A_PLUS        = 57;     { SuperASuperAA4 227 x 356 mm       }
//        DMPAPER_B_PLUS        = 58;     { SuperBSuperBA3 305 x 487 mm       }
//        DMPAPER_LETTER_PLUS   = 59;     { Letter Plus 8.5 x 12.69 in          }
//        DMPAPER_A4_PLUS       = 60;     { A4 Plus 210 x 330 mm                }
//        DMPAPER_A5_TRANSVERSE = 61;     { A5 Transverse 148 x 210 mm          }
//        DMPAPER_B5_TRANSVERSE = 62;     { B5 (JIS) Transverse 182 x 257 mm    }
//        DMPAPER_A3_EXTRA      = 63;     { A3 Extra 322 x 445 mm               }
//        DMPAPER_A5_EXTRA      = $40;    { A5 Extra 174 x 235 mm               }
//        DMPAPER_B5_EXTRA      = 65;     { B5 (ISO) Extra 201 x 276 mm         }
//        DMPAPER_A2            = 66;     { A2 420 x 594 mm                     }
//        DMPAPER_A3_TRANSVERSE = 67;     { A3 Transverse 297 x 420 mm          }
//        DMPAPER_A3_EXTRA_TRANSVERSE = 68;     { A3 Extra Transverse 322 x 445 mm    }
//      
//       ** the following sizes are reserved for the Far East version of Win95.
//       ** Rotated papers rotate the physical page but not the logical page.
//      
//        DMPAPER_DBL_JAPANESE_POSTCARD = 69; { Japanese Double Postcard 200 x 148 mm }
//        DMPAPER_A6                  = 70;  { A6 105 x 148 mm                 }
//        DMPAPER_JENV_KAKU2          = 71;  { Japanese Envelope Kaku #2       }
//        DMPAPER_JENV_KAKU3          = 72;  { Japanese Envelope Kaku #3       }
//        DMPAPER_JENV_CHOU3          = 73;  { Japanese Envelope Chou #3       }
//        DMPAPER_JENV_CHOU4          = 74;  { Japanese Envelope Chou #4       }
//        DMPAPER_LETTER_ROTATED      = 75;  { Letter Rotated 11 x 8 1/2 11 in }
//        DMPAPER_A3_ROTATED          = 76;  { A3 Rotated 420 x 297 mm         }
//        DMPAPER_A4_ROTATED          = 77;  { A4 Rotated 297 x 210 mm         }
//        DMPAPER_A5_ROTATED          = 78;  { A5 Rotated 210 x 148 mm         }
//        DMPAPER_B4_JIS_ROTATED      = 79;  { B4 (JIS) Rotated 364 x 257 mm   }
//        DMPAPER_B5_JIS_ROTATED      = 80;  { B5 (JIS) Rotated 257 x 182 mm   }
//        DMPAPER_JAPANESE_POSTCARD_ROTATED = 81; { Japanese Postcard Rotated 148 x 100 mm }
//        DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED = 82; { Double Japanese Postcard Rotated 148 x 200 mm }
//        DMPAPER_A6_ROTATED          = 83;  { A6 Rotated 148 x 105 mm         }
//        DMPAPER_JENV_KAKU2_ROTATED  = 84;  { Japanese Envelope Kaku #2 Rotated}
//        DMPAPER_JENV_KAKU3_ROTATED  = 85;  { Japanese Envelope Kaku #3 Rotated}
//        DMPAPER_JENV_CHOU3_ROTATED  = 86;  { Japanese Envelope Chou #3 Rotated}
//        DMPAPER_JENV_CHOU4_ROTATED  = 87;  { Japanese Envelope Chou #4 Rotated}
//        DMPAPER_B6_JIS              = 88;  { B6 (JIS) 128 x 182 mm           }
//        DMPAPER_B6_JIS_ROTATED      = 89;  { B6 (JIS) Rotated 182 x 128 mm   }
//        DMPAPER_12X11               = 90;  { 12 x 11 in                      }
//        DMPAPER_JENV_YOU4           = 91;  { Japanese Envelope You #4        }
//        DMPAPER_JENV_YOU4_ROTATED   = 92;  { Japanese Envelope You #4 Rotated}
//        DMPAPER_P16K                = 93;  { PRC 16K 146 x 215 mm            }
//        DMPAPER_P32K                = 94;  { PRC 32K 97 x 151 mm             }
//        DMPAPER_P32KBIG             = 95;  { PRC 32K(Big) 97 x 151 mm        }
//        DMPAPER_PENV_1              = 96;  { PRC Envelope #1 102 x 165 mm    }
//        DMPAPER_PENV_2              = 97;  { PRC Envelope #2 102 x 176 mm    }
//        DMPAPER_PENV_3              = 98;  { PRC Envelope #3 125 x 176 mm    }
//        DMPAPER_PENV_4              = 99;  { PRC Envelope #4 110 x 208 mm    }
//        DMPAPER_PENV_5              = 100; { PRC Envelope #5 110 x 220 mm    }
//        DMPAPER_PENV_6              = 101; { PRC Envelope #6 120 x 230 mm    }
//        DMPAPER_PENV_7              = 102; { PRC Envelope #7 160 x 230 mm    }
//        DMPAPER_PENV_8              = 103; { PRC Envelope #8 120 x 309 mm    }
//        DMPAPER_PENV_9              = 104; { PRC Envelope #9 229 x 324 mm    }
//        DMPAPER_PENV_10             = 105; { PRC Envelope #10 324 x 458 mm   }
//        DMPAPER_P16K_ROTATED        = 106; { PRC 16K Rotated                 }
//        DMPAPER_P32K_ROTATED        = 107; { PRC 32K Rotated                 }
//        DMPAPER_P32KBIG_ROTATED     = 108; { PRC 32K(Big) Rotated            }
//        DMPAPER_PENV_1_ROTATED      = 109; { PRC Envelope #1 Rotated 165 x 102 mm}
//        DMPAPER_PENV_2_ROTATED      = 110; { PRC Envelope #2 Rotated 176 x 102 mm}
//        DMPAPER_PENV_3_ROTATED      = 111; { PRC Envelope #3 Rotated 176 x 125 mm}
//        DMPAPER_PENV_4_ROTATED      = 112; { PRC Envelope #4 Rotated 208 x 110 mm}
//        DMPAPER_PENV_5_ROTATED      = 113; { PRC Envelope #5 Rotated 220 x 110 mm}
//        DMPAPER_PENV_6_ROTATED      = 114; { PRC Envelope #6 Rotated 230 x 120 mm}
//        DMPAPER_PENV_7_ROTATED      = 115; { PRC Envelope #7 Rotated 230 x 160 mm}
//        DMPAPER_PENV_8_ROTATED      = 116; { PRC Envelope #8 Rotated 309 x 120 mm}
//        DMPAPER_PENV_9_ROTATED      = 117; { PRC Envelope #9 Rotated 324 x 229 mm}
//        DMPAPER_PENV_10_ROTATED     = 118; { PRC Envelope #10 Rotated 458 x 324 mm }
//        DMPAPER_LAST                = DMPAPER_PENV_10_ROTATED;
//        DMPAPER_USER                = $100;

      GlobalUnlock(hDMode);
    end;
    GlobalFree(hDMode);
  end;
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.BeginDoc;
  Printer.Canvas.TextOut(100,100, 'Test 1');
  Printer.EndDoc;

Hope this is what you need.

/// John
0
 
erajojCommented:
SORRY!!!
Should have tested it. IT DOESN'T WORK!
I will have to punish myself now... ;)
/// John
0
 
erajojCommented:
Hi again,
This time I tested the code before sending it, and this time it works, believe it or not!:

procedure TForm1.Button1Click(Sender: TObject);
var
  Device : array[ 0..255 ] of Char;
  Driver : array[ 0..255 ] of Char;
  Port   : array[ 0..255 ] of Char;
  hDMode : THandle;
  pDMode : PDeviceMode;
begin
  with Printer do begin
    PrinterIndex := -1;
    GetPrinter( Device, Driver, Port, hDMode );
    if hDMode <> 0 then begin
      pDMode := GlobalLock( hDMode );
      if pDMode <> nil then begin
        pDMode^.dmPaperSize   := DMPAPER_A4; // or whatever size you want
        pDMode^.dmOrientation := DMORIENT_PORTRAIT;
        GlobalUnlock( hDMode );
        SetPrinter( Device, Driver, Port, hDMode );
      end;
    end;
  end;
  Printer.BeginDoc;
  Printer.Canvas.TextOut( 100, 100, 'Test 1' );
  Printer.EndDoc;
end;

/// John
0
 
Dot072798Author Commented:
I have used GetPrinter before but I completely forgot what I could use it for. Thanks that has saved me alot of time.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.