搞定,多谢yanyandt2提供的网址<br>procedure PrnAddForm(const FormName: string; PaperWidth, PaperLength:integer);<br>var<br> PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;<br> hDMode : THandle;<br> hPrinter: THandle;<br> FormInfo: TFormInfo1;<br> PaperSize: TSize;<br> PaperRect: TRect;<br> errcode: integer;<br> s: string;<br>begin<br>Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);<br>OpenPrinter(PrintDevice, hPrinter, nil);<br>if hPrinter = 0 then<br> raise Exception.Create('Failed to open printer!');<br>FormInfo.Flags := FORM_USER;<br>FormInfo.pName := PChar(FormName);<br>PaperSize.cx := PaperWidth;<br>PaperSize.cy := PaperLength;<br>PaperRect.Left := 0;<br>PaperRect.Top := 0;<br>PaperRect.Right := PaperWidth;<br>PaperRect.Bottom := PaperLength;<br>FormInfo.Size := PaperSize;<br>FormInfo.ImageableArea := PaperRect;<br>if not AddForm(hPrinter, 1, @FormInfo) then<br> begin<br> errcode := GetLastError;<br> if errcode <> ERROR_FILE_EXISTS then // Form name exists?<br> begin<br> case errcode of<br> ERROR_ACCESS_DENIED: s := 'Access is denied';<br> ERROR_INVALID_HANDLE: s := 'The handle is invalid';<br> ERROR_NOT_READY: s := 'The device is not ready';<br> ERROR_CALL_NOT_IMPLEMENTED:<br> s := 'Function "AddForm" is not supported on this system';<br> else<br> s := 'Failed to add a Form (paper) name!';<br> end;<br>raise Exception.Create(s);<br>end;<br>end;<br>ClosePrinter(hPrinter);<br>end;<br><br>procedure PrnSetPaperSizeNT(FormName: string; PaperWidth, PaperLength:integer);<br>var<br>Device, Driver, Port: array[0..80] of Char;<br>DevMode: THandle;<br>pDevmode: PDeviceMode;<br>begin<br>// Get printer device name etc.<br>Printer.GetPrinter(Device, Driver, Port, DevMode);<br>// force reload of DEVMODE<br>Printer.SetPrinter(Device, Driver, Port, 0) ;<br>// get DEVMODE handle<br>Printer.GetPrinter(Device, Driver, Port, DevMode);<br>if DevMode <> 0 then<br>begin<br>// lock it to get pointer to DEVMODE record<br>pDevMode := GlobalLock( DevMode );<br>if pDevmode <> nil then<br>try<br>with pDevmode^ do<br>begin<br>// modify form<br>StrLCopy( dmFormName, PChar(FormName), CCHFORMNAME-1 );<br>// tell printer driver that dmFormname field contains<br>// data it needs to inspect.<br>dmPaperWidth := PaperWidth;<br>dmPaperLength := PaperLength;<br>dmFields := dmFields or DM_FORMNAME or DM_PAPERWIDTH or DM_PAPERLENGTH;<br>end;<br>finally<br>GlobalUnlock( Devmode ); // unlock devmode handle.<br>end;<br>end; { If }<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>//单位是千分之一毫米<br>PrnAddForm(edFormName.Text,StrToInt(edPaperWidth.Text),StrToInt(edPaperLength.Text));<br>PrnSetPaperSizeNT(edFormName.Text,StrToInt(edPaperWidth.Text),StrToInt(edPaperLength.Text));<br>end;