如何在打印中暂停(然后按任意键继续)(200分)

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

superdd

Unregistered / Unconfirmed
GUEST, unregistred user!
我用C++ Builder4.0,用QRDesign1.41设计打印报表,现在想实现在打印中暂停,但又
不想抛弃以往用QRDesign1.41设计的报表,希望高手指点.
 
Windows下的打印是两阶段的,你先在打印设备句柄上画好一页,然后打印,在打印时是由
Windows和打印驱动程序控制的,想停下来不容易,可以手快点把打印机关掉。

另外:你分开几部分打印不行吗,让用户选择
 
同意203010,要实时的暂停是不可能的,程序中的打印与实际打印机是不同步的。
程序中已经打印完成甚至关闭,打印机可能还在预热没开始打呢。(当然,也有些
打印机很实时的,但只是有些。。。)
如果只是每打印一页就暂停一下按任意键继续,这还是可以的。
 
完全同意楼上的,补充一点是,打印一行以后,也可暂停。
 
确实,在WINDOWS系统中,打印过程是由应用程序把打印任务输出至系统,由系统最后完成。
因此打印暂停只能在应用程序在向系统输出时进行。
 
windows中,还有好多的系统中都是采用Spooling技术,不可能实时中断的啊
 
不实时暂停也可以,只要能够打印一部分之后暂停就可以了(不一定是每一页),
最好能有源码.
 
如果是用打印的自带字体进行文字打印,则可以做到打印某一行之后暂停,很简单,
SHOW一个MESSAGE出来“请按OK继续”就行;如果是图形、非纯文本报表打印,则是
按页打印的。你也可以“打印”一部分之后暂停,但其实是打印到缓冲区,打印机
是只有满一页了才开始打印。

没有用过QRDesign1.41,我举一个QuickRep的例子:
QuickRep中每个BAND都有BeforePrint事件。
procedure TForm1.PageHeaderBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
Sta: Short;
begin

Sta := GetKeyState(VK_F2);
//如果F2被按住,则暂停打印
if (Sta and $80) <> 0 then

ShowMessage(Sender.Name+' 正在打印时被暂停。请按OK继续...');
end;

CB中大约是这样:
void TForm1->PageHeaderBand1BeforePrint(TQRCustomBand Sender,
bool &amp;
PrintBand)
{
short Sta;
Sta = GetKeyState(VK_F2);
//如果F2被按住,则暂停打印
if !(Sta &amp;
0x80)
ShowMessage(Sender->Name+' 正在打印时被暂停。请按OK继续...');
}
 
非常感谢Huzzz以及其他几位高手,但是我还是有一些问题,在实际运行中,
暂停仅仅发生在程序中,似乎对实际打印并没有什么影响.
是不是我还有一些应该注意的问题?
(我用网络打印机,不知对否,是不是只能用本地打印机?)
 
我的看法,打印可以使用API函数。当然了,这可能就无法利用到QRDesign1.41的性能了。
我没有尝试过。不过,我还是说我知道的东西,给你一点提示

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 类的几个常用属性:
&amp;#8226;
Aborted 判断是否中止打印作业。
&amp;#8226;
Canvas 画布属性。
&amp;#8226;
Capabilities 当前打印机驱动设备的设置信息。
&amp;#8226;
Copies 打印的份数。
&amp;#8226;
Fonts 字体属性。
&amp;#8226;
Handle 打印机句柄。
&amp;#8226;
Orientation 纸张的方向:横向或纵向。
&amp;#8226;
PageHeight 纸张的高度。
&amp;#8226;
PageNumber 当前打印的页数。
&amp;#8226;
PageWidth 纸张的宽度。
&amp;#8226;
PrinterIndex 打印机属性中当前打印机的索引值。
&amp;#8226;
Printers 系统中安装的所有打印机。
&amp;#8226;
Printing 标识是否正在进行一个打印作业。
&amp;#8226;
Title 打印管理器中显示的打印作业的名称。
下面是T P r i n t e r 类的几个常用函数:
&amp;#8226;
Abort 中止正在打印的打印作业。
&amp;#8226;
begin
Doc 向打印机发送一个打印作业。
&amp;#8226;
EndDoc 结束当前的打印作业并关闭文本文件变量。
&amp;#8226;
NewPage 开始新的一页并增加P a g e N u m b e r 属性。
&amp;#8226;
Refresh 更新字体和打印机的属性。
通常,在打印前要进行打印预览。在打印预览的时候,往往要将打印的结果在屏幕上显示
出来。这时,就要注意屏幕的分辨率和打印机的分辨率的差别了。读取屏幕信息可以通过全局
变量S c r e e n 来实现,S c r e e n 为T S c r e e n 类的一个实例,在创建工程的时候就自动创建了,并在程
序开始运行时读取了屏幕的一些设置信息。
 
>>暂停仅仅发生在程序中,似乎对实际打印并没有什么影响.
对呀,就是不能实时暂停。
 

Similar threads

F
回复
11
查看
405
lyq2276959
L
D
回复
6
查看
253
delphihsc
D
H
回复
0
查看
259
hope7758521
H
后退
顶部