再问打印自定义纸张?(50分)

  • 主题发起人 主题发起人 yangbo
  • 开始时间 开始时间
Y

yangbo

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在打印时自定义纸张,看过eYes和铃铛的回答,
但在我这里没成功,能给我贴一点详细的代码吗?
比如说:定义为宽2000,长1500自定义纸张.
 
printer.pagewidth:=2000;
printer.pageheight:=1500;
 
先告诉我你用的什么版本
 
两位大侠,我看过以前的回答,但调试通过却没起作用,另:我用delphi3;
printer的pagewidth,pageheight是只读属性.看看铃铛的代码,有两个
逻辑符号我搞不清(0 和nil):
来自:铃铛时间:1998-10-05 10:02:52ID:30555
打印有多种方式,不知道你用那种,在Qreport,有一项关于打印纸的设置,可用它设置
另:若你自己控制打印,可向如下方式控制打印纸大小:
Device :array [0..(cchDeviceName-1) ] of Char;
Driver :array [0..(MAX_PATH-1)] of char ;
Port : array[0..32] of char ;
hDMode :THandle;
pDMode :PDevMode;
Printer.PrinterIndex:=Printer.PrinterIndex;
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode 0 then
begin
pDMode:=GlobalLock(hDMode);
if pDMode nil then
begin
pDMode^.dmPaperSize:=256;
{
注:设置为'自定义纸大小'方式,在有本书中例子为
pDMode^.dmPaperSize:=0;
我用的环境为 win97,oki打印机
改为 :=256 后才正确,你具体看一下.
}
pDMode^.dmPaperLength:=1000;//纸长
pDMode^.dmPaperWidth:=1000;//纸宽
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERLENGTH;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERWIDTH;
GlobalUnlock(hDMode);
Printer.PrinterIndex:=Printer.PrinterIndex;
end;
end;
begin
doc
enddoc
把以上程序放到打印前.
 
这段程序没有问题,你的疑问都是 = 等号
 
我试过了,换上'='后,我这样测试如下:
1.在(win95)开始->设置->打印机->属性->纸张->选择B5纸.
2.程序中响应代码:
pDMode^.dmPaperSize:=0;
pDMode^.dmPaperLength:=2000;//纸长
pDMode^.dmPaperWidth:=2000;//纸宽
....
....
printer.begin
doc;
printer.canvas.TextOut(1700,1000,'AAAA');
printer.enddoc;
3.运行程序,为什么还是不打印啊?真急人!
 
应该是“<>”吧?
 
在打印前调用以下函数
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。
{Question:
How can I change the papersize of my print job?
Answer:
One way to change printer settings at the start
of a print job is to change the printer's devicemode
structure.
See: TDEVMODE in the Delphi 1.02 help file or DEVMODE
in the Delphi 2.01 help file for other settings you can
change (providing the print driver supports the change).
The following example, contains code to change the papersize and
the paper bin that is uses:}
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;
pDMode^.dmPaperSize := DMPAPER_USER;
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;
 
谢谢各位大侠的帮助,尤其是tax,要知道这个问题在待答问题中已经好长时间了,
难易程度不说,找到它得有一定耐心的才行啊!我自己差点放弃了!
呵呵!谢谢了!--为生计疲于奔命啊!!

 
接受答案了.
 
还是打印的问题,上面那段程序在2K和98下都运行正常,但是不能XP上运行,哪位大侠能帮帮忙,可以另外算分
 
后退
顶部