请问各位大侠:如何实时中断打印任务?(200大分)(200分)

  • 主题发起人 主题发起人 reedblue
  • 开始时间 开始时间
R

reedblue

Unregistered / Unconfirmed
GUEST, unregistred user!
在打印过程中,Delphi程序已经将打印任务发往打印机,如何实时监测打印的进程,并
且以对话框进程条的形式提供给用户,并且实时中断打印任务,将打印池中的任务数据
清空?请给一个示例。如果那位大侠解决此问题,除了200分以外,再提供一个有关打印
方便设置打印纸张(含自定义纸张)的吐血单元(9X、Me、NT、2000均可支持)。
 
使用DEVMODE结构吧,很好办的。
 
用api, getprinter(printer.handle,2,bufprinterinfo2,sizeof(printer_info_2),counts)
得到printer_info_2的值, 然后bufprinterinfo2^.pDevMode就是devmode.

来自:smilboy 时间:2001-01-10 20:45:09 ID:424996
用 GetJob 可以返回指定打印机的打印任务

BOOL GetJob(
HANDLE hPrinter, // handle of printer
DWORD JobId, // job identifier value
DWORD Level, // data-structure level
LPBYTE pJob, // address of data-structure array
DWORD cbBuf, // count of bytes in array
LPDWORD pcbNeeded // address of value that contains count of bytes retrieved (or required)
);




 
可以参考的quickreport里面 Help
有有关解决此问题的解答
 
在 Win32 程序员参考大全(一)中这样写道:
1.设置一个Boolean标志,应用程序中止进程可以检测这一标志而判定打印是否应该继续进
行。
2.登记应用程序的打印作业中止函数。
3.显示一无模式 Cancel 对话框。
4.显示对话框时,使应用程序窗口无效。

请问大侠们:在Delphi 中怎么实现?
 
还有:
Zwma 大侠,我怎么找不到你说的参考信息呢?很惭愧,我的 E 文很不行。:)
 
procedure TForm1.Button6Click(Sender: TObject);
var id:string;
jobid:Cardinal;
ListItem: TListItem;
begin

if lv.Selected=nil then
Exit;
id:=lv.Selected.Caption;
if id='' then
Exit;
if MessageDlg('Are you sure you want to delete this Print job?',
mtConfirmation, [mbYes, mbNo], 0) = mrNo then
exit;

jobid:=StrToInt(id);
setJob(DevM,Jobid,0,@Jobs,JOB_CONTROL_CANCEL);

//ListItem:=lvt.Items.Add;
//listItem.Caption:=id;
//listItem.SubItems:=lv.Selected.SubItems;
ListViewDeleteRow(id,lv);

end;


procedure TForm1.Button7Click(Sender: TObject);
var
Dev, Drv, Prt: Array[0..255] of Char;
DM1: PDeviceMode;
DM2: PDeviceMode;
Sz: Integer;

begin


Printer.PrinterIndex := -1;
{ 1 Default }
Printer.GetPrinter(Dev, Drv, Prt, DevM);
If OpenPrinter(Dev,DevM,nil) then
begin

//If EnumJobs(DevM,0,10,1,@JI,SizeOf(TJOBINFO1)+128,Need,Return) then
begin

If EnumJobs(DevM,0,20,1,@JI,SizeOf(JI),Need,Return) then
begin

if Return<0 then
exit;

//if EnumJobs(DevM,FirstJob,LastJob+1,InfoLevel,@Jobs,SizeOf(Jobs),BytesNeeded,NumJobs) then
begin

showmessage(inttostr(ji[0].JobId));
showmessage(StrPas(Ji[0].pStatus));
If JI[0].JobId>0 then
begin

showMessage(Format('正在打印: %s / %d',[StrPas(JI[0].pStatus),JI[0].TotalPages]));
end;

end else
showmessage('bad');
end;

end;

end.
 
到cakk.126.com上面下在《delphi5开发人员指南》
里面的打印一章又很好的方法
 
多人接受答案了。
 

Similar threads

后退
顶部