delphi如何直接想打印机发送打印指令(100分)

  • 主题发起人 主题发起人 linmang
  • 开始时间 开始时间
L

linmang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想直接控制打印机,是不是能实现想打就打,想停就停啊
 
请看:Printers.pas
printer.begin
doc;//开始
with printer.canvasdo
begin
.....
end;
printer.enddoc;//结束
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Print ;
// 可以直接打印窗体
end;
 
copy c:/a.txt prn
可以直接将文本文件输出到打印机!与驱动无关!
 
with Printerdo
begin
begin
Doc;
if not Aborted then
EndDoc;
end;
 
直接给LPT1送数据或打印命令!
procedure TForm1.Button1Click(Sender: TObject);
var
f:textfile;
begin
AssignFile(F, 'lpt1');
try
rewrite(f);
writeln(f,'打印测试');
finally
closefile(f);
end;
end;
 
procedure Tform_input_ckcz.pt(str:string);
var f : textfile;
begin
sleep(350);
AssignFile(f, 'LPT1');
str := str + chr(10);
rewrite(f);
Write(f,str);
closefile(f);
end;
 
printer.begin
doc;//开始
with printer.canvasdo
begin
//画需要打印的内容
end;
//因故退出打印
if 条件 then
begin
printer.Abort;
exit;
end;
printer.enddoc;//结束
 
var MyFile: TextFile;
begin
Assignfile(MyFile,'LPT1');
// or 'com1'
Rewrite(MyFile);
Write(MyFile,Chr(27)+'d'+chr(5));
Writeln(MyFile,' xfghxfgjhcfghjfhgkf ');
Write(MyFile,Chr(29)+'V'+chr(0));
System.CloseFile(MyFile);
end;
 
assignfile(f,'lpt');
rewriter(f);
writerln(f,chr(13)+chr(10));
close(f);
 
各位都很敬业谢谢了!
我用的是begin
doc
......
enddoc
可是他每次都打印一个固定的页长,我的打印机是超市的那种,我是想让他有多长的内容就打多长那种,如何实现啊?
是不是可以提前定认纸长,再begin
doc,可是我不会定义纸长啊,看了些别人的例子没用
 
