home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* ROOTVSM.PAS *)
- (* *)
- (* ■ VSManagerObj: Verwaltet einen Array von virtuellen *)
- (* Bildschirmen, wobei der erste den "richtigen" Bild- *)
- (* schirm darstellt. Einen Zeiger auf ein Objekt vom *)
- (* Typ "ScreenObj" erwartet Init: So ist es möglich, *)
- (* dass Nachkommen von "ScreenObj" für erweiterte Text-*)
- (* modi oder andere Seiten programmiert werden und hier*)
- (* einfach gebraucht werden können. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT RootVSM;
-
- INTERFACE
-
- USES UBase, VSObj, ScrObj;
-
- TYPE
- ScreenObjPtr = ScrObj.ScreenObjPtr;
- ScreenObj = ScrObj.ScreenObj;
-
- CONST { Maximale Anzahl virtueller Bildschirme: }
- MaxVS = 100; { Return Codes: }
- VSVSNotInit = 10; { virt. Bildschirm Init-Fehler }
- VSTooManyVS = 11; { kann keinen vB mehr anlegen }
- VSCantDelScr = 12; { kann "richtigen" Bildschirm }
- { nicht löschen }
- VSInvalidNr = 13; { ungültige vB Nummer }
- VSCantDelAkt = 14; { kann akt. vB nicht auflösen }
-
- TYPE
- VirtualScreenPtr = VSObj.VirtualScreenPtr;
- VirtualScreen = VSObj.VirtualScreen;
- VSArrayPtr = ^VSArray;
- VSArray = ARRAY [0..MaxVS] OF VirtualScreenPtr;
- VSManagerPtr = ^VSManagerObj;
- VSManagerObj = OBJECT (Base)
- VSNum,
- VSAkt,
- ReturnCode : BYTE;
- VScreens : VSArrayPtr;
-
- CONSTRUCTOR Init (NewScreen : ScreenObjPtr);
- PROCEDURE AddVS (VSPtr:VirtualScreenPtr); VIRTUAL;
- PROCEDURE DelVSNr (Nr : BYTE); VIRTUAL;
- PROCEDURE SelectVS (Nr : BYTE); VIRTUAL;
- PROCEDURE SetReturnCode (Code : BYTE); VIRTUAL;
-
- FUNCTION GetReturnCode : BYTE; VIRTUAL;
- FUNCTION GetNum : BYTE; VIRTUAL;
- FUNCTION GetAkt : BYTE; VIRTUAL;
- FUNCTION GetXLength : BYTE; VIRTUAL;
- FUNCTION GetYLength : BYTE; VIRTUAL;
- FUNCTION GetPartPtr (x,y:BYTE):ScreenMemPtr; VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- CONSTRUCTOR VSManagerObj.Init (NewScreen : ScreenObjPtr);
- BEGIN
- VSNum := 0; VSAkt := 0; ReturnCode := VSOk;
- New (VScreens);
- IF (VScreens=NIL) OR (NewScreen=NIL) THEN
- Fail
- ELSE
- AddVS (NewScreen);
- IF VSNum=0 THEN Fail;
- END;
-
- PROCEDURE VSManagerObj.AddVS (VSPtr : VirtualScreenPtr);
- BEGIN
- IF VSNum<MaxVS THEN BEGIN
- IF VSPtr<>NIL THEN BEGIN
- VScreens^[VSNum] := VSPtr;
- Inc (VSNum);
- END ELSE
- SetReturnCode (VSVSNotInit)
- END ELSE
- SetReturnCode (VSTooManyVS);
- END;
-
- PROCEDURE VSManagerObj.DelVSNr (Nr : BYTE);
- VAR i : BYTE;
- BEGIN
- IF (Nr>0) AND (Nr<VSNum) AND (Nr<>VSAkt) THEN BEGIN
- Dispose (VScreens^[Nr], Done);
- FOR i := Nr TO Pred (VSNum) DO
- VScreens^[i] := VScreens^ [Succ (i)];
- Dec (VSNum);
- END ELSE
- IF Nr=0 THEN
- SetReturnCode (VSCantDelScr)
- ELSE IF Nr=VSNum THEN
- SetReturnCode (VSInvalidNr)
- ELSE IF Nr=VSAkt THEN
- SetReturnCode (VSCantDelAkt);
- END;
-
- PROCEDURE VSManagerObj.SelectVS (Nr : BYTE);
- BEGIN
- IF (Nr>=0) AND (Nr<VSNum) THEN
- VSAkt := Nr
- ELSE
- SetReturnCode (VSInvalidNr);
- END;
-
- PROCEDURE VSManagerObj.SetReturnCode (Code : BYTE);
- BEGIN
- ReturnCode := Code;
- END;
-
- FUNCTION VSManagerObj.GetReturnCode : BYTE;
- BEGIN
- GetReturnCode := ReturnCode;
- SetReturnCode (VSOk);
- END;
-
- (* ----------------------------------------------------- *)
- (* Liefert Anzahl VIRTUELLER Bildschirme, deshalb *)
- (* VSNum-1, da AddVS auch den "richtigen" Bildschirm *)
- (* in VSNum mitgezählt hat. *)
- (* ----------------------------------------------------- *)
- FUNCTION VSManagerObj.GetNum : BYTE;
- BEGIN
- GetNum := Pred (VSNum);
- END;
-
- FUNCTION VSManagerObj.GetAkt : BYTE;
- BEGIN
- GetAkt := VSAkt;
- END;
-
- FUNCTION VSManagerObj.GetXLength : BYTE;
- BEGIN
- GetXLength := VScreens^[VSAkt]^.GetXLength;
- END;
-
- FUNCTION VSManagerObj.GetYLength : BYTE;
- BEGIN
- GetYLength := VScreens^[VSAkt]^.GetYLength;
- END;
-
- FUNCTION VSManagerObj.GetPartPtr (x,y:BYTE) : ScreenMemPtr;
- BEGIN
- GetPartPtr := VScreens^[VSAkt]^.GetPartPtr (x, y);
- END;
-
- DESTRUCTOR VSManagerObj.Done;
- VAR i : BYTE;
- BEGIN
- FOR i := 0 TO Pred (VSNum) DO
- Dispose (VScreens^[i], Done);
- Dispose (VScreens);
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von ROOTVSM.PAS *)
- (* ----------------------------------------------------- *)