(****************************************************************************) (* Bibliotheks-Modul CHOOSE.BIB *) (* *) (* Horizontale Menueauswahl mit Cursortasten/RETURN oder Anfangsbuchstaben *) (* Das Modul benoetigt die angepasste Zeicheneingabe Lieszeichen. *) (* *) (* p Choose(x,y,b,l:Integer; Var Menue; Anzahl:Integer; var Wahl:integer; *) (* weiter: boolean) *) (* *) (* Dabei ist *) (* x,y : die Bildschirmposition fuer den ersten Menuepunkt *) (* b : die Breite des Leuchtbalkens *) (* Menue : ein ARRAY[a..b] OF STRING[k] a und b beliebig *) (* l : k+1 (einfach SizeOf(Menue[a])) *) (* Anzahl : die Anzahl der angezeigten Menuepunkte (1..10) *) (* Wahl : die Nummer des gewaehlten Punktes (1..Anzahl). *) (* Wenn das Fragezeichen eingegeben wurde, so ist *) (* 7. Bit von Wahl gesetzt ( fuer Hilfe ). *) (* weiter : falls weiter=true, so findet keine Auswahl statt. Es wird *) (* nur der Leuchtbalken auf Wahl gesetzt. *) (* *) (* Wichtig: Das der Leuchtbalken zu Beginn auf Wahl gesetzt wird, ist die *) (* entsprechende Variable vor dem Aufruf zu initialisieren. *) (****************************************************************************) PROCEDURE Choose(x,y,b,l:integer; VAR Menue; Anzahl:integer; VAR Wahl:integer; Change : boolean); TYPE str127 = STRING[127]; VAR M : ARRAY[1..10] OF ^str127; c : char; i,j : integer; PROCEDURE print(VAR Wort : str127); VAR shift : Integer; BEGIN shift:=(length(Wort)+b) DIV 2; write(Wort:shift,'':b-shift) END; (* print *) PROCEDURE reverse; BEGIN InvVideo END; (* PROCEDURE reverse; BEGIN TextColor(0); TextBackGround(15) END; *) PROCEDURE normal; BEGIN Normvideo END; PROCEDURE ChangeHilight(VAR a1,a2 : Integer); BEGIN gotoxy(x+pred(a1)*b,y); print(M[a1]^); gotoxy(x+pred(a2)*b,y); reverse; print(M[a2]^); normal; a1:=a2; gotoxy(x+pred(a2)*b,y); END; (* ChangeHilight *) BEGIN (* Choose *) Wahl:=Wahl AND 127; FOR i:=1 TO Anzahl DO BEGIN M[i]:=ptr(addr(Menue)+pred(i)*l); (* M[i]:=ptr(seg(Menue),ofs(Menue)+pred(i)*l); bei MS-DOS *) gotoxy(x+pred(i)*b,y); IF i=Wahl THEN BEGIN reverse; print(M[i]^); normal END ELSE print(M[i]^) END; IF Change THEN exit; i:=Wahl; gotoxy(x+pred(i)*b,y); REPEAT IF i<>Wahl THEN ChangeHilight(i,Wahl); LiesZeichen(c); CASE c OF ^D : IF Wahl=Anzahl THEN Wahl:=1 ELSE Wahl:=succ(Wahl); ^S : IF Wahl=1 THEN Wahl:=Anzahl ELSE Wahl:=pred(Wahl); ^M : ; '?': BEGIN Wahl:=Wahl OR 128; c:=^M END; ELSE FOR j:=1 TO Anzahl DO IF upcase(M[j]^[1])=upcase(c) THEN BEGIN Wahl:=j; c:=^M; IF Wahl<>i THEN ChangeHilight(i,Wahl) END END; (* case *) UNTIL c=^M END; (* Choose *)