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

    unit BPrint;
    interface
    uses Objects, Prt;   { Prt is included after! }
    procedure PrintCollection(const Port : word; P : PStringCollection);
    implementation
    uses MsgBox, Views;
    function WriteStr(Port : word; Str : String): boolean;
    var x : boolean;
        q : word;
        i : byte;
    begin
        repeat
            x := Ready(Port);
            if not x then q := MessageBox(^C'Printer not Ready.  Try Again?', nil,
                               mfYesButton + mfNoButton + mfError);
        until x or (q = cmNo);
        i := 1;
        while (Ready(Port)) and (q <> cmNo) and (i <> Length(Str)+1) do begin
            x := Ready(Port);
            if not x then q := MessageBox(^C'Printer Error!  Try Again?', nil,
                               mfYesButton + mfNoButton + mfError);
            if q <> cmNo then
                if WriteChar(Port, Str[i]) then Inc(i);
        end;
        WriteStr := False;
        if Ready(Port) and (q <> cmNo) then begin
            WriteChar(Port, #13);
            WriteChar(Port, #10);
            WriteStr := True;
        end;
    end;

    procedure PrintCollection(const Port : word; P : PStringCollection);
    var x : integer;
        q : word;
    begin
        q := MessageBox(^C'To print, ready your printer and Press OK', nil,
             mfInformation + mfOkCancel);
        if q = cmOk then begin
            x := -1;
            repeat
                inc(x);
            until not WriteStr(Port, PString(P^.At(x))^) or (X = P^.Count - 1);
        end;

    end;
    end.

    { ----          CUT HERE  -------- }

    unit Prt;
    interface
    uses objects;
    const
        Lpt1        =   0;                  Lpt2        =   1;
        Lpt3        =   2;                  lf          = #10;
        cr          = #13;                  pTimeOut    = $01;
        pIOError    = $08;                  pNoPaper    = $20;
        pNotBusy    = $80;
        pTestAll    = pTimeOut + pIOError + pNoPaper;
    function WriteChar(const APort : word; s : char): boolean;
    function Ready(const APort : word): boolean;
    function Status(const APort : word): byte;
    procedure InitPrinter(const APort : word);
    implementation
    procedure InitPrinter(const APort : word); assembler;
    asm
        mov     ah, 1
        mov     bx, APort
        int     17h
    end;
    function Status(const APort : word): byte; assembler;
    asm
        mov     ah, 2                   { Service 2 - Printer Status }
        mov     dx, APort             { Printer Port               }
        int     17h                     { ROM Printer Services       }
        mov     al, ah                  { Set function value         }
    end;
    function Ready(const APort : word): boolean;
    begin
        Ready := Status(APort) and pTestAll = $00;
    end;
    function WriteChar(const APort : word; s : char): boolean;
    begin
        if Ready(APort) then
         asm
            mov     ah, 0               { Printer Service - Write Char }
            mov     al, s               { Char to write                }
            mov     dx, APort           { Printer Port                 }
            int     17h                 { ROM Printer Services         }
            mov     al, 0               { Set procedure to false       }
            and     ah, 1               { Check for Error              }
            jnz     @End                { Jump to end if error         }
            mov     al, 1               { Set procedure to true        }
           @End:
        end;
    end;

    end.

    { ----------------   CUT HERE --------------------- }
    {
        Here's a sample test program so you don't have to write one yourself
        :).
    }

    uses BPrint, Prt;

    function Int2Str(const i : longint): string;
    var s : string;
    begin
       Str(i, s);
       Int2Str := s;
    end;

    var x : integer;
        q : PStringCollection;
    begin
        q := New(PStringCollection, Init(10, 10));
        for x := 0 to 64 do q^.Insert(NewStr(Int2Str(Random(4000))));
        PrintCollection(Lpt1 {Change for your printer}, q);
    end.

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