home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
08
/
grdlagen
/
standwin.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-07-05
|
9KB
|
265 lines
(* ------------------------------------------------------ *)
(* STANDWIN.PAS *)
(* Diese Unit implementiert ein Fensterobjekt. *)
(* Vorausgesetzt wird die Unit "SimWin", *)
(* von deren Objekt "SimpleWindow" das hier *)
(* implementierte Objekt "StandardWindow" erbt. *)
(* (c) 1990 R.Reichert & TOOLBOX *)
(* ------------------------------------------------------ *)
UNIT StandWin;
INTERFACE
USES SimWin;
(* ------------------------------------------------------ *)
(* Ein Standardfenster muß laut SAA Schatten haben, es *)
(* muß vergrößert und verkleinert werden können. *)
(* Diese Forderungen sind in "StandardWindow" realisiert. *)
(* ------------------------------------------------------ *)
TYPE
(* Ein Zeiger auf StandardWindow: *)
StandardWindowPtr = ^StandardWindow;
StandardWindow = OBJECT (SimpleWindow)
(* ------neue Variablen-------- *)
xmin, ymin, (* Bewegungs- und *)
xmax, ymax, (* Zoomgrenzen *)
ShaXl, ShaYl, (* Schattenlängen *)
ShaTSpace, (* -leerräume *)
ShaLSpace : INTEGER;
ShaChr : CHAR;
ShaColor : BYTE;
MoveAllowed, (* Bew. erlaubt ? *)
ZoomAllowed, (* Zoom " ? *)
ShaTranspar, (* Transparent ? *)
ShaVisible : BOOLEAN;
(* -Neue oder neu implementierte
Methoden------------------- *)
CONSTRUCTOR Init
(Data: Standardwindow);
PROCEDURE Open; VIRTUAL;
PROCEDURE CheckData; VIRTUAL;
PROCEDURE DrawShadow; VIRTUAL;
PROCEDURE ReOpen
(NewData: StandardWindow);
PROCEDURE NewMinMax
(Nxmin, Nymin, Nxmax, Nymax : BYTE);
(* Setzt neue Bewegungsgrenzen *)
PROCEDURE MoveWinRel
(Xrel,Yrel : SHORTINT);
(* Rel. Bewegung, xrel und yrel
beziehen sich auf x1,y1 ! *)
PROCEDURE ZoomWinRel
(XRel,YRel : SHORTINT);
(* Rel. Vergrößern, xrel und
yrel beziehen sich hier auf
x2,y2; x1,y1 bleibt an der
selben Stelle *)
PROCEDURE MoveWinAbs
(xabs,yabs : BYTE); VIRTUAL;
(* Abs. bewegen, dh:
x1=xabs, y1=yabs und x2,y2
dementsprechend *)
PROCEDURE ZoomWinAbs
(xabs,yabs : BYTE); VIRTUAL;
(* Abs. vergrößern, d.h.:
x2=xabs, y2=yabs, x1 und y1
bleiben unverändert. *)
END;
ScreenObj = OBJECT (SimWin.ScreenObj)
PROCEDURE WriteAttr
(x,y,attr : BYTE);
(* Ändert das Attribut *NUR* an x,y *)
PROCEDURE FillAttr
(x1,y1,x2,y2,Attr : BYTE);
(* Ändert Attribut in dem angegebenen
Bereich x1-x2, y1-y2 *)
PROCEDURE FillChr
(x1,y1,x2,y2,attr : BYTE; Ch : CHAR);
(* Füllt den angegebenen Bereich mit
Zeichen ch und Attribut Attr *)
END;
CONST
(* Wiederum ein Experimentier-Fensterchen *)
StandWinData : StandardWindow =
( x1: 1; y1: 1; x2: 30; y2: 10; xl : 29; yl: 9;
FrameArt : 4; FrameColor : 15+7*16;
BackColor : 0;
TopLColor : 15; BottomLColor : 15;
TopLine : ' TopLine '; BottomLine : ' HeadLine ';
TopLPos : Center; BottomLPos : Right;
FrameChrs : '';
Visible : TRUE; FrameVisible : TRUE;
SaveBack : TRUE; BackSaved : FALSE;
ClearWin : TRUE;
BackGround: NIL;
xmin : 1; ymin: 1; xmax: 80; ymax: 25;
ShaXl : 2; ShaYl : 1;
ShaTSpace : 2; ShaLSpace : 2;
ShaChr : '░'; ShaColor : 15;
MoveAllowed : TRUE; ZoomAllowed : TRUE;
ShaTranspar : TRUE; ShaVisible : TRUE);
VAR
(* Öffentlich: Screen-Routinen und der Zeiger auf
den Bildschirmspeicher *)
ScrProc : ScreenObj;
Screen : ^ScreenType;
IMPLEMENTATION
(* ------------------------------------------------------ *)
(* Screen-Routinen => keine Bereichsüberprüfung *)
(* Für nähere Erklärungen siehe toolbox 12'89, S.28 *)
(* ------------------------------------------------------ *)
PROCEDURE ScreenObj.WriteAttr(x, y, attr : BYTE);
BEGIN
Screen^[y,x] := Lo(Screen^[y,x]) + Attr SHL 8;
END;
PROCEDURE ScreenObj.FillAttr(x1, y1, x2, y2, Attr : BYTE);
VAR
j, i : BYTE;
BEGIN
FOR i := y1 TO y2 DO
FOR j := x1 TO x2 DO
WriteAttr(j, i, Attr);
END;
PROCEDURE ScreenObj.FillChr(x1, y1, x2, y2, Attr : BYTE;
Ch : CHAR);
VAR
j, i : BYTE;
BEGIN
FOR i := y1 TO y2 DO
FOR j := x1 TO x2 DO
WriteChr(j, i, Attr, ch);
END;
(* ---------------------------------------------------- *)
(* Implementieren der Methoden von StandardWindow *)
(* ---------------------------------------------------- *)
CONSTRUCTOR StandardWindow.Init(Data : StandardWindow);
BEGIN
Background := NIL;
BackSaved := FALSE;
Visible := FALSE;
Self := Data
END;
PROCEDURE StandardWindow.Open;
BEGIN
SimpleWindow.Open;
(* Fenster zuerst öffnen - und Hintergrund
sichern, *bevor* der Schatten gezeichnet wird.*)
DrawShadow;
END;
PROCEDURE StandardWindow.CheckData;
BEGIN
SimpleWindow.CheckData;
xl := x2 - x1 +ShaXl;
yl := y2 - y1 +ShaYl;
IF NOT ShaVisible THEN BEGIN
ShaXl := 0;
ShaYl := 0
END;
IF xmin < 1 THEN xmin := 1;
IF ymin < 1 THEN ymin := 1;
IF xmax > 80 THEN xmax := 80;
IF ymax > 25 THEN ymax := 25;
IF xmin > x1 THEN xmin := x1;
IF ymin > y1 THEN ymin := y1;
IF xmax < x2 THEN xmax := x2;
IF ymax < y2 THEN ymax := y2
END;
PROCEDURE StandardWindow.DrawShadow;
VAR
i : INTEGER;
BEGIN
IF NOT ShaVisible THEN Exit;
WITH ScrProc DO
IF ShaTranspar THEN BEGIN
FillAttr(Succ(x2), y1 + ShaTSpace,
x2 + ShaXl, y2 + ShaYl, ShaColor);
FillAttr(x1 + ShaLSpace, Succ(y2),
x2, y2 + ShaYl, ShaColor)
END ELSE BEGIN
FillChr(Succ(x2), y1 + ShaTSpace,
x2 + ShaXl, y2 + ShaYl, ShaColor, ShaChr);
FillChr(x1 + ShaLSpace, Succ(y2),
x2, y2 + ShaYl, ShaColor, ShaChr);
END;
END;
PROCEDURE StandardWindow.ReOpen(NewData: StandardWindow);
BEGIN
Close;
Self := NewData;
Open;
END;
PROCEDURE StandardWindow.NewMinMax
(Nxmin, Nymin, Nxmax, Nymax : BYTE);
BEGIN
IF (Nxmin<1) OR (Nxmax>80) OR
(Nymin<1) OR (Nymax>25) OR
(Nxmin>Nxmax) OR (Nymin>Nymax) THEN
ErrMsg(WinWrMM);
xmin := NXmin;
ymin := Nymin;
xmax := Nxmax;
ymax := Nymax
END;
PROCEDURE StandardWindow.MoveWinRel(xrel,yrel : SHORTINT);
BEGIN
MoveWinAbs(Abs(x1+xrel), Abs(y1+yrel));
END;
PROCEDURE StandardWindow.ZoomWinRel(xrel,yrel : SHORTINT);
BEGIN
ZoomWinAbs(Abs(x2+xrel), Abs(y2+yrel));
END;
PROCEDURE StandardWindow.MoveWinAbs(xabs, yabs : BYTE);
BEGIN
IF NOT MoveAllowed OR NOT Visible THEN Exit;
IF (xabs < xmin) OR (xabs + Xl > xmax) OR
(yabs < ymin) OR (yabs + yl > ymax) THEN
ErrMsg(WinMoErr);
Close;
x2 := xabs + x2 - x1;
y2 := yabs + y2 - y1;
x1 := xabs;
y1 := yabs;
Open;
END;
PROCEDURE StandardWindow.ZoomWinAbs(xabs, yabs : BYTE);
BEGIN
IF NOT ZoomAllowed OR NOT Visible THEN Exit;
IF (xabs + ShaXl > xmax) OR (yabs + ShaYl > ymax) THEN
ErrMsg(WinZoErr);
Close;
x2 := xabs;
y2 := yabs;
Open;
END;
BEGIN
(* den Zeiger auf Bildschirmspeicher setzen *)
IF Mem[$40:$49] = 7 THEN (* monochrom ? *)
Screen := Ptr($B000, $0000)
ELSE
Screen := Ptr($B800, $0000);
END.
(* ------------------------------------------------------ *)
(* Ende von STANDWIN.PAS *)