home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* EXTVSM2.PAS *)
- (* *)
- (* ■ VSMCrt: Erlaubt das (fast komplett) analoge arbeiten*)
- (* zur Unit Crt. Ausnahme: AssignCrt wurde nicht neu *)
- (* implementiert. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT EXTVSM2;
-
- INTERFACE
-
- USES Crt, ScrObj, ExtVSM;
-
- CONST
- Screen = 0;
-
- TYPE
- ScreenObjPtr = ScrObj.ScreenObjPtr;
- ScreenObj = ScrObj.ScreenObj;
- VSMCrtPtr = ^VSMCrt;
- VSMCrt = OBJECT (ExtVSManager)
- TA, NV, { TextAttr, NormVideo }
- TextCol,
- TextBack,
- x, y : BYTE;
- WinMin,
- WinMax : WORD;
-
- CONSTRUCTOR Init (Screen : ScreenObjPtr);
- PROCEDURE ClrScr; VIRTUAL;
- PROCEDURE ClrEol; VIRTUAL;
- PROCEDURE DelLine; VIRTUAL;
- PROCEDURE InsLine; VIRTUAL;
- PROCEDURE HighVideo; VIRTUAL;
- PROCEDURE NormVideo; VIRTUAL;
- PROCEDURE LowVideo; VIRTUAL;
- PROCEDURE Delay (Ms : WORD); VIRTUAL;
- PROCEDURE Sound (Hz : WORD); VIRTUAL;
- PROCEDURE NoSound; VIRTUAL;
- PROCEDURE Window (x1, y1, x2, y2 : BYTE); VIRTUAL;
- PROCEDURE Write (Str : STRING); VIRTUAL;
- PROCEDURE Writeln (Str : STRING); VIRTUAL;
- PROCEDURE GotoXY (NewX, NewY : BYTE); VIRTUAL;
- PROCEDURE SetTextAttr (NewTA : BYTE); VIRTUAL;
- PROCEDURE SetTextColor (TC : BYTE); VIRTUAL;
- PROCEDURE SetTextBackGround (TB:BYTE); VIRTUAL;
- PROCEDURE SetCheckBreak (CB : BOOLEAN); VIRTUAL;
- PROCEDURE ScrollUp; { INTERN ! } VIRTUAL;
-
- FUNCTION TextAttr : BYTE; VIRTUAL;
- FUNCTION TextColor : BYTE; VIRTUAL;
- FUNCTION TextBackGround : BYTE; VIRTUAL;
- FUNCTION WhereX : BYTE; VIRTUAL;
- FUNCTION WhereY : BYTE; VIRTUAL;
- FUNCTION KeyPressed : BOOLEAN; VIRTUAL;
- FUNCTION ReadKey : CHAR; VIRTUAL;
- FUNCTION CheckBreak : BOOLEAN; VIRTUAL;
- FUNCTION GetWinMinX : BYTE; VIRTUAL;
- FUNCTION GetWinMinY : BYTE; VIRTUAL;
- FUNCTION GetWinMaxX : BYTE; VIRTUAL;
- FUNCTION GetWinMaxY : BYTE; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- CONSTRUCTOR VSMCrt.Init (Screen : ScreenObjPtr);
- BEGIN
- IF ExtVSManager.Init (Screen) THEN BEGIN
- TextCol := LightGray;
- TextBack:= Black;
- SetTextAttr (LightGray);
- WinMin := 1 + 1 SHL 8;
- WinMax := GetXLength + GetYLength SHL 8;
- GotoXY (Crt.WhereX, Crt.WhereY);
- NV := Hi (VScreens^[VSAkt]^.
- VSMem^[Pred (y)*GetXLength*2+x*2]);
- { Attribut an Cursorposition speichern (für NormVideo)}
- END ELSE
- Fail;
- END;
-
- PROCEDURE VSMCrt.ClrScr;
- BEGIN
- FillPart (Lo (WinMin), Hi (WinMin),
- Lo (WinMax), Hi (WinMax),
- TA, ' ');
- GotoXY (1, 1);
- END;
-
- PROCEDURE VSMCrt.ClrEol;
- BEGIN
- FillPart (x, y, Lo (WinMax), y, TA, ' ');
- END;
-
- PROCEDURE VSMCrt.DelLine;
- VAR i : BYTE;
- BEGIN
- FOR i := (Hi (WinMin)+y) TO Hi (WinMax) DO
- CopyPart (Lo (WinMin), i, Lo (WinMax), i,
- Lo (WinMin), Pred (i),
- VSAkt, VSAkt);
- FillPart (Lo (WinMin), Hi (WinMax),
- Lo (WinMax), Hi (WinMax), TA, ' ');
- END;
-
- PROCEDURE VSMCrt.InsLine;
- VAR i : BYTE;
- BEGIN
- FOR i := Hi (WinMax) DOWNTO Pred (Hi (WinMin)+y) DO
- CopyPart (Lo (WinMin), Pred (i), Lo (WinMax), Pred (i),
- Lo (WinMin), i,
- VSAkt, VSAkt);
- FillPart (Lo (WinMin), i, Lo (WinMax), i, TA, ' ');
- END;
-
- PROCEDURE VSMCrt.HighVideo;
- BEGIN
- SetTextColor (White);
- END;
-
- PROCEDURE VSMCrt.NormVideo;
- BEGIN
- SetTextAttr (NV);
- END;
-
- PROCEDURE VSMCrt.LowVideo;
- BEGIN
- SetTextColor (LightGray);
- END;
-
- PROCEDURE VSMCrt.Delay (Ms : WORD);
- BEGIN
- Crt.Delay (Ms);
- END;
-
- PROCEDURE VSMCrt.Sound (Hz : WORD);
- BEGIN
- Crt.Sound (Hz);
- END;
-
- PROCEDURE VSMCrt.NoSound;
- BEGIN
- Crt.NoSound;
- END;
-
- PROCEDURE VSMCrt.Window (x1, y1, x2, y2 : BYTE);
- VAR h : BYTE;
- BEGIN
- IF x1<1 THEN x1 := 1;
- IF y1<1 THEN y1 := 1;
- IF x2>GetXLength THEN x2 := GetXLength;
- IF y2>GetYLength THEN y2 := GetYLength;
- IF NOT (x1<=x2) THEN BEGIN
- h := x1; x1 := x2; x2 := h;
- END;
- IF NOT (y1<=y2) THEN BEGIN
- h := y1; y1 := y2; y2 := h;
- END;
- WinMin := x1 + y1 SHL 8;
- WinMax := x2 + y2 SHL 8;
- GotoXY (1, 1);
- END;
-
- PROCEDURE VSMCrt.Write (Str : STRING);
- VAR s1 : STRING;
- BEGIN
- REPEAT
- s1 := Copy (Str, 1, Succ (Succ (Lo (WinMax)-
- Lo (WinMin) - x)));
- Delete (Str, 1, Length (S1));
- WriteStr (Pred (Lo (WinMin) + x),
- Pred (Hi (WinMin) + y), TA, S1);
- IF Str<>'' THEN
- GotoXY (1, Succ (y));
- UNTIL Str='';
- GotoXY (x+Length (S1), y);
- END;
-
- PROCEDURE VSMCrt.Writeln (Str : STRING);
- BEGIN
- Write (Str);
- GotoXY (1, Succ (y))
- END;
-
- (* ----------------------------------------------------- *)
- (* GotoXY setzt den Cursor neu. Dazu sind allerdings ein *)
- (* paar Berechnungen nötig: Für "NewX" wird geprüft, ob *)
- (* es im zulässigen Bereich liegt, wenn nein, ob es *)
- (* gleich null ist, oder sonst ("rechts vom Fenster") *)
- (* wird umgerechnet, "NewY" auch angepasst (Spezialfall: *)
- (* wenn Cursor in letzte Spalte einer anderen Zeile kommt*)
- (* also z.B. Fenster 10 Zeichen breit ist und NewX=20). *)
- (* Danach wird auch "NewY" umgerechnet und schliesslich *)
- (* der Cursor mit "GotoXY" aus der Unit Crt gesetzt *)
- (* (sofern "richtiger" Bildschirm aktiv ist). *)
- (* ------------------------------------------------------*)
- PROCEDURE VSMCrt.GotoXY (NewX, NewY : BYTE);
- VAR i, WinXL, WinYL : BYTE;
- BEGIN
- WinXL := Succ (Lo (WinMax)-Lo (WinMin));
- WinYL := Succ (Hi (WinMax)-Hi (WinMin));
- {--------------- Neues X berechnen ---------------------}
- IF (NewX>=1) AND (NewX<=WinXL) THEN
- x := NewX
- ELSE
- IF NewX<1 THEN
- x := 1
- ELSE BEGIN
- x := NewX MOD WinXL;
- IF x=0 THEN BEGIN
- x := WinXL;
- Inc (NewY, Pred (NewX DIV WinXL));
- END ELSE
- Inc (NewY, NewX DIV WinXL);
- END;
- {--------------- Neues Y berechnen ---------------------}
- IF (NewY>=1) AND (NewY<=WinYL) THEN
- y := NewY
- ELSE
- IF NewY<1 THEN
- y := 1
- ELSE BEGIN
- ScrollUp;
- y := WinYL;
- END;
-
- IF VSAkt=Screen THEN
- Crt.GotoXY (Pred (Lo (WinMin)+x),
- Pred (Hi (WinMin)+y));
- END;
-
- PROCEDURE VSMCrt.SetTextAttr (NewTA : BYTE);
- BEGIN
- TA := NewTA;
- END;
-
- PROCEDURE VSMCrt.SetTextColor (TC : BYTE);
- BEGIN
- TextCol := TC;
- SetTextAttr (TextCol MOD 16 + (TextBack MOD 8) SHL 4);
- END;
-
- PROCEDURE VSMCrt.SetTextBackGround (TB : BYTE);
- BEGIN
- Textback := TB;
- SetTextAttr (TextCol MOD 16 + (TextBack MOD 8) SHL 4);
- END;
-
- PROCEDURE VSMCrt.SetCheckBreak (CB : BOOLEAN);
- BEGIN
- Crt.CheckBreak := CB;
- END;
-
- PROCEDURE VSMCrt.ScrollUp;
- VAR i : BYTE;
- BEGIN
- FOR i := Succ (Hi (WinMin)) TO Hi (WinMax) DO
- CopyPart (Lo (WinMin), i, Lo (WinMax), i,
- Lo (WinMin), Pred (i),
- VSAkt, VSAkt);
- FillPart (Lo (WinMin), Hi (WinMax),
- Lo (WinMax), Hi (WinMax), TA, ' ');
- END;
-
-
- FUNCTION VSMCrt.TextAttr : BYTE;
- BEGIN
- TextAttr := TA;
- END;
-
- FUNCTION VSMCrt.TextColor : BYTE;
- BEGIN
- TextColor := TextCol;
- END;
-
- FUNCTION VSMCrt.TextBackGround : BYTE;
- BEGIN
- TextBackGround := TextBack;
- END;
-
- FUNCTION VSMCrt.WhereX : BYTE;
- BEGIN
- WhereX := x;
- END;
-
- FUNCTION VSMCrt.WhereY : BYTE;
- BEGIN
- WhereY := y;
- END;
-
- FUNCTION VSMCrt.KeyPressed : BOOLEAN;
- BEGIN
- KeyPressed := Crt.KeyPressed;
- END;
-
- FUNCTION VSMCrt.ReadKey : CHAR;
- BEGIN
- ReadKey := Crt.ReadKey;
- END;
-
- FUNCTION VSMCrt.CheckBreak : BOOLEAN;
- BEGIN
- CheckBreak := Crt.CheckBreak;
- END;
-
- FUNCTION VSMCrt.GetWinMinX : BYTE;
- BEGIN
- GetWinMinX := Lo (WinMin);
- END;
-
- FUNCTION VSMCrt.GetWinMinY : BYTE;
- BEGIN
- GetWinMinY := Hi (WinMin);
- END;
-
- FUNCTION VSMCrt.GetWinMaxX : BYTE;
- BEGIN
- GetWinMaxX := Lo (WinMax);
- END;
-
- FUNCTION VSMCrt.GetWinMaxY : BYTE;
- BEGIN
- GetWinMaxY := Hi (WinMax);
- END;
-
- END.
- (* -------------------------------------------------- *)
- (* Ende von EXTVSM2.PAS *)
- (* -------------------------------------------------- *)