(****************************************************************************) (* Bibliotheks-Modul SELEKT-1.BIB *) (* *) (* Vertikale Menueauswahl mit Cursortasten/RETURN oder Anfangsbuchstaben *) (* Das Modul benoetigt die angepasste Zeicheneingabe LiesZeichen. *) (* *) (* p Selekt(x,y,l:integer; Var Menue; Anzahl:integer; var Wahl : integer *) (* *) (* Dabei ist *) (* x,y : die Bildschirmposition fuer den ersten Menuepunkt *) (* 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..25) *) (* Wahl : die Nummer des gewaehlten Punktes (1..Anzahl) oder *) (* 0 : wenn gedrueckt wurde *) (* -1 : wenn das Menue mit den Cursortasten , *) (* -2 : wenn es mit der Taste verlassen wurde. *) (* Wenn das Fragezeichen eingegeben wurde, so ist das *) (* 7. Bit von Wahl gesetzt ( fuer Hilfe! ). *) (* *) (* Wichtig: Das der Leuchtbalken zu Beginn auf Wahl gesetzt wird, ist die *) (* entsprechende Variable vor dem Aufruf zu initialisieren. *) (****************************************************************************) PROCEDURE Selekt(x,y,l:integer; VAR Menue; Anzahl:integer; VAR Wahl:integer); TYPE str127 = STRING[127]; VAR M : ARRAY[1..25] of ^str127; c : char; i,j : integer; 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(y+a1)); write(M[a1]^); gotoxy(x,pred(y+a2)); reverse; write(M[a2]^); normal; a1:=a2; gotoxy(x,pred(y+a2)); END; (* ChangeHilight *) BEGIN (* Selekt *) 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(y+i)); IF i=Wahl THEN BEGIN reverse; write(M[i]^); normal; END ELSE write(M[i]^) END; i:=Wahl; gotoxy(x,pred(y+i)); REPEAT IF i<>Wahl THEN ChangeHilight(i,Wahl); LiesZeichen(c); CASE c OF ^X : IF Wahl=Anzahl THEN Wahl:=1 ELSE Wahl:=succ(Wahl); ^E : IF Wahl=1 THEN Wahl:=Anzahl ELSE Wahl:=pred(Wahl); ^M : ; '?': BEGIN Wahl:=Wahl OR 128; c:=^M END; #27: BEGIN Wahl:=0; c:=^M END; ^S : BEGIN Wahl:=-1; c:=^M END; ^D : BEGIN Wahl:=-2; 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;