我的程序里有这样一个问题:
一个卖衣服的程序,打印机是epson tm300,钱箱是posiflex cr3100
钱箱接在打印机上。
当每一张单完成之后,在打印之前要先弹出钱箱,然后打印。
根据手册,我是这样写的:assignfile(myprn,'LPT1');
rewrite(myprn);
write(myprn,chr(27),chr(112),chr(0),chr(50),chr(200));//弹钱箱的控制指令
system.CloseFile(myprn);然后是打印代码....在打印机电源打开的时候,运行是正常的,但是当打印机电源关闭的时候,
钱箱没有反应,程序死机。我想知道有没有什么方法可以判断打印机是否打开了电源,这样我就可以
选择跳过这段代码。

解决方案 »

  1.   

    1、运行程序的时候,眼睛往旁边看看打印机开了没有。哈哈最简单。2、电源的判断可以通过对打印机的状态判断。写多文字给你点提示T P r i n t e r 类的一个对象,该对象在P r i n t e r s 单元中定义。可以把P r i n t e r 全局函数看作一个全局变
    量,并利用这个全局变量来与打印机进行打印操作。
    利用P r i n t e r 来实现打印的一般过程如下:
    1) 调用B e g i n D o c 过程向打印机发送一个打印作业(此时还没有在打印机上开始打印)。
    2) 通过一个Te x t 变量或调用C a n v a s 对象方法建立打印输出。
    3) 调用E n d D o c 过程结束当前的打印作业,该打印作业开始在打印机上打印。
    4) 如果出现问题,调用A b o r t 过程取消当前打印的作业。
    下面是T P r i n t e r 类的几个常用属性:
    • Aborted 判断是否中止打印作业。
    • Canvas 画布属性。
    • Capabilities 当前打印机驱动设备的设置信息。
    • Copies 打印的份数。
    • Fonts 字体属性。
    • Handle 打印机句柄。
    • Orientation 纸张的方向:横向或纵向。
    • PageHeight 纸张的高度。
    • PageNumber 当前打印的页数。
    • PageWidth 纸张的宽度。
    • PrinterIndex 打印机属性中当前打印机的索引值。
    • Printers 系统中安装的所有打印机。
    • Printing 标识是否正在进行一个打印作业。
    • Title 打印管理器中显示的打印作业的名称。
    下面是T P r i n t e r 类的几个常用函数:
    • Abort 中止正在打印的打印作业。
    • BeginDoc 向打印机发送一个打印作业。
    • EndDoc 结束当前的打印作业并关闭文本文件变量。
    • NewPage 开始新的一页并增加P a g e N u m b e r 属性。
    • Refresh 更新字体和打印机的属性。
    通常,在打印前要进行打印预览。在打印预览的时候,往往要将打印的结果在屏幕上显示
    出来。这时,就要注意屏幕的分辨率和打印机的分辨率的差别了。读取屏幕信息可以通过全局
    变量S c r e e n 来实现,S c r e e n 为T S c r e e n 类的一个实例,在创建工程的时候就自动创建了,并在程序开始运行时读取了屏幕的一些设置信息。
      

  2.   

    问题不是出在打印上,是出在弹钱箱的代码上。
    也就是我直接向lpt1写数据的那条代码上。如果打印机打开了,什么事也没有
    如果没开,就死机,用try...except...end无法搞定。拜托各位了。
      

  3.   

    也就是怎样判断lpt1口可以用的问题。
      

  4.   


    没人会么?
    我在csdn和大富翁论坛都搜索了一下,也有人和我提同样的问题
    但是都没得到答案。
    自己顶一下。
    不行的话定期来顶
      

  5.   

    看MSDN上的关于打印机方面的函数,我忘了!一年前抱啃WIN2000API
      

  6.   

    我忘了说了,其实不是死机。
    现象就像是死机了,但这时候马上打开打印机电源,
    就会看到钱箱弹出来,就没事了。
    我有windows api的书,但是看了一遍打印机的函数,其实基本上delphi都已经
    封装了,但是关键是都是针对“安装”在windows中的打印机的。我试了一下,
    都没什么效果。大家都知道在windows中可以随便安装任意不存在的打印机吧?
      

  7.   

    还要说一句:
        本来卖pos机的给了一个开钱箱的程序,dos程序,这个程序无论打印机
    是否打开电源,都不会死机。
        但是如果在程序中调用它的话,钱箱的反应速度太慢。这就是我为什么
    自己写了开钱箱的代码的原因。
        但是从这个程序来看,应该是有办法解决的。
      

  8.   

    to: clion(清泉)
    可否详细说一下,比如是哪个函数,我也好去查查资料。
    谢谢。
      

  9.   

    忘了说了,我用winme,不用win2000
      

  10.   

    我建议你看一下关于串口的API,
    对于打印口LPT有一个脚,好象是DSR,只要打印机一上电就有效,通过API GetCommState取得一个DCB结构的数据,其中有各个脚的状态..
      

  11.   

    我碰到过一模一样的问题,把打印机电源一开就行了,否则就好象是死机了。如果解决了
    就告诉我一声:[email protected]
    告诉我是怎样解决的哦!THANK YOU 
      

  12.   

    可直接读打印口的状态,采用汇编的方式,对每个状态都有不同的返回值,包括打印机的电源的开关状态、打印机是否无墨、打印机是否卡纸等等多种情况。USB和LPT均可此操作。请看一下打印机的指令说明书。
      

  13.   

    以前在DOS下用ASM or TC用过一模块,在FoxBase+下调用过的,但丢了,思路就是如上所说的读取并判断LPT(378,37f中的一个具体要支看说明了)并口的状态字.