Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Page Sizes without a Print Setup Dialog

Posted on 1998-08-12
4
Medium Priority
?
535 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 320 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: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying 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 The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
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…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…

824 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