home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SCROLL.PAS *)
- (* Scrollen von Bildschirmfenstern im Text- und im *)
- (* Grafikmodus in beliebige Richtungen *)
- (* (c) 1989 H.Mende & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT Scroll;
-
- INTERFACE
-
- USES Crt, Graph;
-
- TYPE
- ScrollDirType = (UP, DOWN, LEFT, RIGHT);
- VAR
- ScrSeg : WORD;
-
- PROCEDURE ScrollViewPort(direction : ScrollDirType;
- anz : BYTE);
- { -"ANZAHL"-maliges Rollen des aktiven Grafikfensters in }
- { die durch die Variable "DIRECTION" definierte Richtung }
-
- PROCEDURE ScrollWindow(direction : ScrollDirType;
- anz, x1, y1, x2, y2 : BYTE);
- { ScrollWindow(Direction,Anzahl,Links,Oben,Rechts,Unten) }
- { - Wie ScrollViewPort, allerdings im Textmodus. Hier }
- { müssen die Eck-Koordinaten des Textfensters mit }
- { übergeben werden. }
-
- IMPLEMENTATION
-
- CONST
- GDriver : INTEGER = Detect;
- VAR
- GMode : INTEGER;
-
- PROCEDURE ScrollViewPort;
- TYPE
- BFType = ARRAY [0..8002] OF WORD; { Buffer }
- VAR
- vs : ViewPortType; { Grafikfenster-Koordinaten }
- bf : ^BFType; { Zeiger auf Buffer }
- BEGIN
- New(bf); { Buffer auf dem Heap einrichten }
- GetViewSettings(vs); { x/y-Koordinaten des }
- { Grafikfensters ermitteln }
- WITH vs DO BEGIN
- CASE direction OF
- UP : BEGIN { nach oben rollen }
- GetImage(0, anz, x2-x1, y2-y1, bf^);
- PutImage(0, 0, bf^, NormalPut);
- SetViewPort(x1, y2-anz, x2, y2, TRUE);
- END;
- DOWN : BEGIN { nach unten rollen }
- GetImage(0, 0, x2-x1, y2-y1-anz, bf^);
- PutImage(0, anz, bf^, NormalPut);
- SetViewPort(x1, y1, x2, y1+anz, TRUE);
- END;
- LEFT : BEGIN { nach links rollen }
- GetImage(anz, 0, x2-x1, y2-y1, bf^);
- PutImage(0, 0, bf^, NormalPut);
- SetViewPort(x2-anz, y1, x2, y2, TRUE);
- END;
- RIGHT : BEGIN { nach rechts rollen }
- GetImage(0, 0, x2-x1-anz, y2-y1, bf^);
- PutImage(anz, 0, bf^, NormalPut);
- SetViewPort(x1, y1, x1+anz, y2, TRUE);
- END;
- END; { case }
- ClearViewPort; { Zeilen auffüllen }
- SetViewPort(x1, y1, x2, y2, clip);
- { Grafikfenster auf Originalgröße }
- Dispose(bf); { Buffer wieder vom Heap entfernen }
- END;
- END;
-
- PROCEDURE ScrollWindow;
- VAR
- loop : BYTE;
- anzahl : INTEGER;
- xn, xm : POINTER;
- BEGIN
- Dec(x1); Dec(x2);
- Dec(y1); Dec(y2);
- FOR anzahl := 1 TO anz DO
- CASE direction OF
- UP : BEGIN
- { Bildspeicher verschieben }
- FOR loop := y1 TO Pred(y2) DO BEGIN
- xn := Ptr(ScrSeg, (loop+1)*160 + x1*2);
- xm := Ptr(ScrSeg, loop*160 + x1*2);
- Move(xn^, xm^, 2*Succ(x2-x1));
- END;
- { entstandene neue Zeile mit TextAttr }
- { auffüllen }
- FOR loop := x1 TO x2 DO
- MemW[ScrSeg:y2 * 160 + loop * 2] :=
- 32 + TextAttr SHL 8;
- END;
- DOWN : BEGIN
- FOR loop := Pred(y2) DOWNTO y1 DO BEGIN
- xn := Ptr(ScrSeg, (loop+1)*160 + x1*2);
- xm := Ptr(ScrSeg, loop*160 + x1*2);
- Move(xm^, xn^, 2*Succ(x2-x1));
- END;
- FOR loop := x1 TO x2 DO
- MemW[ScrSeg:y1 * 160 + loop * 2] :=
- 32 + TextAttr SHL 8;
- END;
- LEFT : BEGIN
- FOR loop := y1 TO y2 DO BEGIN
- xn := Ptr(ScrSeg,loop*160 + Succ(x1)*2);
- xm := Ptr(ScrSeg,loop*160 + x1*2);
- Move(xn^, xm^, 2*(x2-x1));
- END;
- FOR loop := y1 TO y2 DO
- MemW[ScrSeg:loop * 160 + x2 * 2] :=
- 32 + TextAttr SHL 8;
- END;
- RIGHT : BEGIN
- FOR loop := y1 TO y2 DO BEGIN
- xn := Ptr(ScrSeg,loop*160 + Succ(x1)*2);
- xm := Ptr(ScrSeg,loop*160 + x1*2);
- Move(xm^, xn^, 2*(x2-x1));
- END;
- FOR loop := y1 TO y2 DO
- MemW[ScrSeg:loop * 160 + x1 * 2] :=
- 32 + TextAttr SHL 8;
- END;
- END; { case / for}
- END; { von ScrollWindow }
-
- BEGIN
- DetectGraph(GDriver, GMode);
- IF GDriver IN [CGA, EGA, VGA] THEN ScrSeg := $B800
- ELSE ScrSeg := $B000;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SCROLL.PAS *)