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.