home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* STANDWIN.PAS *)
- (* *)
- (* ■ StandardWindow: Ein Standardfenster hat die noble *)
- (* Fähigkeit, sich verschieben und vergrössern bzw ver-*)
- (* kleinern zu können; dafür können Minimalgrösse und *)
- (* Maximalgrösse (=maximale Grösse) vorgeschrieben wer-*)
- (* den. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT StandWin;
-
- INTERFACE
-
- USES FrameWin, Windows, WinVSM;
-
- CONST
- On = TRUE;
- Off = FALSE; { ReturnCodes ("Antwort"): }
- MvNotAllowed = 11; { MoveAllowed ist FALSE (MoveAbs) }
- ZoNotAllowed = 12; { ZoomAloowed ist FALSE (ZoomAbs) }
- MinMaxInvalid = 13;
- { Ungültige MinMax-Werte (SetMinMax) }
- MLInvalid = 14;
- { Ungültige Minimalgrösse (SetMinLength) }
- WinIsOpen = 15; { Fenster offen, Methode darf }
- { nicht aufgerufen werden (Open, }
- { SetMinLength, SetXY ...) }
- WinNotOpen = 16; { Fenster nicht offen (Move...) }
-
- TYPE
- StandardWindowPtr = ^StandardWindow;
- StandardWindow =
- OBJECT (WindowObj)
-
- ZoomAllowed, { Zooming erlaubt ? }
- MoveAllowed : BOOLEAN; { Bewegen erlaubt ? }
- MinX, MinY, { Bewegungsraum }
- MaxX, MaxY, { minimale INNERE Grösse }
- MinXL, MinYL: BYTE; { des Fensters }
-
- CONSTRUCTOR Init (VSMPtr : WExtVSMPtr);
- CONSTRUCTOR Copy (Win : StandardWindow);
- PROCEDURE Move (x, y : SHORTINT); VIRTUAL;
- PROCEDURE Zoom (x, y : SHORTINT); VIRTUAL;
- PROCEDURE MoveAbs (x, y : BYTE); VIRTUAL;
- PROCEDURE ZoomAbs (x, y : BYTE); VIRTUAL;
- PROCEDURE SetMinMax
- (NewMinX,NewMinY,NewMaxX,NewMaxY : BYTE); VIRTUAL;
- PROCEDURE SetXY
- (NewX1, NewY1, NewX2, NewY2 : BYTE); VIRTUAL;
- PROCEDURE SetMinLength (MXL, MYL : BYTE); VIRTUAL;
- PROCEDURE SetZooming (Zooming : BOOLEAN); VIRTUAL;
- PROCEDURE SetMoving (Moving : BOOLEAN); VIRTUAL;
- PROCEDURE CheckVars; VIRTUAL;
-
- FUNCTION GetMove : BOOLEAN; VIRTUAL;
- FUNCTION GetZoom : BOOLEAN; VIRTUAL;
- FUNCTION GetMinX : BYTE; VIRTUAL;
- FUNCTION GetMinY : BYTE; VIRTUAL;
- FUNCTION GetMaxX : BYTE; VIRTUAL;
- FUNCTION GetMaxY : BYTE; VIRTUAL;
- FUNCTION GetMinXL: BYTE; VIRTUAL;
- FUNCTION GetMinYL: BYTE; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- CONSTRUCTOR StandardWindow.Init (VSMPtr : WExtVSMPtr);
- BEGIN
- IF WindowObj.Init (VSMPtr) THEN BEGIN { Vorgänger }
- SetXY (1, 1, x2-2, y2-1);
- SetShadow (On);
- SetZooming (Off); { nix ist erlaubt, weder }
- SetMoving (On); { Zooming noch Moving }
- SetMinLength (10, 1); { Std-Mini/Maximalgrösse }
- SetMinMax (1, 1, VSM^.GetXLength, VSM^.GetYLength);
- END ELSE
- Fail;
- END;
-
- CONSTRUCTOR StandardWindow.Copy (Win : StandardWindow);
- BEGIN
- IF Win.VSM=NIL THEN Fail
- ELSE Self := Win;
- END;
-
- (* ----------------------------------------------------- *)
- (* Bewegt Fenster RELATIV um x,y (auch negativ möglich). *)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.Move (x, y : SHORTINT);
- BEGIN
- MoveAbs (BYTE (x1+x), BYTE (y1+Y));
- END;
-
- (* ----------------------------------------------------- *)
- (* Vergrössert bzw verkleinert Fenster **RELATIV** um x/y*)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.Zoom (x, y : SHORTINT);
- BEGIN
- ZoomAbs (BYTE (x2+x), BYTE (y2+y));
- END;
-
- (* ----------------------------------------------------- *)
- (* Bewegt Fenster **ABSOLUT**, dh x1=x und y1=y, x2 und *)
- (* y2 werden so ausgerechnet, dass die Grösse beibehalten*)
- (* wird. *)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.MoveAbs (x, y : BYTE);
- VAR XLength, YLength : BYTE;
- BEGIN
- IF Opened AND MoveAllowed THEN BEGIN
- XLength := x2-x1; YLength := y2-y1;
- IF Shadow THEN BEGIN
- Inc (XLength, 2); Inc (YLength);
- END;
- IF x<MinX THEN x := MinX;
- IF y<MinY THEN y := MinY;
- IF x+XLength>MaxX THEN x := MaxX-XLength;
- IF y+YLength>MaxY THEN y := MaxY-YLength;
- IF (x<>x1) OR (y<>y1) THEN BEGIN
- Close;
- x2 := x2+(x-x1); y2 := y2+(y-y1); { x und y neu }
- x1 := x; y1 := y; { berechnen }
- Open; { und wieder öffnen }
- END;
- END ELSE
- IF Opened THEN
- SetReturnCode (MvNotAllowed) { Bew. nicht erlaubt }
- ELSE
- SetReturnCode (WinNotOpen);
- END;
-
- (* ----------------------------------------------------- *)
- (* Vergrössert oder verkleinert Fenster **ABSOLUT**, dh *)
- (* x2=x, y2=y, x1 und y1 bleiben unverändert. Weder die *)
- (* maximale noch die minimale Grösse darf über- bzw *)
- (* "unter"-schritten werden. *)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.ZoomAbs (x, y : BYTE);
- VAR TempX2, TempY2 : BYTE;
- BEGIN
- IF Opened AND ZoomAllowed THEN BEGIN
- TempX2 := x; TempY2 := y;
- IF Shadow THEN BEGIN
- Inc (TempX2, 2); Inc (TempY2);
- END;
- IF x<=x1+MinXL THEN x := Succ (x1+MinXL);
- IF y<=y1+MinYL THEN y := Succ (y1+MinYL);
- IF TempX2>MaxX THEN x := MaxX-2;
- IF TempY2>MaxY THEN y := Pred (MaxY);
- IF (x<>x2) OR (y<>y2) THEN BEGIN
- Close; { ja, schliessen }
- x2 := x; y2 := y; { neue Koordinaten }
- Open; { und Neueröffnung }
- END;
- END ELSE
- IF Opened THEN
- SetReturnCode (ZoNotAllowed) { Zooming verboten }
- ELSE
- SetReturnCode (WinNotOpen);
- END;
-
- PROCEDURE StandardWindow.SetMinMax
- (NewMinX, NewMinY, NewMaxX, NewMaxY : BYTE);
- BEGIN
- IF NOT Opened THEN BEGIN
- IF (NewMinX>=1) AND (NewMinY>=1) AND
- (NewMinX<NewMaxX) AND (NewMinY<NewMaxY) AND
- (NewMaxX<=VSM^.GetXLength) AND
- (NewMaxY<=VSM^.GetYLength) THEN BEGIN
- MinX := NewMinX; MinY := NewMinY;
- MaxX := NewMaxX; MaxY := NewMaxY;
- END ELSE
- SetReturnCode (MinMaxInvalid);
- END ELSE
- SetReturnCode (WinIsOpen);
- END;
-
- (* ----------------------------------------------------- *)
- (* Koordinaten festlegen. Hier schon wird geprüft, ob sie*)
- (* im vorgeschriebenen Raum liegen und die Mindestgrösse *)
- (* besitzen. Also zuerst SetMinMax und SetMinLength *)
- (* (falls Standardwerte nicht genehm) aufrufen. *)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.SetXY (NewX1, NewY1,
- NewX2, NewY2 : BYTE);
- BEGIN
- WindowObj.SetXY (NewX1, NewY1, NewX2, NewY2);
- IF (VarOk) THEN
- IF (NewX1<MinX) AND (NewX2>MaxX) AND
- (NewY1<MinY) AND (NewY2>MaxY) AND
- (Pred (NewX2-NewX1)<MinXL) AND
- (Pred (NewY2-NewY1)<MinYL) THEN
- VarOk := FALSE;
- END;
-
- PROCEDURE StandardWindow.SetMinLength (MXL, MYL : BYTE);
- BEGIN
- IF NOT Opened THEN BEGIN
- IF (MXL>=1) AND
- (MXL<=VSM^.GetXLength-4) AND
- (MYL>=1) AND
- (MYL<=VSM^.GetYLength-3) THEN BEGIN
- MinXL := MXL;
- MinYL := MYL;
- END ELSE
- SetReturnCode (MLInvalid);
- END ELSE
- SetReturnCode (WinIsOpen);
- END;
-
- PROCEDURE StandardWindow.SetZooming (Zooming : BOOLEAN);
- BEGIN
- ZoomAllowed := Zooming;
- END;
-
- PROCEDURE StandardWindow.SetMoving (Moving : BOOLEAN);
- BEGIN
- MoveAllowed := Moving;
- END;
-
- (* ----------------------------------------------------- *)
- (* Prüft die Variablen auf ihre Korrektheit unter Berück-*)
- (* sichtigung der Mindestgrösse und des Bewegungsraums. *)
- (* ----------------------------------------------------- *)
- PROCEDURE StandardWindow.CheckVars;
- BEGIN
- WindowObj.CheckVars;
- IF VarOk THEN BEGIN
- SetMinLength (MinXL, MinYL);
- SetMinMax (MinX, MinY, MaxX, MaxY);
- SetXY (x1, y1, x2, y2);
- END;
- END;
-
- FUNCTION StandardWindow.GetMove : BOOLEAN;
- BEGIN
- GetMove := MoveAllowed;
- END;
-
- FUNCTION StandardWindow.GetZoom : BOOLEAN;
- BEGIN
- GetZoom := ZoomAllowed;
- END;
-
- FUNCTION StandardWindow.GetMinX : BYTE;
- BEGIN
- GetMinX := MinX;
- END;
-
- FUNCTION StandardWindow.GetMinY : BYTE;
- BEGIN
- GetMinY := MinY;
- END;
-
- FUNCTION StandardWindow.GetMaxX : BYTE;
- BEGIN
- GetMaxX := MaxX;
- END;
-
- FUNCTION StandardWindow.GetMaxY : BYTE;
- BEGIN
- GetMaxY := MaxY;
- END;
-
- FUNCTION StandardWindow.GetMinXL: BYTE;
- BEGIN
- GetMinXL := MinXL;
- END;
-
- FUNCTION StandardWindow.GetMinYL: BYTE;
- BEGIN
- GetMinYL := MinYL;
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von STANDWIN.PAS *)
- (* ----------------------------------------------------- *)