自訂列印時的紙張大小, for Windows95/98 only.

var
  g_SizeSaved : Boolean;
  g_DevMode : TDevMode;

{ Customize paper size (Unit: mm) }
procedure SetCustomSize(CustomWidth, CustomLength: integer);
var
  ADevice, ADriver, APort : array[0..255] of Char;
  hDevMode : THandle;
  pDevMode : PDeviceMode;
begin
  // Get printer device name etc.
  Printer.GetPrinter(ADevice, ADriver, APort, hDevMode);
  // force reload of DEVMODE
  Printer.SetPrinter(ADevice, ADriver, APort, 0) ;
  // get DEVMODE handle
  Printer.GetPrinter(ADevice, ADriver, APort, hDevMode);
  if hDevMode <> 0 then
  begin
    pDevMode := GlobalLock(hDevMode);
    if pDevMode <> nil then
    begin
      if Not g_SizeSaved then
      begin
        g_DevMode := pDevMode^;
        g_SizeSaved := True;
      end;
      with pDevMode^ do
      begin
        dmPaperWidth := CustomWidth;
        dmPaperLength := CustomLength;
        dmPaperSize := DMPAPER_USER;
        dmFields := dmFields or DM_PAPERSIZE or DM_PAPERLENGTH or DM_PAPERWIDTH;
      end;
      GlobalUnLock(hDevMode);
    end;
  end;
end;

procedure RestoreSize;
var
  ADevice, ADriver, APort : array[0..255] of Char;
  hDevMode : THandle;
  pDevMode : PDeviceMode;
begin
  // Get printer device name etc.
  Printer.GetPrinter(ADevice, ADriver, APort, hDevMode);
  // force reload of DEVMODE
  Printer.SetPrinter(ADevice, ADriver, APort, 0) ;
  // get DEVMODE handle
  Printer.GetPrinter(ADevice, ADriver, APort, hDevMode);
  if hDevMode <> 0 then 
  begin
    pDevMode := GlobalLock(hDevMode);
    if pDevMode <> nil Then
    begin
      pDevMode^ := g_DevMode;
      g_SizeSaved := False;
      GlobalUnLock(hDevMode);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetCustomSize(2100, 1480);
  Printer.BeginDoc;
  Printer.Canvas.TextOut(100, 100, 'Hello, this is Michael!');
  Printer.EndDoc;
end;

    Source: geocities.com/huanlin_tsai/faq

               ( geocities.com/huanlin_tsai)