home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* 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 *)