Solved

Page Sizes without a Print Setup Dialog

Posted on 1998-08-12
4
490 Views
Last Modified: 2010-04-04
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 ?
0
Comment
Question by:Dot072798
  • 3
4 Comments
 
LVL 4

Accepted Solution

by:
erajoj earned 80 total points
Comment Utility
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
 
LVL 4

Expert Comment

by:erajoj
Comment Utility
SORRY!!!
Should have tested it. IT DOESN'T WORK!
I will have to punish myself now... ;)
/// John
0
 
LVL 4

Expert Comment

by:erajoj
Comment Utility
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
 

Author Comment

by:Dot072798
Comment Utility
I have used GetPrinter before but I completely forgot what I could use it for. Thanks that has saved me alot of time.
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now