home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 02 / praxis / window.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-11-17  |  17.5 KB  |  592 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    WINDOW.PAS                          *)
  3. (*                                                        *)
  4. (*    (c) 1988 by Christian Steingräber und TOOLBOX       *)
  5. (* ------------------------------------------------------ *)
  6. UNIT window;
  7.  
  8. INTERFACE
  9.  
  10. USES Crt, Dos;
  11.  
  12. CONST
  13.   opened = TRUE;          {  Flipmenü schon geöffnet  }
  14.   not_opened = FALSE;     {  Flipmenü noch nicht geöffnet  }
  15.   ver = TRUE;             {  vertikales Flipmenü  }
  16.   hor = FALSE;            {  horizontales Flipmenü  }
  17.  
  18. VAR                       { Farben für FlipMenue }
  19.   FmTxtColor,             { Textfarbe }
  20.   FmBckColor,             { Texthintergrund }
  21.   FmFrmColor,             { Rahmenfarbe }
  22.   FmBrdColor: BYTE;       { Rahmenhintergrund }
  23.   MenueHelp,              {  Menühilfe erlaubt?  }
  24.   MenueMove: BOOLEAN;     {  Menüverschiebung erlaubt?  }
  25.  
  26. PROCEDURE MkWindow(x1, y1, x2, y2, Style, TxtColor,
  27.                    BckColor, BrdColor: BYTE);
  28.  
  29. PROCEDURE MkMidWindow(Breite, Laenge, Style, TxtColor,
  30.                       BckColor, BrdColor: BYTE);
  31. (* Öffnet ein Fenster mittig ausgerichtet                 *)
  32.  
  33. PROCEDURE RmWindow;     (*  Schließt das aktuelle Fenster.*)
  34.  
  35. PROCEDURE MvWindow(x_dif, y_dif: INTEGER);
  36. (* Verschiebt das aktuelle Fenster. Positive Werte bewirken
  37.    eine Verschiebung nach rechts  bzw. unten, negative Werte
  38.    nach links bzw. oben.                                  *)
  39.  
  40. PROCEDURE SetHeader(Header: STRING);
  41. (* Setzt den übergebenen String als Überschrift in die Mitte
  42.    der oberen Rahmenkante des aktuellen Fensters.         *)
  43.  
  44. PROCEDURE SetFoot(Foot: STRING);
  45. (* Setzt den übergebenen String als Fußnote in die rechte
  46.    Ecke der unteren Rahmenkante des aktuellen Fensters.   *)
  47.  
  48. FUNCTION FlipMenue(VAR x, y: BYTE;
  49.                    str: STRING; _ver: BOOLEAN;
  50.                    VAR _opened : BOOLEAN;
  51.                    VAR Position: BYTE): INTEGER;
  52.  
  53. IMPLEMENTATION
  54.  
  55. CONST
  56.   monoscreen : WORD = $b000; (*  Herkules-Segmentadresse  *)
  57.   colorscreen: WORD = $b800; (*  CGA-Segmentadresse       *)
  58.   monochrom         = 7;
  59.   maxwin            = 10;
  60.  
  61. TYPE
  62.   t_str80   = STRING[80];
  63.   scrinhalt = ARRAY [0..3999] OF BYTE;
  64.   wintyp    = RECORD
  65.                 x1, y1, x2, y2: BYTE;
  66.               END;
  67.   screens   = RECORD
  68.                 bild : scrinhalt;
  69.                 dim  : wintyp;
  70.                 x, y : BYTE;
  71.                 shape: INTEGER;
  72.               END;
  73.  
  74. VAR
  75.   win: RECORD
  76.          dim: wintyp;
  77.          tiefe: BYTE;
  78.          keller: ARRAY [1..maxwin] OF ^screens;
  79.        END;
  80.   monobuffer : scrinhalt ABSOLUTE $b000:$0000;
  81.   colorbuffer: scrinhalt ABSOLUTE $b800:$0000;
  82.   screenmode : BYTE      ABSOLUTE $0040:$0049;
  83.   aktive_page: BYTE      ABSOLUTE $0040:$0062;
  84.   videobuffer: WORD;
  85.  
  86. PROCEDURE off_cursor;    { Cursor unsichtbar }
  87. VAR
  88.   regs: registers;
  89. BEGIN
  90.   WITH regs DO BEGIN
  91.     ah:=2; bh:= aktive_page; dx:=$34A1;
  92.   END;
  93.   INTR($10, regs);
  94. END;
  95.  
  96. PROCEDURE where_cursor(VAR x, y:BYTE);
  97. VAR
  98.   crt_pages: ARRAY [0..7] OF INTEGER ABSOLUTE $40:$50;
  99. BEGIN
  100.   x := lo(crt_pages[aktive_page])+1;
  101.   y := hi(crt_pages[aktive_page])+1;
  102. END;
  103.  
  104. PROCEDURE set_cursor(x, y:BYTE);
  105. VAR
  106.   regs: registers;
  107. BEGIN
  108.   WITH regs DO BEGIN
  109.     ah:= 2; bh:= aktive_page;
  110.     dh:= y - 1; dl:= x - 1;
  111.   END;
  112.   INTR($10, regs);
  113. END;
  114.  
  115. PROCEDURE initwindow;
  116. BEGIN
  117.   IF screenmode = monochrom THEN videobuffer := monoscreen
  118.   ELSE videobuffer := colorscreen;
  119.   WITH win.dim DO BEGIN
  120.     x1 := 1;  y1 := 1;
  121.     x2 := 80; y2 := 25;
  122.   END;
  123.   win.tiefe := 0;
  124.   MenueHelp := TRUE;
  125.   MenueMove := TRUE;
  126.   FmTxtColor:= lightgray;
  127.   FmBckColor:= black;
  128.   FmBrdColor:= black;
  129.   FmFrmColor:= white;
  130. END;
  131.  
  132. PROCEDURE winframe(x1, y1, x2, y2, Style,
  133.                    TxtColor, BckColor: BYTE);
  134. VAR
  135.   ver, hor, elo, ero, elu, eru, attribut : BYTE;
  136.   i, j, k, l   : WORD;
  137. BEGIN
  138.   CASE Style OF
  139.     1: BEGIN                           (* einfache Linie *)
  140.          ver:= 196; hor:= 179; elo:= 218;
  141.          ero:= 191; elu:= 192; eru:= 217;
  142.        END;
  143.     2: BEGIN                           (* doppelte Linie *)
  144.          ver:= 205; hor:= 186; elo:= 201;
  145.          ero:= 187; elu:= 200; eru:= 188;
  146.        END;
  147.     ELSE BEGIN
  148.            ver:= Style; hor:= Style; elo:= Style;
  149.            ero:= Style; elu:= Style; eru:= Style;
  150.     END;
  151.   END;
  152.   attribut := BckColor SHL 4 + TxtColor;
  153.   j := (y1-1)*160;
  154.   MEMW[videobuffer:j+(x1-1)*2] := attribut SHL 8 + elo;
  155.   k := attribut SHL 8 + ver;
  156.   FOR i := x1 TO x2-2 DO memw[videobuffer:j+i*2] := k;
  157.   MEMW[videobuffer:j+(x2-1)*2] := attribut SHL 8 + ero;
  158.   j := (x1-1)*2;
  159.   k := (x2-1)*2;
  160.   l := attribut SHL 8 + hor;
  161.   FOR i := y1 TO y2-2 DO BEGIN
  162.     MEMW[videobuffer:i*160+j] := l;
  163.     MEMW[videobuffer:i*160+k] := l;
  164.   END;
  165.   j := (y2-1)*160;
  166.   MEMW[videobuffer:j+(x1-1)*2] := attribut SHL 8 + elu;
  167.   k := attribut SHL 8 + ver;
  168.   FOR i := x1 TO x2-2 DO MEMW[videobuffer:j+i*2] := k;
  169.   MEMW[videobuffer:j+(x2-1)*2] := attribut SHL 8 + eru;
  170.   crt.window(x1+1, y1+1, x2-1, y2-1);
  171. END;
  172.  
  173. PROCEDURE MkWindow;
  174. VAR
  175.   regs: registers;
  176. BEGIN
  177.   WITH win DO BEGIN
  178.     tiefe := tiefe + 1;
  179.     IF (tiefe > maxwin) OR (maxavail < 4008) THEN BEGIN
  180.       crt.window(1,1,80,25);
  181.       WriteLn(#7,' Fehler: Zu viele Fenster offen! ');
  182.       HALT;
  183.     END;
  184.     new(keller[tiefe]);   (* Speicher auf Heap erstellen *)
  185.     IF screenmode = monochrom THEN
  186.       keller[tiefe]^.bild := monobuffer
  187.     ELSE
  188.       keller[tiefe]^.bild := colorbuffer;
  189.     keller[tiefe]^.dim := dim;     { Fenstergröße retten }
  190.     where_cursor(keller[win.tiefe]^.x,  { Cursorposition }
  191.                  keller[win.tiefe]^.y); { retten         }
  192.     regs.ah := 3;                     { Cursorform retten }
  193.     INTR($10,regs);
  194.     keller[win.tiefe]^.shape := regs.cx;
  195.   END;
  196.   winframe(x1, y1, x2, y2, Style, TxtColor, BrdColor);
  197.   textcolor(TxtColor);
  198.   textbackground(BckColor);
  199.   ClrScr;
  200.   win.dim.x1 := x1+ 1; win.dim.x2 := x2- 1;
  201.   win.dim.y1 := y1+ 1; win.dim.y2 := y2- 1;
  202. END;
  203.  
  204. PROCEDURE MkMidWindow;
  205. BEGIN
  206.   MkWindow((80 - Breite) SHR 1, (25 - Laenge) SHR 1,
  207.            (80 - Breite) SHR 1 + Breite + 1,
  208.            (25 - Laenge) SHR 1 + Laenge + 1,
  209.            Style, TxtColor, BckColor, BrdColor);
  210. END;
  211.  
  212. PROCEDURE SetHeader;
  213. VAR
  214.   x, y: BYTE;
  215. BEGIN
  216.   where_cursor(x, y);
  217.   WITH win DO
  218.     IF tiefe <> 0 THEN
  219.       WITH dim DO BEGIN
  220.         crt.window(1,1,80,25);
  221.         GotoXY(x1+(x2-x1+1-length(Header)) SHR 1, y1-1);
  222.         Write(Header);
  223.         crt.window(x1, y1, x2, y2);
  224.       END;
  225.   set_cursor(x, y);
  226. END;
  227.  
  228. PROCEDURE SetFoot;
  229. VAR
  230.   x, y: BYTE;
  231. BEGIN
  232.   where_cursor(x, y);
  233.   WITH win DO
  234.     IF tiefe <> 0 THEN
  235.       WITH dim DO BEGIN
  236.         crt.window(1,1,80,25);
  237.         GotoXY(x2 + 1 - length(Foot), y2+ 1);
  238.         Write(Foot);
  239.         crt.window(x1, y1, x2, y2);
  240.       END;
  241.   set_cursor(x, y);
  242. END;
  243.  
  244. PROCEDURE RmWindow;
  245. VAR
  246.   act_color, x, y      : BYTE;
  247.   regs                 : registers;
  248. BEGIN
  249.   WITH win DO BEGIN
  250.     IF screenmode = monochrom THEN
  251.       monobuffer := keller[tiefe]^.bild
  252.     ELSE
  253.       colorbuffer := keller[tiefe]^.bild;
  254.     dispose(keller[tiefe]);               { Heap freigeben }
  255.     dim := keller[tiefe]^.dim;
  256.     crt.window(dim.x1, dim.y1, dim.x2, dim.y2);
  257.     set_cursor(keller[tiefe]^.x, keller[tiefe]^.y);
  258.     regs.ah := 1;
  259.     regs.cx := keller[tiefe]^.shape;
  260.     INTR($10,regs);
  261.     where_cursor(x, y);
  262.     act_color := Mem[videobuffer:(y-1)*160+(x-1)*2];
  263.     TextColor(act_color AND $0f);
  264.     TextBackground(act_color SHR 4);
  265.     tiefe := tiefe - 1;
  266.   END;
  267. END;
  268.  
  269. PROCEDURE hilfe; { Hilfsfenster für FlipMenue }
  270. VAR
  271.   ch: CHAR;
  272. BEGIN
  273.   IF MenueHelp THEN BEGIN
  274.     MkMidWindow(60, 16, 1, 15, 0, 0);
  275.     SetHeader(' Menü - Hilfe ');
  276.     WriteLn;
  277.     TextColor(0); TextBackground(7);
  278.     WriteLn(' Wenn Scroll-Lock aktiv ist, ');
  279.     TextColor(7); TextBackground(0);
  280.     WriteLn('  - blinken die Ecken des Menü-Fensters,');
  281.     WriteLn('  - kann das Fenster mit den Pfeiltasten ver'+
  282.             'schoben werden,');
  283.     WriteLn('  - kann mit der Control-Taste die seitliche '+
  284.             'Verschiebung');
  285.     WriteLn('    beschleunigt werden,');
  286.     WriteLn('  - erreichen Sie über F1 diese Hilfe.');
  287.     WriteLn;
  288.     TextColor(0); TextBackground(7);
  289.     WriteLn(' Wenn Scroll-Lock nicht aktiv ist, ');
  290.     TextColor(7); TextBackground(0);
  291.     WriteLn('  - kann mit den Pfeiltasten der Inverse Bal'+
  292.             'ken ver-');
  293.     WriteLn('    schoben werden,');
  294.     WriteLn('  - kann mit Return (''Enter'') der Menüpunkt'+
  295.             ', auf dem');
  296.     WriteLn('    der Balken steht, gewählt werden,');
  297.     WriteLn('  - kann jeder Menüpunkt durch Drücken sei'+
  298.             'nes hellen');
  299.     WriteLn('    Buchstabens gewählt werden.');
  300.     TextColor(15);
  301.     SetFoot(' Weiter mit ESC...');
  302.     off_cursor;
  303.     REPEAT
  304.       ch:= ReadKey;
  305.     UNTIL ch = #27;
  306.     RmWindow;
  307.   END;
  308. END;
  309.  
  310. FUNCTION scrollock: BOOLEAN;      { Auf Scroll-Lock testen }
  311. VAR regs: registers;
  312. BEGIN
  313.   regs.ah := $02; INTR($16,regs);
  314.   scrollock := regs.al AND $10 <> 0;
  315. END;
  316.  
  317. PROCEDURE MvWindow;
  318. VAR
  319.   buffer      : scrinhalt;
  320.   old_x, old_y,
  321.   anzahl, i,
  322.   sp1, sp2    : BYTE;
  323. BEGIN
  324.   where_cursor(old_x, old_y);
  325.   WITH win DO BEGIN
  326.     IF screenmode = monochrom THEN BEGIN
  327.       buffer := monobuffer;
  328.       monobuffer := keller[tiefe]^.bild;
  329.     END ELSE BEGIN
  330.       buffer := colorbuffer;
  331.       colorbuffer:= keller[tiefe]^.bild;
  332.     END;
  333.     sp1 := (dim.x1- 2)* 2;          {  linke Fenster-Spalte }
  334.     sp2 := (dim.x1+ x_dif- 2)* 2;   { rechte Fenster-Spalte }
  335.     anzahl:= (dim.x2- dim.x1+ 3)*2; { Bytes einer Zeile    }
  336.     FOR i := dim.y1-1 TO dim.y2+1 DO
  337.       move(buffer[(i-1)*160 + sp1],
  338.            mem[videobuffer:(i+y_dif-1)*160 + sp2], anzahl);
  339.     dim.x1 := dim.x1+ x_dif; dim.x2 := dim.x2+ x_dif;
  340.     dim.y1 := dim.y1+ y_dif; dim.y2 := dim.y2+ y_dif;
  341.     crt.window(dim.x1, dim.y1, dim.x2, dim.y2);
  342.   END;
  343.   set_cursor(old_x+x_dif,old_y+y_dif);
  344. END;
  345.  
  346. PROCEDURE movewindow; { FlipMenue bewegen }
  347. VAR
  348.   ch     : CHAR;
  349.   i, j, k: INTEGER;
  350.   tcolor : BYTE;
  351.   Foot   : ARRAY [1..140] OF BYTE;
  352.  
  353. PROCEDURE warnung;
  354. BEGIN
  355.   MkMidWindow(38, 1, 2, 15, 0, 0);
  356.   SetHeader(' Achtung ');
  357.   TextColor(7);
  358.   Write(' Bitte erst Scroll-Lock deaktivieren!');
  359.   TextColor(15);
  360.   SetFoot(' Weiter ohne Scroll-Lock ');
  361.   off_cursor;
  362.   REPEAT UNTIL NOT scrollock;
  363.   RmWindow;
  364. END;
  365.  
  366. BEGIN
  367.   WITH win.dim DO BEGIN                { blinkende Ecken }
  368.     tcolor := Mem[videobuffer:(y1-1)*160+(x1-1)*2+1]
  369.              OR 128;
  370.     j := (x1-2)*2+1;
  371.     k := x2*2+1;
  372.     Mem[videobuffer:(y1-2)*160+j] := tcolor;
  373.     Mem[videobuffer:(y1-2)*160+k] := tcolor;
  374.     Mem[videobuffer:(y2)*160+j]   := tcolor;
  375.     Mem[videobuffer:(y2)*160+k]   := tcolor;
  376.     IF MenueHelp THEN BEGIN
  377.       Move(Mem[videobuffer:y2*160+(x1-1)*2], Foot[1],
  378.            (x2-x1+1)*2);
  379.       TextColor(15);
  380.       IF x2 - x1 > 8 THEN SetFoot('F1 = Hilfe')
  381.       ELSE IF x2 - x1 > 0 THEN SetFoot('F1')
  382.     END;
  383.   END;
  384.   WHILE scrollock DO
  385.     IF KeyPressed THEN BEGIN
  386.       ch := ReadKey;
  387.       IF (ch = #0) AND KeyPressed THEN BEGIN
  388.         ch := ReadKey;
  389.         WITH win.dim DO
  390.           CASE ch OF
  391.             #75:  IF(x1 > 2) THEN MvWindow(-1,0);
  392.             #115: IF(x1>3) THEN MvWindow(-2,0);
  393.             #77:  IF(x2 < 79) THEN MvWindow(1,0);
  394.             #116: IF(x2 < 78) THEN MvWindow(2,0);
  395.             #72:  IF(y1 > 2) THEN MvWindow(0,-1);
  396.             #80:  IF(y2 < 24) THEN MvWindow(0,1);
  397.             #59:  hilfe;
  398.           ELSE warnung;
  399.         END
  400.       END ELSE warnung;
  401.     END;
  402.   tcolor := tcolor AND 127;
  403.   WITH win.dim DO BEGIN
  404.     j := (x1-2)*2+1;
  405.     k := x2*2+1;
  406.     Mem[videobuffer:(y1-2)*160+j] := tcolor;
  407.     Mem[videobuffer:(y1-2)*160+k] := tcolor;
  408.     Mem[videobuffer:(y2)*160+j]   := tcolor;
  409.     Mem[videobuffer:(y2)*160+k]   := tcolor;
  410.     IF MenueHelp THEN
  411.       Move(Foot[1], Mem[videobuffer:y2*160+(x1-1)*2],
  412.           (x2-x1+1)*2);
  413.   END;
  414. END;
  415.  
  416. FUNCTION FlipMenue;
  417. VAR
  418.   i, Breite, ausgewaehlt,  anzahl     : INTEGER;
  419.   auswahl    : ARRAY [1..24] OF STRING[70];
  420.   Foot, Header, leerstr    : STRING[70];
  421.   hotkeys    : STRING[24];
  422.   hkcolor    : BYTE;
  423.   kontrolle, antwort    : CHAR;
  424.   no_mark, hotkey       : BOOLEAN;
  425.  
  426. PROCEDURE inv;        { ausgewählten Menüpunkt invertieren }
  427. BEGIN
  428.   i := Pos('#', auswahl[ausgewaehlt]);
  429.   IF _ver THEN GotoXY(2, ausgewaehlt)
  430.   ELSE GotoXY((ausgewaehlt - 1) * Breite + 2, 1);
  431.   TextColor(FmBckColor);
  432.   TextBackground(FmTxtColor AND 7);
  433.   Write(Copy(auswahl[ausgewaehlt], 1, i- 1));
  434.   Write(Copy(auswahl[ausgewaehlt], i+ 1, 70));
  435.   off_cursor;
  436. END;
  437.  
  438. PROCEDURE norm;         { Inverser Menüpunkt wieder normal }
  439. BEGIN
  440.   i := Pos('#', auswahl[ausgewaehlt]);
  441.   IF i = 0 THEN i := 71;
  442.   TextBackground(FmBckColor);
  443.   TextColor(FmTxtColor);
  444.   IF _ver THEN GotoXY(2, ausgewaehlt)
  445.   ELSE GotoXY((ausgewaehlt - 1) * Breite + 2, 1);
  446.   Write(Copy(auswahl[ausgewaehlt], 1, i- 1));
  447.   IF i < 71 THEN BEGIN
  448.     TextColor(hkcolor);
  449.     Write(Copy(auswahl[ausgewaehlt], i+ 1, 1));
  450.     TextColor(FmTxtColor);
  451.   END;
  452.   Write(Copy(auswahl[ausgewaehlt], i+ 2, 70));
  453.   off_cursor;
  454. END;
  455.  
  456. BEGIN
  457.   Breite := 1;  anzahl := 1;
  458.   hotkeys:= ''; Header := ''; Foot := '';
  459.   no_mark:= TRUE;
  460.   { Menüpunkte, Überschrift und Fußnote holen }
  461.   WHILE Pos('_', Str) <> 0 DO BEGIN
  462.     auswahl[anzahl] := Copy(Str, 1, Pos('_', Str)- 1);
  463.     Delete(Str, 1, Pos('_', Str));
  464.     IF Length(auswahl[anzahl]) > Breite THEN BEGIN
  465.       Breite:= Length(auswahl[anzahl]);
  466.       IF (Copy(auswahl[anzahl], 1, 1) <> '(') AND
  467.          (Copy(auswahl[anzahl], 1, 1) <> ')') AND
  468.          (Pos('#', auswahl[anzahl]) = 0) THEN
  469.            Breite := Succ(Breite);
  470.     END;
  471.     CASE Ord(auswahl[anzahl][1]) OF
  472.       40 {'('}: Header := Copy(auswahl[anzahl],2,70);
  473.       41 {')'}: Foot   := Copy(auswahl[anzahl],2,70);
  474.       ELSE BEGIN
  475.         IF Pos('#', auswahl[anzahl]) <> 0 THEN BEGIN
  476.           no_mark := FALSE;
  477.           hotkeys := hotkeys + Copy(auswahl[anzahl],
  478.           Pos('#', auswahl[anzahl])+ 1, 1);
  479.         END ELSE
  480.           hotkeys := hotkeys + #0;
  481.         anzahl := Succ(anzahl);
  482.       END;
  483.     END;
  484.   END;
  485.   anzahl := Pred(anzahl);
  486.   { Breite für horizontales Menü berechnen }
  487.   IF not _ver THEN BEGIN
  488.     Breite := 1; no_mark:= TRUE;
  489.     FOR ausgewaehlt := 1 TO anzahl DO BEGIN
  490.       IF Length(auswahl[ausgewaehlt]) > Breite THEN BEGIN
  491.         Breite := Length(auswahl[ausgewaehlt]);
  492.         IF Pos('#', auswahl[ausgewaehlt]) <> 0 THEN
  493.           no_mark := FALSE;
  494.       END;
  495.     END;
  496.   END;
  497.   Breite := Breite + 1;
  498.   IF no_mark THEN Breite := Breite + 1;
  499.   IF (FmTxtColor and 8) = 8 THEN
  500.     hkcolor := FmTxtColor AND 7
  501.   ELSE
  502.     hkcolor := FmTxtColor OR 8;
  503.   (* alle Menüpunkte auf die gleiche Länge *)
  504.   FillChar(leerstr, Succ(Breite), ' ');
  505.   FillChar(leerstr, 1, Chr(Breite));
  506.   FOR ausgewaehlt := 1 TO anzahl DO BEGIN
  507.     hotkeys[ausgewaehlt] := Upcase(hotkeys[ausgewaehlt]);
  508.     IF Pos('#', auswahl[ausgewaehlt]) = 0 THEN i := 1
  509.     ELSE i := 0;
  510.     IF length(auswahl[ausgewaehlt]) < Breite THEN
  511.       auswahl[ausgewaehlt] := auswahl[ausgewaehlt]+
  512.                              Copy(leerstr, 1, Breite-
  513.                              Length(auswahl[ausgewaehlt])-
  514.                              1- i);
  515.   END;
  516.   IF not _opened THEN BEGIN
  517.     IF x = 0 THEN
  518.       IF _ver THEN x := (80 - Breite - 2) SHR 1
  519.       ELSE x := (80 - Breite * anzahl - 2) SHR 1;
  520.     IF y = 0 THEN
  521.       IF _ver THEN y := (25 - anzahl - 2) SHR 1
  522.       ELSE y := 12;
  523.     IF _ver THEN
  524.       MkWindow(x, y, x + Breite + 1, y + anzahl + 1, 2,
  525.                FmFrmColor, FmBckColor, FmBrdColor)
  526.     ELSE MkWindow(x, y, x + Breite * anzahl + 1, y + 2, 2,
  527.                   FmFrmColor, FmBckColor, FmBrdColor);
  528.    _opened := TRUE;
  529.     TextColor(FmTxtColor);
  530.     TextBackground(FmBckColor);
  531.     FOR ausgewaehlt := 1 TO anzahl DO norm;
  532.     TextColor(FmFrmColor); TextBackground(FmBrdColor);
  533.     SetHeader(Header);
  534.     SetFoot(Foot);
  535.   END;
  536.   ausgewaehlt := Position;
  537.   IF (ausgewaehlt > anzahl) OR (ausgewaehlt < 1) THEN
  538.     ausgewaehlt := 1;
  539.   inv;
  540.   antwort := #0;
  541.   hotkey  := FALSE;
  542.   REPEAT
  543.     IF (scrollock AND MenueMove) THEN movewindow;
  544.     IF KeyPressed THEN BEGIN
  545.       antwort := ReadKey;
  546.       norm;
  547.       IF antwort = #0 THEN BEGIN
  548.         IF KeyPressed THEN BEGIN
  549.           kontrolle := ReadKey;
  550.           CASE kontrolle OF
  551.             #80, #77: IF ausgewaehlt < anzahl THEN
  552.                         ausgewaehlt := SUCC(ausgewaehlt)
  553.                       ELSE ausgewaehlt := 1;
  554.             #72, #75: IF ausgewaehlt > 1 THEN
  555.                         ausgewaehlt := PRED(ausgewaehlt)
  556.                       ELSE ausgewaehlt:= anzahl;
  557.             #71: ausgewaehlt := 1;
  558.             #79: ausgewaehlt := anzahl;
  559.             ELSE BEGIN
  560.               antwort := kontrolle;
  561.               hotkey  := TRUE;
  562.             END;
  563.           END;
  564.         END;
  565.       END ELSE BEGIN
  566.         i := Pos(Upcase(antwort), hotkeys);
  567.         IF i <> 0 THEN BEGIN
  568.           antwort     := #13;
  569.           ausgewaehlt := i;
  570.         END;
  571.         IF antwort = #27 THEN hotkey := TRUE;
  572.       END;
  573.       inv;
  574.     END;
  575.   UNTIL (antwort = #13) OR (hotkey = TRUE);
  576.   norm;
  577.   Position := ausgewaehlt;
  578.   IF antwort <> #13 THEN ausgewaehlt := Ord(antwort)* -1;
  579.   FlipMenue := ausgewaehlt;
  580.   x := win.dim.x1 - 1;
  581.   y := win.dim.y1 - 1;
  582.   GotoXY(1, 1);
  583. END;
  584.  
  585.  
  586. BEGIN
  587.   initwindow;
  588. END.
  589.  
  590. (* ------------------------------------------------------ *)
  591. (*                  Ende von WINDOW.PAS                   *)
  592.