NT下的打印页面设置(100分)

M

mor

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个票证打印的程序,是在win2000 + Delphi6 + QuickRep3.5下开发的。在2000下
一切正常。我用的页面设置的方法是常见的DEVMODE中dmPaperSize、dmPaperLength等设
置。在程序移植到NT下后打印无法成功,每打一张后都走很多纸。我读printer.PageHeight
的值发现差异很大,在2000下大概为500多,到nt下竟有1500多。然后我做了一些测试,发
现2000下dmPaperLength可以修改成功,但NT下无效。
于是我改用dmFormName来进行设置。我在打印机的服务器属性中设置了一个自定义页面,
然后在程序中设置成这个页面,在2000下仍然是成功的,但到了NT下页面设置也成功了,
但走纸仍然不正常,printer.PageHeight值也仍然和2000下不一致。
后来我把2000和NT下的纸张都设成A4,再去读printer.PageHeight发现在两个系统下是
不一样的。如下: 'INVOICE'是我自定义的纸张,数值是PageHeight*dmPaperWidth
2000 A4 2104*1488 INVOICE 1350*1035
NT A4 1944*1443 INVOICE 907*1440
然后,我又尝试设定dmPrintQuality和dmYResolution,仍旧是无效,也许我应该尝试设定
一下dmPelsWidth?这对打印机有效吗?
 
怎么没人回答啊,我有做了一些测试,结果很好玩。
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE or DM_FORMNAME;
pDMode^.dmPaperSize := 127;
pDMode^.dmFormName := 'INVOICE';
pDMode是得到的句柄,上面的几行程序想必大家都知道是干什么用的。
然后我看Printer.PageHeight,打印机的走纸和这个相关.
当dmPaperSize是127时,无论dmFormName如何变化,Printer.PageHeight的值一直不变
把dmPaperSize改成DMPAPER_USER,Printer.PageHeight的数值有变化,但仍然不随程序中
设的dmFormName而变化.
在win2000下,打印机的默认纸张设成了'自定义',然后在程序里再设一遍纸张,
但是在设置前后读Printer.PageHeight,发现仍然是不一样的,真是见鬼了.
这个问题搞了我快两个星期了,这个项目很小的,我从需求到编码到在2000下测试完毕
只用了3个星期啊,真是没法活了.
 
[:(]看看这段话:
To set a custom paper, size in Win9x you use DMPAPER_USER and set the
dmPaperwidth and dmPaperHeight fields of the DEVMODE (and also OR the
matching flags into dmFields!). On NT the process is different. Here
you have to define a custom "form" for the printer (see AddForm, WinSpool
unit) and then
give the name of the form in the DEVMODES dmFormname field
(again setting the matching flag in dmFields).
 
[?]还是没人回答吗?
我又用VC6做了一个测试的程序,NT下编译,NT下运行正常。在Delphi6里我用的TPrinter类,
但照理说应该没什么问题的。
最后的可能,编译器的问题。NT或2000有可能在兼容16位和32位上有所不同。在调用API的时
候其实是有差别的,不然调用一模一样的API怎么可能结果不一样呢?
临时的解决办法只能是用VC做一个dll,再用Delphi来调用了。//faint
[V]
 
[:(][V][xx(]
 
[:D]搞定,哈哈哈哈哈!!!
我和我的同事在德Delphi里直接用api函数DocumentProperties调出打印设置的窗口,这
时虽然打印机的默认纸张是自定义类型的,读出来的DevMode仍然是A4,此时在设置框里
把纸张设置成自定义的类型,然后读得到的DevMode发现dmPapersize是[red]138[/red],
然后一切都解决了,在2000下这个值是127,在API的说明里没有138这个数字。真是要了
命了。
//so
一个打印设置的经验,用WinSpool.DocumentProperties来进行设置,然后去读设置后得
到的那个DevMode,按这个DevMode设置你的打印机,应该没什么问题了。[8D]
[^]我自己解决了,这分数怎么算啊?
 
呵呵!恭喜恭喜,拿点分来吧!
 
代码:
procedure TPrinter.GetPrinter(ADevice, ADriver, APort: PChar;
var ADeviceMode: THandle);
begin
  with TPrinterDevice(Printers.Objects[PrinterIndex])do
  begin
    StrCopy(ADevice, PChar(Device));
    StrCopy(ADriver, PChar(Driver));
    StrCopy(APort, PChar(Port));
  end;
  ADeviceMode := DeviceMode;
end;
[:(!]看看这个TPrinter中所有的打印机居然公用一个DeviceMode变量,难怪我在打印机
上设的自定义纸张不起作用。要做打印机自动切换的同志请注意了,每次切换打印机后
要重新设置,而QuickRep和FastReport都用TPrinter里的设置,如果你要用两台打印机
分别打印不同纸张大小的报表可要注意了。
 
[8D]知道是怎么回事了,每个打印机支持的纸张类型数目是不一样的,每个纸张类型都有
一个编号。当你新增一个纸张类型时,系统给他的编号是现有编号中的最大的一个加一。
所以,dePaperSize的值设定得不正确时,自定义纸张的设定不正确。
我的解决方法是用EnumForms读出所有的纸张类型,然后在设置dePaperSize的值。
 
能给出代码吗?win2000下打印机设置里没有自定义纸张啊,用程序修改系统打印机的默认纸张吗?
我的纸张长是139.3毫米,宽是95.5毫米,长度单位应该怎么转换呢?
 
多人接受答案了。
 
如果能反源码写出就好。
 
顶部