在QP里自定义打印纸,也通过PRINTER的方法动态设定系统打印机纸张类型后,为什么打印完后还是进纸太多(50分)

  • 主题发起人 主题发起人 coolbee
  • 开始时间 开始时间
1、设置打印机属性。
2、更换打印驱动
 
看看我的解决方法,2000和NT下都通过的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1215448
[8D]
 
这段程序被转载过很多次了,hubdog的Delphi葵花宝典上也有。
在2000下dmPaperSize设成DMPAPER_USER就行了,然后设dmPaperLength和dmPaperWidth
在QR里只能改打印区域的大小,设纸张的大小必须用下面的那段程序。
另外你还可以在windows下设好自定义的纸张,再设dmFormName。2000下自定义纸张的设定
在"控制面板"->"打印机"->"文件"(菜单)->"服务器属性"里设置。
BTW:如果你的程序要在NT或98下运行这种方法可能会有问题
程序代码如下:
代码:
procedure SetPaperSize(X, Y: Integer);
// 单位是0.1mm 
// A4时 Printer.Pagewidth:=1440; A5时 Printer.Pagewidth:=1049; 
// B5时 Printer.Pagewidth:=1290; 16K时 Printer.Pagewidth:=1035; 
// lq1600宽行打印机这个值宽度最大为42cm左右, 长度大约2m。 
//改变devicemode结构 
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
 
         if (x = 0) or (y = 0) then
 
         begin
 
            {Set to legal} 
            pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
            {pDMode^.dmPaperSize := DMPAPER_LEGAL;
changed by wulianmin} 
            pDMode^.dmPaperSize := DMPAPER_FANFOLD_US;
         end 
         else
 
         begin
 
            {Set to custom size} //这里设纸张大小
            pDMode^.dmFields := pDMode^.dmFields or 
              DM_PAPERSIZE or 
              DM_PAPERWIDTH or 
              DM_PAPERLENGTH;
            [red]pDMode^.dmPaperSize := DMPAPER_USER[/red];
            pDMode^.dmPaperWidth := x {SomeValueInTenthsOfAMillimeter};
            pDMode^.dmPaperLength := y {SomeValueInTenthsOfAMillimeter};
         end;

         {Set the bin to use}  //这两句是设进纸来源的,不要可以删掉
         pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
         pDMode^.dmDefaultSource := DMBIN_MANUAL;
 
         GlobalUnlock(hDMode);
      end;

   end;

   Printer.PrinterIndex := Printer.PrinterIndex;
   //以下开始打印 
end;
 

Similar threads

I
回复
0
查看
651
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部