Solved

Page Sizes without a Print Setup Dialog

Posted on 1998-08-12
4
506 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
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

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

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

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

861 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