home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / tvision / tvpas / xobjects.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-11-10  |  4.3 KB  |  195 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     XOBJECTS.PAS                       *)
  3. (*                                                        *)
  4. (*                    Drucker-Stream                      *)
  5. (*       (C) 1992 by Christian Ohr & DMV-Verlag           *)
  6. (* ------------------------------------------------------ *)
  7. {$R-,S-,I-,B-,D-,L-,V-,A+,F+,O+,X+}
  8.  
  9.  
  10. UNIT XObjects;
  11.  
  12.  
  13. INTERFACE
  14.  
  15.  
  16. USES Objects;
  17.  
  18. CONST
  19.   LPT1 = 0;
  20.   LPT2 = 1;
  21.   LPT3 = 2;
  22.  
  23.   psOk          = 0;
  24.   psTimeOut     = 1;
  25.   psIOError     = 2;
  26.   psOffLine     = 3;
  27.   psPaperOut    = 4;
  28.   psNoAckn      = 5;
  29.   psBusy        = 6;
  30.   psPortErr     = 7;
  31.   psAborted     = 8;
  32.  
  33.  
  34.   PrnCodeStr : ARRAY[0..8] OF STRING[40] =
  35.      (#3'Drucker ok',
  36.       #3'Druckerfehler: Time out',
  37.       #3'Allgemeiner Druckerfehler',
  38.       #3'Druckerfehler: Nicht bereit',
  39.       #3'Druckerfehler: Kein Papier',
  40.       #3'Druckerfehler: Keine Bestätigung',
  41.       #3'Druckerfehler: Nicht bereit',
  42.       #3'Ungültiger Drucker-Port',
  43.       #3'Druckvorgang abgebrochen');
  44.  
  45.  
  46. TYPE
  47.  
  48.   (* tPrintStream leitet Daten zum Drucker. Dabei wird    *)
  49.   (* fahren wie bei anderen Streamarten auch, lediglich   *)
  50.   (* ein Einlesen ist nicht möglich (logisch!).           *)
  51.  
  52.   pPrintStream = ^tPrintStream;
  53.   tPrintStream = OBJECT(tStream)
  54.     PrnPort : WORD;
  55.     CONSTRUCTOR Init (aPrnPort: WORD);
  56.     PROCEDURE Error (Code, Info: INTEGER); VIRTUAL;
  57.     PROCEDURE Reset;
  58.     PROCEDURE TimeOut (Value: BYTE);
  59.     PROCEDURE Write (VAR Buf; Count: WORD); VIRTUAL;
  60.     PROCEDURE WriteStr (P: pString);
  61.   END;
  62.  
  63.  
  64.  
  65. IMPLEMENTATION
  66.  
  67.  
  68. USES Drivers, App, Dialogs, Views, XDialogs;
  69.  
  70.  
  71. FUNCTION CreatePrintMonolog: pMonolog;
  72. VAR
  73.   M : pMonolog;
  74.   R : tRect;
  75. BEGIN
  76.   R.Assign(0, 0, 50, 7);
  77.   M := New(pMonolog, Init(R, 'Druckvorgang'));
  78.   WITH M^ DO BEGIN
  79.     Options := Options OR ofCentered;
  80.     R.Grow(-4, -3);
  81.     R.Move(0, -1);
  82.     Insert(New(pBarView, Init(R)));
  83.     R.Move(0, 2);
  84.     Insert(New(pStaticText, Init(R,
  85.           'ESC drücken, um Drucken abzubrechen.')));
  86.   END;
  87.   CreatePrintMonolog := M;
  88. END;
  89.  
  90.  
  91. FUNCTION PrnOutput (P: WORD; B: BYTE): WORD; ASSEMBLER;
  92. ASM
  93.   XOR AH,AH
  94.   MOV AL,B
  95.   MOV DX,P
  96.   INT 17h
  97.   MOV AL,AH
  98.   XOR AH,AH
  99. END;
  100.  
  101.  
  102. FUNCTION PrnState (P: WORD): WORD; ASSEMBLER;
  103. ASM
  104.   MOV AH,2
  105.   INT 17h
  106.   MOV AL,AH
  107.   XOR AH,AH
  108. END;
  109.  
  110.  
  111.  
  112. (* ------------------------------------------------------ *)
  113. (*                     tPrintStream                       *)
  114. (* ------------------------------------------------------ *)
  115.  
  116.  
  117. CONSTRUCTOR tPrintStream.Init (aPrnPort: WORD);
  118. BEGIN
  119.   Status := 0;
  120.   IF MemW[$40:$08 + (aPrnPort SHL 2)] <> 0 THEN
  121.     PrnPort := aPrnPort ELSE
  122.     Error(stInitError, psPortErr);
  123. END;
  124.  
  125.  
  126. PROCEDURE tPrintStream.Error (Code, Info: INTEGER);
  127. BEGIN
  128.   IF Code = stWriteError THEN
  129.     IF Info AND $10 = 0 THEN
  130.       Info := psOffLine ELSE
  131.       IF Info AND $80 = 0 THEN
  132.         Info := psBusy ELSE
  133.           IF Info AND $20 <> 0 THEN
  134.             Info := psPaperOut ELSE
  135.             Info := psIOError;
  136.   tStream.Error(Code, Info);
  137. END;
  138.  
  139.  
  140. PROCEDURE tPrintStream.Reset; ASSEMBLER;
  141. ASM              (* Versuchen, Drucker zurückzusetzen *)
  142.   CALL tStream.Reset
  143.   LES DI,Self
  144.   MOV DX,ES:[DI].TPrintStream.PrnPort
  145.   MOV AH,01h
  146.   INT 17h
  147. END;
  148.  
  149.  
  150. PROCEDURE tPrintStream.TimeOut (Value: BYTE);
  151. BEGIN
  152.   Mem[$40:$78 + PrnPort] := Value;
  153. END;
  154.  
  155.  
  156. PROCEDURE tPrintStream.Write (VAR Buf; Count: WORD);
  157. VAR
  158.   E, X: WORD;
  159.   B: REAL;
  160.   Event: tEvent;
  161.   M: pMonolog;
  162. BEGIN
  163.   IF Count > 0 THEN BEGIN
  164.     X := 0;
  165.     M := CreatePrintMonolog;
  166.     Desktop^.Insert(M);
  167.     REPEAT
  168.       GetKeyEvent(Event);  (* ausnahmsweise... *)
  169.       (* KeyEvent würde auf Tastendruck warten *)
  170.       E := PrnOutput(PrnPort, tByteArray(Buf)[X]);
  171.       Inc(X);
  172.       B := X / Count;
  173.       Message(M, evBroadcast, cmProgress, @B);
  174.     UNTIL (Event.KeyCode = kbEsc) OR
  175.           (X = Count) OR (E AND $39 <> $10);
  176.     M^.Close;
  177.     IF Event.KeyCode = kbEsc THEN
  178.       tStream.Error(stWriteError, psAborted) ELSE
  179.       IF X < Count THEN Error(stWriteError, E);
  180.   END;
  181. END;
  182.  
  183.  
  184. PROCEDURE tPrintStream.WriteStr (P: pString);
  185. BEGIN
  186.   IF P <> NIL THEN Write(P^[1], Ord(P^[0]));
  187. END;
  188.  
  189.  
  190. END.
  191.  
  192.  
  193. (* ------------------------------------------------------ *)
  194. (*                Ende von XOBJECTS.PAS                   *)
  195.