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

{
Jack Wilson

The Objective is to intercept when the Printer is off-line, and give the
user a reminder to turn the Printer on-line, and press any key to resume
printing.

I Realize this is most certainly an FAQ, and I have found some source
code on Timo's site For TP 5.5 that I have modified (see below), but
there is not much talk anymore about TP 3.0.

Anyway, to avoid making a lot of changes to my source code, I thought I
would reWrite the LstOut Procedure (which according to the manual, is
called by routines accessing the LST: device) as shown at the end of
the following listing.  This is inefficient, since it is being called
for each Character that is output to the Printer.  Does anybody have a
better suggestion?  I might add the way it is now, if an off-line
signal is detected, the LstOut will only print the first Character
('t') in the Write(lst,'test') in the main Program, With the 'est'
going to the screen.  if I remove the statements in the While loop of
LstOut, then all of 'test' goes to the Printer, but it defeats my
purpose of giving the user a message.
}

{by David R. Conrad, For Turbo Pascal 5.5

   This code is not copyrighted, you may use it freely.
   There are no guarantees, either expressed or implied,
   as to either merchantability or fitness For a particular
   purpose.  The author's liability is limited to the amount
   you paid For it.
   David R. Conrad, 17 Nov 92
   David_Conrad@mts.cc.wayne.edu
   dave@michigan.com
}

Const
  { For use With the Printer Functions }
  PrnNotBusy = $80;
  PrnAck     = $40;
  PrnNoPaper = $20;
  PrnSelect  = $10;
  PrnIOError = $08;
  PrnTimeout = $01;

Type
  Word   = Integer;
  AnyStr = String[255];

Var
  PrinterNumber : Byte;

{ all routines are documented in the Implementation section }

Procedure InitRegisters(Var Reg : Registers);
{ initialize Variable of Type Registers: slightly anal-retentive }
begin
  fillChar (Reg, sizeof(Reg), 0);
  Reg.DS := DSeg;
  Reg.ES := DSeg;
end;

Function PrnOnline(Printernumber : Byte) : Boolean;
{ Is LPT(Printernumber) online? }
Var
  Reg : Registers;
begin
  InitRegisters(Reg);
  Reg.AH := 2;
  Reg.DX := Pred(Printernumber);
  Intr($17, Reg);
  PrnOnline := (Reg.AH and PrnSelect) = PrnSelect;
end;

Procedure pause;
Var
  c : Char;

begin
  c := #127;
  Repeat
    if KeyPressed then
      c := ReadKey;
   Until c in [#0..#126];
end;


{**************************************************************************}
{THIS IS THE ROUTINE in QUESTION}

Procedure LstOut(ch : Char);

Var
  Reg : Registers;

begin
  While not (PrnOnline(PrinterNumber)) do
  begin
    {if I TAKE OUT THESE NEXT THREE LINES, then OUTPUT PaUses Until Printer
     IS ON-LINE, and then ALL CharS PRINT to Printer}
    GotoXY(1, 23);
    ClrEol;
    Write('Please check Printer, and press any key when ready...');
    pause;
  end;
  initRegisters(Reg);
  Reg.AH := 0;
  Reg.DX := Pred(PrinterNumber);
  Reg.AL := Byte(ch);
  Intr($17, Reg);

end;

{**************************************************************************}

begin
  PrinterNumber := 1;
  LstOutPtr     := ofs(LstOut);
  Writeln(lst, 'test');
end.


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