500分求解如何控制打印走纸问题(300分)

  • 主题发起人 主题发起人 NeutronDelphi
  • 开始时间 开始时间
N

NeutronDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
如何控制打印走纸,也就是说要可以控制打印几行,停下来,下回又打印,打印完成以后
走纸!
要求:1,能够设置打印的字体
2,设备无关性,能够适应点阵,喷墨,激光等不同类型的打印机
将程序 Email 至 NeutronBoy@sohu.com
500分完整送上!(另外开贴,一次只能300分)
不能解决问题的一律无分!
 
不换页每次打印一行
sample usage
var Myprinter : TRawPrinter;
oldprinter : TPrinter;
begin
MyPrinter:=TRawPrinter.Create;
oldprinter:=setprinter(MyPrinter);
try
if Printdialog1.execute then
begin
myprinter.startraw;
myprinter.write('khsdhskhkshdksd');
myprinter.writeln;
myprinter.endraw;
end
finally
setprinter(oldprinyter);
myprinter.free;
end;
end;

{Here is the code for the raw printer object.}
unit Rawprinter;
interface
uses printers,windows;
type TRawprinter =class(TPrinter)
public
dc2 : HDC;
procedure startraw;
procedure endraw;
procedure write(const s : string);
procedure writeln;
end;

implementation
uses sysutils,forms;
function AbortProc(Prn: HDC;
Error: Integer):
Bool;
stdcall;
begin
Application.ProcessMessages;
Result := not Printer.Aborted;
end;

type
TPrinterDevice = class
Driver, Device, Port: String;
constructor Create(ADriver, ADevice, APort: PChar);
function IsEqual(ADriver, ADevice, APort: PChar)
:Boolean;
end;

constructor TPrinterDevice.Create(
ADriver, ADevice, APort: PChar);
begin
inherited Create;
Driver := ADriver;
Device := ADevice;
Port := APort;
end;

function TPrinterDevice.IsEqual(
ADriver, ADevice, APort: PChar): Boolean;
begin
Result := (Device = ADevice) and (Port = APort);
end;

procedure TRawprinter.startraw;
var
CTitle: array[0..31] of Char;
CMode : Array[0..4] of char;
do
cInfo: TDocInfo;
r : integer;
begin
StrPLCopy(CTitle, Title, SizeOf(CTitle) - 1);
StrPCopy(CMode, 'RAW');
FillChar(DocInfo, SizeOf(DocInfo), 0);
withdo
cInfodo
begin
cbSize := SizeOf(DocInfo);
lpszDocName := CTitle;
lpszOutput := nil;
lpszDatatype :=CMode;
end;
with TPrinterDevice(Printers.Objects[PrinterIndex])do
begin
DC2 := CreateDC(PChar(Driver),
PChar(Device), PChar(Port), nil);
end;
SetAbortProc(dc2, AbortProc);
r:=StartDoc(dc2,do
cInfo);
end;

procedure TRawprinter.endraw;
var r : integer;
begin
r:=windows.enddoc(dc2);
end;

type passrec = packed record
l : word;
s : Array[0..255] of char;
end;

var pass : Passrec;
procedure TRawprinter.write(const s : string);
begin
pass.l:=length(s);
strpcopy(pass.s,s);
escape(dc2,PASSTHROUGH,0,@pass,nil);
end;

procedure TRawprinter.writeln;
begin
pass.l:=2;
strpcopy(pass.s,#13#10);
escape(dc2,PASSTHROUGH,0,@pass,nil);
end;

end.

 
很多新式打印机已经不支持丰富的走纸了,一般也就支持几种。
反倒使老式打印机走纸方式多,有些甚至能往回走
 
针打和喷墨可以实现你的想法,激光不可能
 
非常的遗憾以上答案都不能给分。
好,要求放宽一点,只要能在喷墨打印机上实现就行,
注意,一点要实现,不要是一大堆的废话,方法我用多了,就实现不了,
给我Demo,我立刻给分!
NeutronBoy@sohu.com
 
我也正在找也!大家多多努力,有实现了大家共亨!
 
NeutrodDelphi大侠,可以实现后请发份给我,我是针式打印机的。Email:XdxDaxiong@163.com
Thank You!!
 
在WINDDOWS下调用打印机自带的驱动实现“行打”功能几乎不可能!
对端口直接操作可以控制,但是你的打印机怎样打印中文(喷墨打印机没有硬字库)
换打印机行吗?
 
Windows下的图型打印方式下,走纸的长度取决于当前纸张的长度,若要控制走纸,就要在打印前
或换页前计算需要打印内容的长度,然后设置打印机的参数(使用getPrinter和setPrinter),我们
就是这样实现的。至于具体打印机能不能实现,需要打印机的型号和驱动程序了,比如一般的激光
打印机是不行的,支持连续纸张的喷墨打印机是可以的。而只支持单页纸的打印机不行,可以说是
无解的。
 
算了,散分!
 
我现在使用的是Epson stylus color 1520k打印机,我在用连续纸打印较长的图形时,我在程序里设置的页长,但当打印完一页的时候, 打印机开始走纸,大约18mm,我需要连续打印,不走纸,请问有什么办法?是不是在哪里需要设置,此打印机支持的自定义纸张最大长度大约是1米多,不能满足需要。因此我把较长的图形分段打印。或者自定义纸张可以设置更长。
 

Similar threads

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