home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* XOBJECTS.PAS *)
- (* *)
- (* Drucker-Stream *)
- (* (C) 1992 by Christian Ohr & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- {$R-,S-,I-,B-,D-,L-,V-,A+,F+,O+,X+}
-
-
- UNIT XObjects;
-
-
- INTERFACE
-
-
- USES Objects;
-
- CONST
- LPT1 = 0;
- LPT2 = 1;
- LPT3 = 2;
-
- psOk = 0;
- psTimeOut = 1;
- psIOError = 2;
- psOffLine = 3;
- psPaperOut = 4;
- psNoAckn = 5;
- psBusy = 6;
- psPortErr = 7;
- psAborted = 8;
-
-
- PrnCodeStr : ARRAY[0..8] OF STRING[40] =
- (#3'Drucker ok',
- #3'Druckerfehler: Time out',
- #3'Allgemeiner Druckerfehler',
- #3'Druckerfehler: Nicht bereit',
- #3'Druckerfehler: Kein Papier',
- #3'Druckerfehler: Keine Bestätigung',
- #3'Druckerfehler: Nicht bereit',
- #3'Ungültiger Drucker-Port',
- #3'Druckvorgang abgebrochen');
-
-
- TYPE
-
- (* tPrintStream leitet Daten zum Drucker. Dabei wird *)
- (* fahren wie bei anderen Streamarten auch, lediglich *)
- (* ein Einlesen ist nicht möglich (logisch!). *)
-
- pPrintStream = ^tPrintStream;
- tPrintStream = OBJECT(tStream)
- PrnPort : WORD;
- CONSTRUCTOR Init (aPrnPort: WORD);
- PROCEDURE Error (Code, Info: INTEGER); VIRTUAL;
- PROCEDURE Reset;
- PROCEDURE TimeOut (Value: BYTE);
- PROCEDURE Write (VAR Buf; Count: WORD); VIRTUAL;
- PROCEDURE WriteStr (P: pString);
- END;
-
-
-
- IMPLEMENTATION
-
-
- USES Drivers, App, Dialogs, Views, XDialogs;
-
-
- FUNCTION CreatePrintMonolog: pMonolog;
- VAR
- M : pMonolog;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 50, 7);
- M := New(pMonolog, Init(R, 'Druckvorgang'));
- WITH M^ DO BEGIN
- Options := Options OR ofCentered;
- R.Grow(-4, -3);
- R.Move(0, -1);
- Insert(New(pBarView, Init(R)));
- R.Move(0, 2);
- Insert(New(pStaticText, Init(R,
- 'ESC drücken, um Drucken abzubrechen.')));
- END;
- CreatePrintMonolog := M;
- END;
-
-
- FUNCTION PrnOutput (P: WORD; B: BYTE): WORD; ASSEMBLER;
- ASM
- XOR AH,AH
- MOV AL,B
- MOV DX,P
- INT 17h
- MOV AL,AH
- XOR AH,AH
- END;
-
-
- FUNCTION PrnState (P: WORD): WORD; ASSEMBLER;
- ASM
- MOV AH,2
- INT 17h
- MOV AL,AH
- XOR AH,AH
- END;
-
-
-
- (* ------------------------------------------------------ *)
- (* tPrintStream *)
- (* ------------------------------------------------------ *)
-
-
- CONSTRUCTOR tPrintStream.Init (aPrnPort: WORD);
- BEGIN
- Status := 0;
- IF MemW[$40:$08 + (aPrnPort SHL 2)] <> 0 THEN
- PrnPort := aPrnPort ELSE
- Error(stInitError, psPortErr);
- END;
-
-
- PROCEDURE tPrintStream.Error (Code, Info: INTEGER);
- BEGIN
- IF Code = stWriteError THEN
- IF Info AND $10 = 0 THEN
- Info := psOffLine ELSE
- IF Info AND $80 = 0 THEN
- Info := psBusy ELSE
- IF Info AND $20 <> 0 THEN
- Info := psPaperOut ELSE
- Info := psIOError;
- tStream.Error(Code, Info);
- END;
-
-
- PROCEDURE tPrintStream.Reset; ASSEMBLER;
- ASM (* Versuchen, Drucker zurückzusetzen *)
- CALL tStream.Reset
- LES DI,Self
- MOV DX,ES:[DI].TPrintStream.PrnPort
- MOV AH,01h
- INT 17h
- END;
-
-
- PROCEDURE tPrintStream.TimeOut (Value: BYTE);
- BEGIN
- Mem[$40:$78 + PrnPort] := Value;
- END;
-
-
- PROCEDURE tPrintStream.Write (VAR Buf; Count: WORD);
- VAR
- E, X: WORD;
- B: REAL;
- Event: tEvent;
- M: pMonolog;
- BEGIN
- IF Count > 0 THEN BEGIN
- X := 0;
- M := CreatePrintMonolog;
- Desktop^.Insert(M);
- REPEAT
- GetKeyEvent(Event); (* ausnahmsweise... *)
- (* KeyEvent würde auf Tastendruck warten *)
- E := PrnOutput(PrnPort, tByteArray(Buf)[X]);
- Inc(X);
- B := X / Count;
- Message(M, evBroadcast, cmProgress, @B);
- UNTIL (Event.KeyCode = kbEsc) OR
- (X = Count) OR (E AND $39 <> $10);
- M^.Close;
- IF Event.KeyCode = kbEsc THEN
- tStream.Error(stWriteError, psAborted) ELSE
- IF X < Count THEN Error(stWriteError, E);
- END;
- END;
-
-
- PROCEDURE tPrintStream.WriteStr (P: pString);
- BEGIN
- IF P <> NIL THEN Write(P^[1], Ord(P^[0]));
- END;
-
-
- END.
-
-
- (* ------------------------------------------------------ *)
- (* Ende von XOBJECTS.PAS *)
-