自訂列印時的紙張大小, 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;