home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* VSOBJ.PAS *)
- (* Diese Unit enthält das Objekt "VirtualScreen", *)
- (* ein Objekt zur Erzeugung und Bearbeitung eines *)
- (* virtuellen Bildschirms. *)
- (* *)
- (* (c) '90 by R.Reichert & toolbox *)
- (* ------------------------------------------------------ *)
- UNIT VSObj;
-
- INTERFACE
-
- CONST { ReturnCodes ("Antworten"): }
- VSOk = 0; { Kein Fehler (defaultmäßig) }
- VSXYInvalid = 1; { x und/oder y ungültig }
-
- TYPE
- ScreenMemPtr = ^ScreenMemory;
- ScreenMemory = ARRAY [0..10000] OF WORD;
-
- { Keine Angst, es wird nur soviel Speicher belegt, wie
- der einzelne virtuelle Bildschirm wirklich benötigt.
- Ausgerechnet wird es nach seiner X- und Y-Länge. }
-
- VirtualScreenPtr = ^VirtualScreen;
- VirtualScreen =
- OBJECT
- { ------------------- Variablen -------------------- }
- XLength, { X-Länge des vB's }
- YLength, { Y-Länge des vB's }
- ReturnCode : BYTE; { "Antwort" (s.o.) }
- VSMem : ScreenMemPtr; { Speicher für vB }
- {-------------------- Methoden --------------------- }
- CONSTRUCTOR Init(XL, YL : BYTE);
- PROCEDURE Clear; VIRTUAL;
- PROCEDURE ClearPart(x1, y1, x2, y2 : BYTE); VIRTUAL;
- PROCEDURE Fill(Chr : CHAR; Attr : BYTE); VIRTUAL;
- PROCEDURE FillPart
- (x1, y1, x2, y2, Attr : BYTE; Chr : CHAR); VIRTUAL;
- PROCEDURE FillPartAttr
- (x1, y1, x2, y2, Attr : BYTE); VIRTUAL;
- PROCEDURE WriteChr(x,y,Attr:BYTE;Chr:CHAR); VIRTUAL;
- PROCEDURE WriteStr(x,y,Attr:BYTE;Str:STRING);VIRTUAL;
- PROCEDURE WriteAttr(x, y, Attr : BYTE); VIRTUAL;
- PROCEDURE SetReturnCode(Code : BYTE); VIRTUAL;
- FUNCTION GetPartPtr(x,y:BYTE):ScreenMemPtr; VIRTUAL;
- FUNCTION XYInVSMem(x, y : BYTE) : BOOLEAN; VIRTUAL;
- FUNCTION GetAddr(x, y : BYTE) : WORD; VIRTUAL;
- FUNCTION GetReturnCode : INTEGER; VIRTUAL;
- FUNCTION GetXLength : BYTE; VIRTUAL;
- FUNCTION GetYLength : BYTE; VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
-
- IMPLEMENTATION
-
- CONSTRUCTOR VirtualScreen.Init(XL, YL : BYTE);
- { Belegt für einen xl*yl großen virtuellen Bild- }
- { schirm Speicher. Im Fehlerfall wird mit Fail be- }
- { endet, dh eine dynamische Instanz zeigt auf NIL }
- { (siehe auch Demoprogramm). }
- VAR
- NeededMem : WORD;
- BEGIN
- XLength := XL;
- YLength := YL;
- ReturnCode := VSOk;
- NeededMem := XLength * YLength * 2;
- IF XLength * YLength > 10000 THEN
- Fail { zu groß -> geht nicht -> fertig }
- ELSE
- IF MemAvail > NeededMem THEN
- GetMem(VSMem, XLength * YLength * 2)
- ELSE
- Fail;
- END;
-
- PROCEDURE VirtualScreen.Clear;
- BEGIN
- Fill(' ', 7);
- END;
-
- PROCEDURE VirtualScreen.ClearPart(x1, y1, x2, y2 : BYTE);
- BEGIN
- FillPart(x1, y1, x2, y2, 7, ' ');
- END;
-
- PROCEDURE VirtualScreen.Fill(Chr : CHAR; Attr : BYTE);
- BEGIN
- FillPart(1, 1, XLength, YLength, Attr, Chr);
- END;
-
- PROCEDURE VirtualScreen.FillPart
- (x1, y1, x2, y2, Attr : BYTE; Chr : CHAR);
- VAR
- i, j : BYTE;
- BEGIN
- IF XYInVSMem(x1, y1) AND XYInVSMem(x2, y2) THEN
- FOR i := y1 TO y2 DO { ja, also "füllen" }
- FOR j := x1 TO x2 DO
- VSMem^[GetAddr(j, i)] := Ord(Chr) + Attr SHL 8
- ELSE
- SetReturnCode(VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.FillPartAttr
- (x1, y1, x2, y2, Attr : BYTE);
- VAR
- i, j : BYTE;
- BEGIN
- IF XYInVSMem(x1, y1) AND XYInVSMem(x2, y2) THEN
- FOR i := y1 TO y2 DO
- FOR j := x1 TO x2 DO
- VSMem^[GetAddr(j, i)] :=
- Lo(VSMem^[GetAddr(j, i)]) + Attr SHL 8
- ELSE { ändert nur das Attribut ! }
- SetReturnCode(VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteChr
- (x, y, Attr : BYTE; Chr : CHAR);
- BEGIN
- IF XYInVSMem(x, y) THEN
- VSMem^[GetAddr(x, y)] := Ord(Chr) + Attr SHL 8
- ELSE
- SetReturnCode(VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteStr
- (x, y, Attr : BYTE; Str : STRING);
- VAR
- i : BYTE;
- BEGIN
- IF XYInVSMem(x, y) AND
- XYInVSMem(Pred(x+Length(Str)), y) THEN
- FOR i := 1 TO Length(Str) DO
- VSMem^[GetAddr(Pred(x+i), y)] :=
- Ord(Str [i]) + Attr SHL 8
- ELSE
- SetReturnCode(VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteAttr(x, y, Attr : BYTE);
- VAR
- Addr : WORD;
- BEGIN
- IF XYInVSMem(x, y) THEN BEGIN
- Addr := GetAddr(x, y);
- VSMem^[Addr] := Lo(VSMem^[Addr]) + Attr SHL 8;
- END ELSE
- SetReturnCode(VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.SetReturnCode(Code : BYTE);
- BEGIN
- ReturnCode := Code;
- END;
-
- FUNCTION VirtualScreen.GetPartPtr
- (x, y : BYTE) : ScreenMemPtr;
- BEGIN
- IF XYInVSMem(x, y) THEN
- GetPartPtr := Addr(VSMem^[GetAddr(x, y)])
- ELSE
- SetReturnCode(VSXYInvalid);
- END;
-
- FUNCTION VirtualScreen.XYInVSMem(x,y:BYTE) : BOOLEAN;
- { Prüft, ob x/y im Bereich des virtuellen Bild- }
- { schirms liegt (intern verwendet, auch von außen }
- { möglich). }
- BEGIN
- IF(x > 0) AND (x <= XLength) AND
- (y > 0) AND (y <= YLength) THEN
- XYInVSMem := TRUE
- ELSE
- XYInVSMem := FALSE;
- END;
-
- FUNCTION VirtualScreen.GetAddr(x, y : BYTE) : WORD;
- { Liefert die Adresse des Bytes mit der Position }
- { x/y(im virtuellen Bildschirm) RELATIV zur An- }
- { fangsposition des Speichers des virtuellen Bild- }
- { schirms. Bedingung: X/Y innerhalb des vBs, wird }
- { nicht(!) geprüft. }
- BEGIN
- GetAddr := Pred(y) * XLength + Pred(x);
- END;
-
- FUNCTION VirtualScreen.GetReturnCode : INTEGER;
- BEGIN
- GetReturnCode := ReturnCode;
- SetReturnCode(VSOk);
- END;
-
- FUNCTION VirtualScreen.GetXLength : BYTE;
- BEGIN
- GetXLength := XLength;
- END;
-
- FUNCTION VirtualScreen.GetYLength : BYTE;
- BEGIN
- GetYLength := YLength;
- END;
-
- DESTRUCTOR VirtualScreen.Done;
- BEGIN
- IF VSMem <> NIL THEN
- FreeMem(VSMem, XLength * YLength * 2);
- END;
-
- {$F+}
- FUNCTION HeapFunc(Size : WORD) : INTEGER;
- BEGIN
- HeapFunc := 1;
- END;
- {$F-}
-
- BEGIN
- HeapError := @HeapFunc;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von VSOBJ.PAS *)