delphi7中用fastreport  frxreport1.PrepareReport;
  frxreport1.PrintOptions.ShowDialog:=false;
  frxReport1.PrintOptions.Printer := 'GP5890XIII';  //GP5890XIII是一台打印机的名字
  frxreport1.Print;  程序中连接了好多打印机(串口、并口、网口、USB),问题是: 
  一旦某台打印机出现问题后怎么将 出现问题的打印任务换到另外一台打印机上打印出来

解决方案 »

  1.   

    unit   Unit1;         
    interface         
    uses         Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,Printers,   WinSpool,         Dialogs,   StdCtrls;         
    type         TForm1   =   class(TForm)             
    Button1:   TButton;             
    Memo1:   TMemo;             
    procedure   Button1Click(Sender:   TObject);         
    private             {   Private   declarations   }        
    public             {   Public   declarations   }         
    end;         
    var         
    Form1:   TForm1;        
     implementation         {$R   *.dfm}         
    procedure   TForm1.Button1Click(Sender:   TObject);     
    function   PrinterStatusText(Status:   Integer):   String;     
    begin         
    case   Status   of  0:                                                         
    Result   :=   'Waiting';             
    JOB_STATUS_PAUSED: Result:=   'Paused';             
    JOB_STATUS_ERROR:  Result:=   'Error';             
    JOB_STATUS_DELETING: Result :=   'Deleting';             
    JOB_STATUS_SPOOLING:Result :=   'Spooling';             
    JOB_STATUS_PRINTING: Result :=   'Printing';             
    JOB_STATUS_OFFLINE:Result :=   'Offline';             
    JOB_STATUS_PAPEROUT: Result  :=   'Paper   Out';             
    JOB_STATUS_PRINTED: Result  :=   'Printed';             
    JOB_STATUS_DELETED: Result  :=   'Deleted';             
    JOB_STATUS_BLOCKED_DEVQ: Result   :=   'Blocked';             
    JOB_STATUS_USER_INTERVENTION:Result   :=   'User   Intervention';             
    JOB_STATUS_RESTART:Result   :=   'Restart';         
    else   Result   :=   'Status   '   +   IntToStr(Status);         
    end;     
    end;     
    //     procedure   GetJobs(PrinterName:   String;   JobList:   TStrings);     
    const         
    InfoLevel   =   1;         
    FirstJob   =   0;        
     LastJob   =   19;     
    var         
    Jobs:   array   [FirstJob..LastJob]   of   TJobInfo1;         
    PrinterHandle,   BytesNeeded,   I,   NumJobs:cardinal;//   Integer;     
    begin         
    if   OpenPrinter(PChar(PrinterName),PrinterHandle,nil)   then   
    begin         
    if     EnumJobs(PrinterHandle,FirstJob,LastJob+1,InfoLevel,@Jobs,SizeOf(Jobs),BytesNeeded,NumJobs)   then  
    begin                 JobList.Clear;                
     for   I   :=   0   to   NumJobs-1   do                 
    with   Jobs[I]   do                     
    JobList.Add(Format('%s(%s)',[StrPas(pDocument),PrinterStatusText(Status)]));             
    end;            
     ClosePrinter(PrinterHandle);         
    end;     
    end;     
    begin     GetJobs('hp   deskjet   3500   series',Memo1.Lines);         
    end;         
    end.   
      

  2.   

    注意:
    當打印任務序列執行完成後,一定要清除它的打印任務序列;一般會以下方法:
    1.EndDocPrinter
    但很多时候不一定有效,最好还是找服务提供商获取sdk2.如果内容已到打印机缓存里,就只有调整用打印机驱动的清除任务DLL了
    WINAPI仅能清除内存缓冲的内容
      

  3.   

    市面上绝大部分的打印机都不支持状态反馈,当打印机无纸、卡纸、断电等因素造成无法打印,操作系统也是不知道的。但也有极少的打印机是支持状态反馈的,好象爱普生的,型号记不得了,当然得调用API来打印并需要自己另做一个打印队列管理程序。