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

{
RANDALL WOODMAN

NOTE: There is a call to a Procedure called YNWin.  It is defined as:
     YNWin(s : String; Var ch : Char; Color : ColorSet);
Color set comes from the ObjectProfessional package from TurboPower software.
YNWin is derived from one of their Objects.  Basically it pops up a Window,
displays the String, s, in the colors specified, and waits For a Y or N Char
from the user.  It returns that result in CH.
     I did not include YNWin in this post.  However, you can easily Write
a Procedure to take it's place.  I only left the calls in place to show you
what I do when I do need interaction from the user.
     The Printer codes used are specific to an Epson compatible Printer.
Check your user manual For other Printer support.
}

Unit IThinkClintonsDefecetReductionPackageSucks;

Uses
  Dos;

Const
  TimedOut   = $01;  { Used to determine the Type of Printer error }
  IOError    = $08;
  OutOfPaper = $20;
  NotBusy    = $80;
  TestAll    = TimedOut+IOError+OutOfPaper;

Var
  PrnStatus : Byte;

Function PrinterReady : Boolean;
{ checks the status of the Printer and returns True if ready      }
{ to recieve a Character                                          }
{ 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;
    PrinterReady := (TempStatus and TestAll = $00);
  end;
end;

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   : YNWin('Printer timed out.  Retry??? (Y/N)',Ch,Mycolor);
      IOError    : YNWin('An IOError has occured.  Retry??? (Y/N)',CH,Mycolor);
      OutOfPaper : YNWin('Printer out of paper.  Retry??? (Y/N)',CH,Mycolor);
    else
      YNWin('A Print Device Error has occured.  Retry??? (Y/N)',CH,Mycolor);
    end; { Case }
    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);
    EscapePushed := (Ch = Chr(27));
  end
  else
    EscapePushed := False;
end;

Procedure ConfirmQuit(Var ESC : Boolean);
{ confirms that the user wants to quit printing }
Var
  CH : Char;
begin
  YNWin('Cancel all print jobs? (Y/N)',Ch,Mycolor);
  ESC := (CH = 'Y');
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+}
  OK := (IOResult = 0);
end;

Procedure MakeLine(Start, Stop : Integer; Return : Boolean; Var ESC : Boolean);
{ Draws a line on the paper starting at Start and ending at Stop. }
Var
  PrnReady,
  Ok       : Boolean;
begin
  PrnReady := True;
  Repeat
    PrnReady := PrinterReady;
    if not PRnReady then
      GetPrnError(ESC);
  Until PrnReady or ESC;

  PrnReady := True;
  While prnReady and not Esc and (Start <> Stop + 1) DO
  begin
    prnReady := PrinterReady;  { do three test to be sure }
    if not PRnReady then
      GetPrnError(ESC);
    if not ESC then
      PrintCH('_',False,OK);
    if not ESC then
      if EscapePushed then
        ConfirmQuit(ESC);
    if OK then
      Inc(Start);
  end;
  if not Esc and PrnReady and RETURN then
    {$I-} Writeln(LST); {$I+}
end;

Procedure WriteStr(TheStr : String; Return, UnderLine : Boolean;
                   Var ESC : Boolean);
Var
  PrnReady,
  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]