Q:在Windows下怎样按字符方式驱动打印机
A:票据打印机不一定有Windows驱动程序,只能按照字符方式打印。可以在添加打印机时选择“常用/纯文本”类型,但这个驱动程序不能处理中文。另一个办法是不依靠驱动程序,直接按字符方式驱动打印机,请参考下列代码:
VAR
lpt :TextFile
begin
AssignFile( lpt, 'LPT1' );
ReWrite( lpt );
Write( lpt, '打印测试' );
Write( lpt, #12 );
//打印机换页
CloseFile( lpt );
END

 
想怎么打就怎么打.
begin
// 打印 票据
Printer.Title := '打印专用发票:' + fphm.Text + ' 开票人:' + zd.Text;
Printer.begin
Doc;
Printer.Canvas.Font.Name := '宋体';
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.Font.Size := 11;
Printer.Canvas.TextOut(Y + 1350, X + 100, khyh.Text);
Printer.Canvas.TextOut(Y + 1350, X + 130, zh.Text);
Printer.Canvas.TextOut(Y + 132, X + 206, fkdw.Text);
Printer.Canvas.TextOut(Y + 812, X + 206, Copy(kprq.Text, 7, 4) + '年' +
Copy(kprq.Text, 1, 2) + '月' +
Copy(kprq.Text, 4, 2) + '日');
Printer.Canvas.TextOut(Y + 334, X + 265, cm.Text + hc.Text + hb.Text + cc.Text);
Printer.Canvas.TextOut(Y + 956, X + 265, tydh.Text);
Printer.Canvas.TextOut(Y + 1356, X + 265, Copy(khrq.Text, 7, 4) + '年' +
Copy(khrq.text, 1, 2) + '月' +
Copy(khrq.text, 4, 2) + '日');
Printer.Canvas.TextOut(Y + 162, X + 312, qyg.Text);
Printer.Canvas.TextOut(Y + 632, X + 880, swdjh.Text);
//税务登记
Printer.EndDoc;
end;
 
VAR
lpt :TextFile
begin
AssignFile( lpt, 'LPT1' );
ReWrite( lpt );
Write( lpt, '打印测试' );
Write( lpt, #12 );
//打印机换页
CloseFile( lpt );
END

 
没有简单的例子,只有复杂的思路:
1. 取得页长(in pixel)
2. 打印时跟踪每行的高度和行间距, 判断是否超过当前页长, 如果超过, 超过多少(假设为x)
3. 如果正好一页打完则从换页继续打印下一行
如果这行跨页, 则换页, 设开始位置为(x-行高),重打当前行一次
4. 继续以上操作直到全部打完
 
ColNam:array of string;//字段名
flx:string;
lxi:array of integer;//记录列线位置
ColItem:array of string;//列名
fcolcount:字段数
fhead:integer;//打印位置Y坐标
with printerdo
begin
for i:=1 to fcolcountdo
canvas.TextOut(lxi[i-1]+(lxi-lxi[i-1]-canvas.textwidth(colnam[i-1]))div 2,fhead,colnam[i-1]);
canvas.MoveTo(lxi[0],fhead);
canvas.LineTo(lxi[fcolcount],fhead);
canvas.moveto(lxi[0],fhead+flineheight);canvas.lineto(lxi[fcolcount],fhead+flineheight);
end;

 
可是,如果我要打的不够一页,比如只有半页,我要打过半页后不走纸了,停下来,另半页可再打一次,怎么办呢?
我的打印机是接在com1口的,lpt1不能用吧,不是串口,不是针式打印机,是热敏打印机
 
Tpringer用的是WINDOWS的打印驱动,要做到你的想法.只能直接对LTP1或COM操作
打印命令可以查一下你所用打印机的命令手册!
procedure TForm1.Button1Click(Sender: TObject);
var
f:textfile;
begin
AssignFile(F, 'COM1');
try
rewrite(f);
writeln(f,'打印测试');
finally
closefile(f);
end;
end;
 
我问个问题:
我今天用
begin
Doc和EndDoc
可是如果不用PrintDialog,打印出来的就是空白,
请问是怎么回事?
 
方法1
procedure WriteRawStringToPrinter(PrinterName:String;
S:String);
var
Handle: THandle;
N: DWORD;
do
cInfo1: TDocInfo1;
begin
if not OpenPrinter(PChar(PrinterName), Handle, nil) then
begin
ShowMessage('error ' + IntToStr(GetLastError));
Exit;
end;
withdo
cInfo1do
begin
pDocName := PChar('testdo
c');
pOutputFile := nil;
pDataType := 'RAW';
end;
StartDocPrinter(Handle, 1, @DocInfo1);
StartPagePrinter(Handle);
WritePrinter(Handle, PChar(S), Length(S), N);
EndPagePrinter(Handle);
EndDocPrinter(Handle);
ClosePrinter(Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:=#27#117+'2'+'中国人民24X16'+#10;
WriteRawStringToPrinter('Star 2400',#26#78+'字间距3'+#10);
WriteRawStringToPrinter('Star 2400',#26#81+'字间距0'+#10);
WriteRawStringToPrinter('Star 2400',#27#48+'行距1/6'+#10);
WriteRawStringToPrinter('Star 2400',S);
WriteRawStringToPrinter('Star 2400',#27#117+'1'+'恢复24X24'+#10);
WriteRawStringToPrinter('Star 2400',#27#50+'行距1/8'+#10);
WriteRawStringToPrinter('Star 2400',#26#81+'中国人民'+#10);
WriteRawStringToPrinter('Star 2400',#28#14+'横向放大'+#10);
WriteRawStringToPrinter('Star 2400',#27#118+'逆向走纸');
WriteRawStringToPrinter('Star 2400',#10);
WriteRawStringToPrinter('Star 2400',' 定位');
WriteRawStringToPrinter('Star 2400',#27#102);
WriteRawStringToPrinter('Star 2400',#10#10+'正常走纸'+#10);
WriteRawStringToPrinter('Star 2400',' 定位'+#10);
end;

方法2
procedure TForm1.Button2Click(Sender: TObject);
var
F: TextFile;
begin
AssignFile(F, 'LPT1');
Rewrite(F);
Writeln(F, #26#78+'字间距3');
Writeln(F, #26#81+'字间距0');
Writeln(F, #27#48+'行距1/6');
Writeln(F, #27#117+'2'+'中国人民24X16');
Writeln(F, #27#117+'1'+'恢复24X24');
Writeln(F, #27#50+'行距1/8');
Writeln(F, #28#14+'横向放大');
Writeln(F, #27#118+'逆向走纸');
Writeln(F, ' 定位');
Writeln(F, #27#102);
Writeln(F, #10#10+'正常走纸');
Writeln(F, ' 定位');
CloseFile(F);
end;

 
后退
顶部