[Back to PRINTING SWAG index]  [Back to Main SWAG index]  [Original]

(*
I am trying to figure out how to trap errors as they occur in my
Program and send messages to the user.. The most common error would be a
failed attempt to print but I don't know how to not stop the Program
when an error occurrs. You see, I don't want to have an {$I-},{$I+}
after every time the Printer prints..


not having any details of what you are doing, I'll take a stab in the dark.
Have an output routine and pass it a String.  The output routine would take
the String and sent it to the Printer.  ( Since you mentioned Printer, I
assume this is where you wish to send all output.)  Now have an output routine
For the screen.  Ah heck, here's an example. <g>  This is some code I wrote to
output Various things to the Printer.  No doubt some will claim to have better
solutions.  That's fine, but here's mine.  There is a routine you will see
called OUTCON(s : String; CH : Char);  It is a routine to send output to the
screen and inForm the user that there is a problem.  of course that's a
different topic then sending output to the Printer.  Hope this helps.
*)

Const
  TimedOut   = $01;  { Used to determine the Type of Printer error }
  IOError    = $08;
  OutofPaper = $20;
  notBusy    = $80;
  TestAll    = TimedOut+IOError+OutofPaper;
  NoUL       = False;
  UL         = True;

Var
  PrnStatus : Byte;

Function PrinterReady : Boolean;
{ checks the status of the Printer and returns True if ready to recieve a Chara
{ This Function will return the status of your Printer.  Status      }
{ should be interpreted as follows:  (x'90' (d'144') is "Ready"):    }
{ $01 = Printer Time-out          $02 = not Used                     }
{ $04 = not Used                  $08 = I/O Error                    }
{ $10 = Printer Selected          $20 = Out of Paper                 }
{ $40 = Acknowledge               $80 = not Busy                     }
Var
   Regs : Registers;
   TempStatus : Byte;
begin
  With Regs Do
    begin
      DX := 0;
      AX := $0200;
      Intr($17,Regs);
      PrnStatus := Hi(AX);
      TempStatus := PrnStatus;
      if TempStatus and TestAll = $00 then PrinterReady := True
        else PrinterReady := False;
    end;
end; { Function PrinterReady }

Procedure GetPrnError(Var ESC : Boolean);
{ gets the error that occured With the Printer and gives the user a chance to }
{ correct the problem and continue. }
Var
  CH : Char;
begin
  Repeat
    PrnStatus := PrnStatus and TestAll;
    Case PRnStatus of
      TimedOut   : OutCon('Printer timed out.  Retry??? (Y/N)',CH);
      IOError    : OutCon('An IOError has occured.  Retry??? (Y/N)',CH);
      OutofPaper : OutCon('Printer out of paper.  Retry??? (Y/N)',CH);
    else OutCon('A Print Device Error has occured.  Retry??? (Y/N)',CH);
    end;
    if CH = 'N' then esc := True;
  Until ESC or PrinterReady;
end;

Function EscapePushed : Boolean;
{ Checks the keyboard buffer For a Character and test to see if it was the   }
{ Esc key.  if it was it returns True else it returns False.                 }
Var
  CH : Char;
begin
  if KeyPressed then        { Check the keyboard buffer For a Character }
  begin
    CH := ReadKey;          { if Character then check it }
    CH := UpCase(CH);
    if Ch = Chr(27) then EscapePushed := True
    else EscapePushed := False;
  end
  else EscapePushed := False;
end; { EscapePushed }

Procedure ConfirmQuit(Var ESC : Boolean);
{ confirms that the user wants to quit printing }
Var
  CH : Char;
begin
  OutCon('Cancel all print jobs? (Y/N)',Ch);
  if CH = 'Y' then ESC := True
    else ESC := False;
end;

Procedure FFeed;
{ sends a Form feed command to the Printer }
begin
  Write(LST,#12);
end;

Procedure PrintCh(CH : Char;
                  Underline : Boolean;
                  Var OK    : Boolean);
{ Writes a Single Character to the Printer }
begin
  if UnderLine then {$I-} Write(LST, #27#45#1, CH, #27#45#0) {$I+}
  else {$I-} Write(lst,CH); {$I+}
  if Ioresult <> 0 then OK := False
    else OK := True;
end;

Procedure WriteStr(TheStr  : String;
                   Return, UnderLine : Boolean;
                   Var ESC : Boolean);
Var
  PrnReady : Boolean;
  OK       : Boolean;
  I        : Byte;
begin
  Repeat
    PrnReady := PrinterReady
    if not PrnReady then GetPrnError(ESC);
  Until PrnReady or ESC;
  I := 1;
  While PrnReady and not Esc and (I <> Length(theStr)+1) do
  begin
    PrnReady := PrinterReady
    if not PrnReady then GetPrnError(ESC);
    if not ESC then PrintCh(theStr[I],UnderLine,OK);
    if not esc then if EscapePushed then confirmQuit(Esc);
    if OK then Inc(I);
  end;
  if PrnReady and not ESC and RETURN then {$I-} Writeln(LST); {$I+}
end;

[Back to PRINTING SWAG index]  [Back to Main SWAG index]  [Original]