一个让打印机随时停止的问题!(50分)

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

soleylg

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我要打印的东西,只有2行,但打印机在打完这两行后要把整张纸都走完,
如果能让它打完这2行后就停下来,然后我就可以继续打印下面的东西了,很节约纸张,
这样该怎么办?? 在PowerBuilder中可以通过下面的语句实现:
PrintSend(ll_job,CHAR(27) + CHAR(67) + CHAR(ll_row)),那么在Delphi中是不是可以采用
同样的方式来实现呢? 同时,我也试过Printer.Abort,但程序提示说:
“Printer is not Currently printing”。 这是为什么呢?
 
window打印是以页为单位的,对于针式打印机可以采用设定页长度足够小的办法。
 
pazee的说法我是部分赞成的,但在PB中确实实现了我以上的要求,在Delphi中如何实现呢?
 
如果是针式打印机,只打文本的话你可以直接用输出到打印机
AssignFile(p, 'LPT');
Writeln(p, '第一行');
 
sorry,这种方法不行。
 
在Delphi中可能不能实现您说的要求! 要打印可能就是打印一页!
 
没有理由的。
 
不换页每次打印一行
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.

 
jsxjd
你说的这中方法还是会自动走纸的
 
PB中的 PrintSend 函数的 Delphi实现
function PrintSend(Prn: TPrinter;
S: String): Integer;
begin
Prn.begin
Doc;
Result := Escape(Prn.Handle, PASSTHROUGH{ = 19}, Length(S), PChar(S), nil);
Prn.EndDoc;
if Result = SP_ERROR then
Result := 0 else
Resule := 1;
end;

 
不好意思,LiChaoHui,你的程序我在EPSON LQ-1600KIII上失败了!
我想,用Escape的方法最多只能在针式打印机上,在喷墨和激光打印机上肯定不行!
 
需要先调用Printer.begin
doc
然后调用 PrintSend,
再调用Printer.EndDoc
这样才能起作用的,否则肯定失败的
 
执行完上面的东西后再开始打印
 
请问LiChaoHui,在Printer.begin
doc和Printer.EndDoc间调用PrintSend会出错,能否举一个例子看看.
 
我试过用TRawPrinter,在Epson的喷墨打印机上成功了,但在利盟的E312L的激光打印机上却失败了,看来TRawPrinter不是很通用,大家还有更通用的办法吗?
 
设定打印机不要自动换页就好了,不需要编程,针打更好做,可以在打印机中设定
 
[:)][:D][8D][:(][:(!][^][?] 更多 ...
 
请问激光打印机能否控制走纸啊,好像控制不了的啊.
 
后退
顶部