Solved

Page Sizes without a Print Setup Dialog

Posted on 1998-08-12
4
513 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 4

Accepted Solution

by:
erajoj earned 80 total points
ID: 1361996
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
ID: 1361997
SORRY!!!
Should have tested it. IT DOESN'T WORK!
I will have to punish myself now... ;)
/// John
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1361998
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
ID: 1361999
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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

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…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Finding and deleting duplicate (picture) files can be a time consuming task. My wife and I, our three kids and their families all share one dilemma: Managing our pictures. Between desktops, laptops, phones, tablets, and cameras; over the last decade…

734 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