纸张控制(50分)

  • 主题发起人 主题发起人 sherman
  • 开始时间 开始时间
S

sherman

Unregistered / Unconfirmed
GUEST, unregistred user!
开发一个应用软件,需要自定义纸张大小,但是定义了纸张大小后
在DELPHI中的打印时,不能打印到自定义纸张最大的尺寸,
我定义的纸张大小为220MMX140MM
但长度打印到126MM就不能再打印下去,请各位做过自定义打印的
大虾多提宝贵意见
 
开始->设置->打印机->设置您的纸张
用qr的设置没用, 不会超过当前windows的设置大小
 
参考一下:
<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=98048"这里/a>
 
不好意思,写错了!
是<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=98048">这里</a>
 
别信!
>Devs^.dmPaperSize:=0;
是错误的,正确的写法是Devs^.dmPaperSize:=256;
 
各位看仔细题目,你们说 的是用程序控制自定义纸张,我早就知道了
那里的回答还有我的份,现在是不能整张纸都打印到,可能有打印机
预先留的MAGRIN,如何解决
 
呵呵, 我试过, 确实存在打印留边现象, 不过, 可以定义DMPAPERWIDTH和
DMPAPERLENGTH大一些, 这样就多打了. 但上面和左面还有问题, 真是很烦.
 
:cytown
我可是在套打的时候碰到的问题,如果将纸张扩大,就不能正确地进纸
可是我看到其他的人的程序能够准确打印到,为什么呢?
 
呵呵,你少打的部分其实不多, 所以不要设得过大, 太大了自然会有走纸问题了.
 
:cytown
不对,我要打的最后一个记录正好超出打印范围,所以你说的不行
各位,还有谁有高见,请各位多多建议。分不够,可以再加。
 
各位,谁能写出自定义纸张220MMX140MM
将数据打印到长度为130MM位置的字符(test)
pinter.canvas(0,130mm,'test');
使用EPSON LQ1600类型的打印机,我就加分。
 
哈,套打我整过。
下面的程序满足你的要求,并且测试通过。试试。

//各位,谁能写出自定义纸张220MMX140MM
//将数据打印到长度为130MM位置的字符(test)
//pinter.canvas(0,130mm,'test');
//使用EPSON LQ1600类型的打印机,我就加分。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Printers;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

var
RateX, RateY: Integer;

//初始化打印机的一些参数
function InitPrinter: Boolean;
begin

Result := Printer.Printers.Count > 0;
RateX := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 1000, 254);
RateY := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 1000, 254);
end;


//设置纸张大小,x为纸张,y宽为纸张高,均以0.1mm为单位
procedure SetPaperSize(X, Y: Integer);
var
Device, Driver, Port: PChar;
HDMode: THandle;
PDMode: PDevMode;
begin

Device := StrAlloc(cchDeviceName);
Driver := StrAlloc(MAX_PATH);
Port := StrAlloc(32);
try
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, HDMode);
if HDMode <> 0 then
begin

PDMode := GlobalLock(HDMode);
if PDMode <> nil then
begin

with PDMode^do
begin

dmPaperSize := 256;
dmPaperWidth := X;
dmPaperLength := Y;
dmFields := dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
GlobalUnlock(HDMode);
end;

Printer.PrinterIndex := Printer.PrinterIndex;
end;

end;

finally
StrDispose(Device);
StrDispose(Driver);
StrDispose(Port);
end;

end;


//转换x方向值,由0.1mm单位转换成Pixel单位
function TransformX(X: Integer): Integer;
begin

Result := MulDiv(X, RateX, 1000);
end;


//转换y方向值勤,由0.1mm单位转换成Pixel单位
function TransformY(Y: Integer): Integer;
begin

Result := MulDiv(Y, RateY, 1000);
end;


//转换点的座标系,由0.1mm单位转换成Pixel单位
procedure TransformPoint(Point: TPoint);
begin

Point.x := TransformX(Point.x);
Point.y := TransformY(Point.y);
end;


//转换区域的座标系,由0.1mm单位转换成Pixel单位
procedure TransformRect(Rect: TRect);
begin

Rect.Left := TransformX(Rect.Left);
Rect.Right := TransformX(Rect.Right);
Rect.Top := TransformY(Rect.Top);
Rect.Bottom := TransformY(Rect.Bottom);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
x, y: Integer;
begin

if not InitPrinter then

Application.MessageBox('', '', mb_IconError + mb_OK)
else
begin

//定义纸张为220MMX140MM
SetPaperSize(2200, 1400);
//打印文本test
with Printerdo
begin

begin
Doc;
x := 1000;
//0.1mm
y := 1300;
//0.1mm
Canvas.Font.Assign(Form1.Font);
Canvas.TextOut(TransformX(x), TransformY(y), 'test');
EndDoc;
end;

end;

end;


end.

 
:barton
我后天可以将你的程序测试一下,如果行,就给你加分。
你打印的纸张上是否真能打印到130mm 的位置,你的程序和
我编写的差不多,但是我的打印(一行一行打印下去)到130MM的
位置就打印不出来了。
试了再说。
 
我用qr套打过, 怎么没有留边的问题(套打过增值税发票, 连续纸连续打也没问题)?
 
:another_eye
用户的软件需要运行在3.1版本上,没有办法啊。
 
:barton
不行啊,你能不能再实验一下,我在WIN31下
 
Win31我的方法肯定不行。我连测试环境都没有。
 
还有谁能在win31上 delphi1.0 解决以上问题
 
打印前调用以下函数
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;
 
将打印机的非打印区域(上、下、左、右)都设为0试试看。
可能是它们在作祟。
 
后退
顶部