如何每次打印一行而不是一页(200分)

  • 主题发起人 主题发起人 qsilence
  • 开始时间 开始时间
Q

qsilence

Unregistered / Unconfirmed
GUEST, unregistred user!
在本人开发的程序中有一个故障记录模块,
需要每次在针打打印机上输出一行故障记录,
可每次总是输出一页,请高手指点一二。
打印机:EPSON LQ 1600K III
环境:98/NT
DELPHI5
 
每次打一页是由于WINDOWS打印管理是以每一页为单位的
解决的办法是1:使用自定义纸张,将高度设成打印机允许的
最小值
2:听说有人用直接写断口的方法来实现,不过没用过
 
dos 窗口下
echo this line is to printer >prn
会不会卷页?
若不会,可否直接调用echo。
 
给你出个“嫂”主意:

动态把纸张定义为“最小”

再通过设定Top值 bottom值

预览,直到只有 X 条记录。定下来。

自动会帮你分页。
 
用writefile写LPT口行不?听说速度还挺快?
 
如果输出比较简单,用API函数直接发字符到打印机也可以的,
我曾经试验过
 
API应该好一些
 
是不是没指定DETAIL类型?
 
给你一个例子,肯定能行的。
unit RAWPrinting;
{$B-,H+,X+}

interface

uses SysUtils;


type
ERAWPrintError = class(Exception);
ERAWPrintErrorPrinterName = class(ERAWPrintError);


procedure RAWPrint(PrinterName,do
cumentTitle,do
cumentData: string);
// PrinterName - the name of the printer you want to use
// to use the default printer - leave this blank
//do
cumentTitle - the text that is listed in the Print Manager
//do
cumentData - the text you want to send to the printer

implementation

uses WinSpool, Windows;

const
errNoDefaultPrinter = 'No default printer found.';
errOpenPrinter = 'The printer "%s" is not available.';
errPrintError = 'Error printing thedo
cument "%s".';

function DefaultPrinter:string;
var str: array[0..79]of Char;
function FetchStr(s:string):string;
var i: Integer;
begin

s:= TrimLeft(s);
i:= Pos(',',s);
if i=0
then
Result:= s
else
Result:= Copy(s, 1, i-1);
end;

begin

GetProfileString('windows', 'device', '', str, SizeOf(str)-1);
Result:= FetchStr(str);
if Result='' then
raise ERAWPrintErrorPrinterName.Create(errNoDefaultPrinter);
end;


procedure RAWPrint(PrinterName,do
cumentTitle,do
cumentData: string);
var hPrinter: DWord;
do
cInfo: TDocInfo1;
dwJob: Integer;
dwBytesWritten: DWord;
procedure PrintError;
begin

raise ERAWPrintError.Create(Format(errPrintError, [DocumentTitle]));
end;

begin

if PrinterName='' then
PrinterName:= DefaultPrinter;
if not OpenPrinter(PChar(PrinterName), hPrinter, nil) then

raise ERAWPrintErrorPrinterName.Create(Format(errOpenPrinter, [PrinterName]));
try
do
cInfo.pOutputFile:= nil;
do
cInfo.pDatatype:= 'RAW';
do
cInfo.pDocName:= PChar(DocumentTitle);
dwJob:= StartDocPrinter(hPrinter, 1, @DocInfo);
if (dwJob=0) then
PrintError;
try
if not StartPagePrinter(hPrinter) then
PrintError;
try
if not WritePrinter(hPrinter, Pointer(DocumentData), Length(DocumentData), dwBytesWritten)
then
PrintError;
if (LongInt(dwBytesWritten)<Length(DocumentData))
then
PrintError;
finally
if not EndPagePrinter(hPrinter) then
PrintError;
end;

finally
if not EndDocPrinter(hPrinter) then
PrintError;
end;

finally
ClosePrinter(hPrinter);
end;

end;



end.


 
API函数有哪些?
 
黄豆的办法对,好像我以前也贴过
 
由没有那么复杂呀!
直接向打印口发命令就行了

var F: TextFile;
begin

AssignFile(F, 'LPT1');
ReWrite(F);
try
Writeln(F, '你好?');
finally
CloseFile(F);
end;

end;

 
用ASSIGNFILE()打印的中文是乱码,如何解决??
 
用Shenxinaz的方法可以,但打印汉字必须打印机带字库,如何控制打印字体大小?
如打印机不带字库如何解决?表格如何打印?
 
没汉字库当然也可以解决,找一下打印机控制命令,先形成位图让后用打印机的图形方式
发过去
 
在打印前根据记录数动态设置页长
 
向端口直接写字符串啦,当成文件设备用。
 
多人接受答案了。
 

Similar threads

后退
顶部