关于在Delphi下控制PRINTER?(50分)

  • 主题发起人 Victor.Sun
  • 开始时间
V

Victor.Sun

Unregistered / Unconfirmed
GUEST, unregistred user!
我想控制针打下的字符控制位,But So tired!
Who can tell me how to control it?
My printer: STAR AR-2400
Develop envirment:Delphi 4
我的STAR AR-2400操作手册上的例子全部是BASIC的,怎么移植?
 
装上STAR AR-2400打印机驱动程序,
用Printer的Canvas不就可以打印了吗?
为什么一定要用它的控制符呢?
 
看看WinAPI Escape 函数是不是符合你的要求.
 
呵呵,这些Basic的例子非常容易移植:

例如:
10 LPRINT CHR$(27);CHR$(10);CHR$(17);

移植成Delphi得Pascal语句是这样的:

Uses
classes;

var
file:TFileStream;
//呵呵, 刚才才回答过怎样使用文件的问题,现在可以用上了
buf: array [0..256] of char;
begin

file.Create("PRN:", fmWrite);
buf[0] := #27;
// ESC
buf[1] := #10;
buf[2] := #17;
file.Write(buf, 3);

// Other printer operations go here


file.Free;
end.
 

Var
f :Text ;
begin

Assignfile(f , 'PRN');
Reset(F);
writeln(f , '你要的字符串1','你要的字符串2') ;
closefile(f);
end ;
 
说出你的具体要求,要控制什么 ?
 
I want to control the paper roll and
some of the control charactors such as specified in
the user's guide:
Example:(BASIC CODE)
10 LPRINT CHR$(27);"u2";"Output string"


 
刚刚查看了Delphi3 开发使用手册, 上面的一段话, 现摘抄如下:
你可以采用DOS时代同样的方法使用过程Writeln(): 给一个文本
文件变量赋值,打开该文件,写出一些行, 然后关闭文件. 有别于DOS
时代的是你所写的内容并不直接送到PRN口, 实际上当使用Writeln()
往打印机输出一行时, 打印机单元调用Widnows GDI的Text Out()命令.
好消息是通过Tprinter你很容易地改变字体和输出图形;
而坏消息是
你不能够发送自己的转义代码(Escape Codes)--至少不是很容易.
值得一提的是: Writeln()往打印机输送原数据(raw Data)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(这句没看懂)


鉴于以上的说法, 你可以试着将AR2400定义为一个"常用--纯文本打印机" ,
然后用Writeln()的方法. 或用Pegasu的方法试验一下:

附一段打印代码:

Uses Printers ;
var myfile :textFile ;
begin

assignPrn(MyFile);
rewrite(myfile);
writeln(myfile,'hello world!');
system.closefile(myfile);
end;


BTW , 你安装了Ar-2400的windows驱动程序了吗.
 
I install the driver on WIN98
Windows-->control panel-->Add Printer-->then
select Star AR-2400
 
你先试一下我提供的代码, 或Pega的代码,
并告知我结果.
 
SeaSky:
我试了一下你提供的代码:打印输出倒是没问题,不过打印机每次都滚一页,
达不到目的。我想是打完HELLO WORLD便停住。还有像打印会馆回滚即行之类的
功能。即如AR-2400 Operator Manual中的ESC u1 'output string'等.

Pega的代码在Delphi 4 下有问题.
我改为:
var
file1:TFileStream;

buf: array [0..256] of char;
begin

file1.Create('PRN', fmOpenWrite);
buf[0] := #27;
// ESC
buf[1] := 'u';
buf[2] := '3';
buf[3] := 'T';
buf[4] := 'i';
file1.WriteBuffer(buf, 5);

file1.free;
end;


后,在执行到file1.free;句时出错:
Access violation at address 0041606AF in module
'Project1.ext'. Read of address 5433751B'


 
Windows 打印机是一种基于页面描述排版的打印,
它处理时, 是对一个整页的页面进行处理, 并且输出
都是以页为单位, 进行打印输出, 所以当打印完成时,
(system.closefile(myfile);)
它就将整页输出了, 你可以试着再多输出几或几十行使其超过一页
(用个循环之类的), 并用单步调试看看执行效果.

结果没试过, 我猜想可能会象这样,
假设一页可以打50行,试验输出70行, 当程序输出第51行时, 打印机才开始
工作, 输出第一页, 当colsefile时, 打印机输出第二页(20行).

试试吧!!!
 
同样的问题,很想知道结果.
 
SeaSky:
I have try it. As you said. 但是达不到前面我所说的目的.
如何解决?

 
你能告诉我, 你为什么要停下来, 究竟想实现什么样的过程,
(实时监控? ) .
 
为的是套打有固定格式(Width &
length)的连续纸.
 
你用过Delphi给的QuickReport吗, 它完全可以实现.
你若没有用过, 看看例子, 比较好用.
关键将页面大小设定为(Width &
length), 这样每个固定格式
就是一页. 从而达到按页输出的要求. 并且用QuickReport这类
的打印方法可以做到同打印机无关的打印效果.
 
当然用过,Include Report builder. But I could not find how to
set the fixed size. So I had to use the Tprinter or file method.
好像不好用,你是否确定能搞定?
 
我用Qr当然可以搞定, Report biulder 也可以搞定,
关键在于自定义纸张.
在QuickRep上按鼠标右键设置页面, 在纸张设定上设置成
你需要的固定大小. (Custom Size)

Qr 有两种单位, cm 和inch , 设置后按apply ,

Qr 对于自定义纸张有点Bug , 你的Windows 下打印机的控制面板中,
打印机纸张属性一栏中, 自定义纸张所用长度和宽度值要调整.调整
到多少, 你试一试了.

你的数据源是DataSet 还是其他来源?

btw 同样在nanjing , 好累的说, 麻烦你在
<a href=http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=122161>
这个问题</a>中签个字


 
接受答案了.
 

Similar threads

D
回复
0
查看
920
DelphiTeacher的专栏
D
I
回复
0
查看
3K
import
I
I
回复
0
查看
585
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部