home *** CD-ROM | disk | FTP | other *** search
- (***************************************************************************)
- (* PULLDOWN.PAS *)
- (* Bereitstellung von Pulldown-Menue-Technik *)
-
- (* ----------------- Hardwareabhaengige Routinen ------------------ *)
-
- PROCEDURE SaveScreen; (* sichert aktuellen Bildschirm *)
- BEGIN Move (ScreenRAM,SaveRAM,ScreenLen); END;
-
-
- PROCEDURE LoadScreen; (* holt Bildschirm zurueck *)
- BEGIN Move (SaveRAM,ScreenRAM,ScreenLen); END;
-
-
- PROCEDURE SetColors (f,b :INTEGER); (* setzt Farben *)
- BEGIN TextColor (f); TextBackGround (b); END;
-
-
- PROCEDURE ReadChar (VAR Key: CHAR);
- BEGIN
- Read (Kbd,Key);
- IF (Key = ESC) AND KeyPressed THEN
- BEGIN (* Die Cursor-Tasten des PC's *)
- Read (Kbd,Key); (* erzeugen zwei Zeichen: *)
- CASE Key OF (* ESCape gefolgt vom eigent- *)
- 'K': Key := CrsLeft; (* lichen Code! *)
- 'M': Key := CrsRight;
- 'H': Key := CrsUp;
- 'P': Key := CrsDown
- END
- END
- END;
-
- (* -------------- Allgemeiner, hardwareunabhaengiger Teil -------------- *)
-
- PROCEDURE PullDown ( xpos,ypos :INTEGER; (* Bildschirmposition *)
- VAR Menu :MenuType; (* das Menue *)
- Display :BOOLEAN;
- VAR Result :INTEGER; (* gewaehlter Menuepunkt *)
- VAR Key :CHAR;
- VAR Extern :InputStr); (* externe Eingabe *)
-
- VAR i,j,p,Len,xofs,yofs :INTEGER;
- Quit :BOOLEAN;
-
- PROCEDURE WriteItem (p :INTEGER; Selected :BOOLEAN);
- VAR i,j :INTEGER;
- BEGIN
- WITH Menu DO
- BEGIN
- IF Selected THEN SetColors (SelectText,SelectBack)
- ELSE SetColors (NormalText,NormalBack);
- IF vertical THEN
- BEGIN
- GotoXY (xpos+xofs,Pred(ypos)+yofs+p); Write (Item[p])
- END
- ELSE
- BEGIN
- j := 0;
- FOR i := 1 TO Pred(p) DO j := j + Length(Item[i]);
- GotoXY (xpos+xofs+j,ypos+yofs); Write (Item[p])
- END
- END
- END;
-
- PROCEDURE MoveBar (d :INTEGER); (* bewegt SELECT-Balken *)
- VAR i,j :INTEGER;
- BEGIN
- IF d <> 0 THEN WriteItem (p,FALSE);
- IF p+d > Menu.NoItems THEN p := (p+d) MOD Menu.NoItems
- ELSE IF p+d < 1 THEN p := Menu.NoItems + (p+d)
- ELSE p := p+d;
- WriteItem (p,TRUE)
- END;
-
- PROCEDURE DrawFrame (x1,y1,x2,y2 :INTEGER); (* Rahmen um Menue zeichnen *)
- VAR i :INTEGER;
- BEGIN
- GotoXY (x1,y1); Write (LeftTop);
- FOR i:=Succ(x1) TO Pred(x2) DO Write (Horizontal); Write (RightTop);
- FOR i:=Succ(y1) TO Pred(y2) DO
- BEGIN GotoXY (x2,i); Write (vertical) END;
- GotoXY (x2,y2); Write (RightBottom);
- FOR i:=Succ(y1) TO Pred(y2) DO
- BEGIN GotoXY (x1,i); Write (vertical) END;
- GotoXY (x1,y2); Write (LeftBottom);
- FOR i:=Succ(x1) TO Pred(x2) DO Write (Horizontal);
- END;
-
- BEGIN (* PullDown *)
- WITH Menu DO
- BEGIN
- xofs := 0; yofs := 0;
- IF Frame THEN BEGIN xofs := 1; yofs := 1 END;
- IF Display THEN
- BEGIN
- SaveScreen; SetColors (FrameColor,NormalBack);
- IF vertical THEN
- BEGIN
- Len := 0;
- FOR i := 1 TO NoItems DO
- IF Length(Item[i]) > Len THEN Len := Length(Item[i]);
- GotoXY (xpos,ypos);
- IF Frame THEN DrawFrame (xpos,ypos,xpos+Len+1,ypos+NoItems+1)
- END
- ELSE
- BEGIN
- Len := 0;
- FOR i := 1 TO NoItems DO Len := Len + Length(Item[i]);
- GotoXY (xpos,ypos);
- IF Frame THEN DrawFrame (xpos,ypos,xpos+Len+1,ypos+2)
- END;
- FOR i := 1 TO NoItems DO WriteItem (i,FALSE);
- END;
- p := LastItem; MoveBar (0); Result := 0;
- REPEAT
- IF Extern = '' THEN ReadChar (Key)
- ELSE BEGIN Key := Extern[1]; Delete (Extern,1,1) END;
- CASE Key OF
- CrsLeft : IF NOT vertical THEN MoveBar (-1);
- CrsRight : IF NOT vertical THEN MoveBar (+1);
- CrsUp : IF vertical THEN MoveBar (-1);
- CrsDown : IF vertical THEN MoveBar (+1);
- CR : Result := p
- END;
- Quit := (vertical AND (Key IN [CR,ESC,CrsLeft,CrsRight])) OR (NOT
- vertical AND (Key IN [CR,ESC,CrsUp,CrsDown]))
- UNTIL Quit;
- LastItem := p; WriteItem (LastItem,FALSE)
- END; (* WITH *)
- IF NOT (Key = CR) THEN LoadScreen
- END;
- (* ----------------------------------------------------------------------- *)
- (* Ende von PULLDOWN.PAS *)
-