home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / titel / saamenu.prg < prev    next >
Encoding:
Text File  |  1991-06-19  |  24.9 KB  |  670 lines

  1. /* ------------------------------------------------------ */
  2. /*                    SAAMENU.PRG                         */
  3. /*         Pulldown-Menüs für Clipper-Anwendungen         */
  4. /*   Compiler : Clipper 5.0                               */
  5. /*   Module   : STRING.PRG (im Lieferumfang von Clipper)  */
  6. /*   Schalter : /n /m /b                                  */
  7. /*         (c) 1991 Frank Pacher & TOOLBOX                */
  8. /* ------------------------------------------------------ */
  9. FUNCTION SaaMenu(iMenuNum, aMenuArray)
  10. /*              Nummer - Nr.des Menüs (default=1 bei NIL) */
  11. /*              MenuArray - Array mit den Menüpunkten     */
  12. //  -> wird später als PRIVATE definiert
  13. //     PRIVATE p_aKoordy    := {}[2]
  14. LOCAL l_sBild1
  15. LOCAL l_sBild2
  16. LOCAL l_aBild3              := {}
  17. LOCAL l_sBild4
  18. LOCAL l_aHorMenu            := {}
  19. LOCAL l_sString             := {}
  20. LOCAL l_sOldColor
  21. LOCAL l_iLauf1              := 1
  22. LOCAL l_iLauf2              := 1
  23. LOCAL l_iLauf3
  24. LOCAL l_iLauf4
  25. LOCAL l_iLaufA
  26. LOCAL l_iLaufE
  27. LOCAL l_iTaste              := 0
  28. LOCAL l_bExit1              :=.F.
  29. LOCAL l_bExit2              :=.F.
  30. LOCAL l_bExit3              :=.T.
  31. LOCAL l_sTaste
  32. LOCAL l_CodeBlock
  33. LOCAL l_sTempString
  34. PRIVATE p_aUntMenSpeicher   :={}
  35. PRIVATE p_aUnterMenu        :={}
  36. PRIVATE p_aRueck            :={}
  37. PRIVATE p_aColorA           :={}
  38. PRIVATE p_aColor            := Array(5)
  39. PRIVATE p_iLauf5
  40. /* --- weitere Deklarationen ---------------------------- */
  41. // defaults setzen :
  42. IF iMenuNum = NIL                   // Menu Nummer
  43.   iMenuNum := 1
  44. ENDIF
  45. IF aMenuArray = NIL                 // Menu Name
  46.   aMenuArray := aMenu
  47. ENDIF
  48. IF aMenuArray[iMenuNum, 14] = NIL   // Menu Zeile
  49.   aMenuArray[iMenuNum, 14] := 0
  50. ENDIF
  51. IF aMenuArray[iMenuNum, 12] = NIL   // ESC-Erlaubt
  52.   aMenuArray[iMenuNum, 12] := .F.
  53. ENDIF
  54. IF aMenuArray[iMenuNum, 9] = NIL    // Unterbalken
  55.   aMenuArray[iMenuNum, 9] := .T.
  56. ENDIF
  57.  
  58. l_aHorMenu := aMenuArray[iMenuNum, 13]
  59. p_aColor   := ListAsArray(aMenuArray[iMenuNum, 10], ',')
  60.  
  61. PRIVATE p_aKoordy    := Array(LEN(l_aHorMenu), 3)
  62. PRIVATE p_iZeile     := aMenuArray[iMenuNum, 6]
  63. PRIVATE p_iLaenge    := aMenuArray[iMenuNum, 7]
  64. PRIVATE p_sFarbeMess := aMenuArray[iMenuNum, 8]
  65.  
  66. /* --- Beginn der Funktion ------------------------------ */
  67. /* ----- MenuBildAufbau --------------------------------- */
  68. SetCursor(0)
  69. l_sBild1 := SaveScreen(0, 0, 24, 79)
  70. SetColor(p_aColor[1])
  71. @ aMenuArray[iMenuNum, 14], 0;
  72.   CLEAR TO aMenuArray[iMenuNum, 14], 79
  73. @ aMenuArray[iMenuNum, 14], 0
  74. IF aMenuArray[iMenuNum, 9]
  75.   SetColor(aMenuArray[iMenuNum, 11])
  76.   @ aMenuArray[iMenuNum, 14]+1, 0;
  77.     CLEAR TO aMenuArray[iMenuNum, 14]+1, 79
  78.   @ aMenuArray[iMenuNum, 14]+1, 0;
  79.     TO aMenuArray[iMenuNum,14]+1, 79 DOUBLE
  80.   @ aMenuArray[iMenuNum, 14]+1, 2;
  81.     SAY ' ' + CHR(27) + CHR(29) + CHR(26) + ' '
  82.   @ aMenuArray[iMenuNum, 14]+1, 57;
  83.     SAY ' (c) F.Pacher & TOOLBOX '
  84. ENDIF
  85. @ aMenuArray[iMenuNum, 14], 0
  86. FOR l_ilauf1 := 1 TO LEN(l_aHorMenu)
  87.   IF .NOT. l_aHorMenu[l_iLauf1,3]
  88.     SetColor(p_aColor[5])
  89.     l_sString := ListAsArray(l_aHorMenu[l_ilauf1, 1], '~')
  90.     SetColor(p_aColor[5])
  91.     p_aKoordy[l_iLauf1, 3] := col()+2
  92.     @ aMenuArray[iMenuNum, 14], col()+2;
  93.       SAY l_sString[1]+l_sString[2]+l_sString[3]
  94.     p_aKoordy[l_iLauf1, 1] := 0
  95.     p_aKoordy[l_iLauf1, 2] := 0
  96.   ELSE
  97.     l_sString := ListAsArray(l_aHorMenu[l_ilauf1, 1], '~')
  98.     DO CASE
  99.       CASE l_sString[1] == ''
  100.         SetColor(p_aColor[4])
  101.         p_aKoordy[l_iLauf1, 3] := col()+2
  102.         @ aMenuArray[iMenuNum, 14], col()+2;
  103.           SAY l_sString[2]
  104.         p_aKoordy[l_iLauf1, 1] := col()-1
  105.         p_aKoordy[l_iLauf1, 2] := Asc(Upper(l_sString[2]))
  106.         SetColor(p_aColor[1])
  107.         @ aMenuArray[iMenuNum, 14], col() SAY l_sString[3]
  108.       CASE l_sString[3] == ''
  109.         SetColor(p_aColor[1])
  110.         p_aKoordy[l_iLauf1, 3] := col()+2
  111.         @ aMenuArray[iMenuNum, 14], col()+2 SAY l_sString[1]
  112.         SetColor(p_aColor[4])
  113.         @ aMenuArray[iMenuNum, 14], col()   SAY l_sString[2]
  114.         p_aKoordy[l_iLauf1, 1] := col()-1
  115.         p_aKoordy[l_iLauf1, 2] := Asc(Upper(l_sString[2]))
  116.       OTHERWISE
  117.         SetColor(p_aColor[1])
  118.         p_aKoordy[l_iLauf1, 3] := col()+2
  119.         @ aMenuArray[iMenuNum, 14], col()+2 SAY l_sString[1]
  120.         SetColor(p_aColor[4])
  121.         @ aMenuArray[iMenuNum, 14], col()   SAY l_sString[2]
  122.         p_aKoordy[l_iLauf1,1] := col()-1
  123.         p_aKoordy[l_iLauf1,2] := Asc(Upper(l_sString[2]))
  124.         SetColor(p_aColor[1])
  125.         @ aMenuArray[iMenuNum, 14], col()   SAY l_sString[3]
  126.     ENDCASE
  127.   ENDIF
  128. NEXT
  129. l_sBild2 := SaveScreen(aMenuArray[iMenuNum, 14],  0,  ;
  130.                        aMenuArray[iMenuNum, 14], 79)
  131. l_sBild4 := SaveScreen(0, 0, 24, 79)
  132. SetColor(p_aColor[2])
  133. l_iLauf1 := 1
  134. DO WHILE l_iLauf1 <= LEN(p_aKoordy)
  135.   IF p_aKoordy[l_iLauf1, 2] <> 0
  136.     l_iLaufA := l_iLauf1
  137.     EXIT
  138.   ENDIF
  139.   l_iLauf1 := l_iLauf1+1
  140. ENDDO
  141. l_iLauf1 := 1
  142. DO WHILE (l_iLauf1 <= LEN(p_aKoordy))
  143.   IF (p_aKoordy[l_ilauf1, 2] <> 0)
  144.     l_iLaufE := l_iLauf1
  145.   ENDIF
  146.   l_iLauf1 := l_iLauf1+1
  147. ENDDO
  148. l_iLauf1 := 1
  149. IF l_iLaufA = NIL
  150.   RETURN
  151. ENDIF
  152. l_sString := ListAsArray(l_aHorMenu[l_iLaufA, 1], '~')
  153. @ aMenuArray[iMenuNum, 14], p_aKoordy[l_iLaufA, 3];
  154.              SAY l_sString[1]+l_sString[2]+l_sString[3]
  155. SetCenterText(aMenuArray[iMenuNum, 1], ;
  156.               aMenuArray[iMenuNum, 2], ;
  157.               aMenuArray[iMenuNum, 5], ;
  158.               aMenuArray[iMenuNum, 3], ;
  159.               aMenuArray[iMenuNum,4])
  160. SetMessage(aMenuArray[iMenuNum, 6], ;
  161.            aMenuArray[iMenuNum, 7], ;
  162.            l_aHorMenu[l_iLaufA, 2], ;
  163.            aMenuArray[iMenuNum, 8], p_aColor[2])
  164. l_iLauf3 := l_iLaufA
  165.  
  166. /* ----- Horizontale Menüsteuerung ---------------------- */
  167. l_CodeBlock := {|x| x[2] = l_sTaste}
  168. DO WHILE (.NOT.l_bExit1).AND.(.NOT.(l_iLaufA = l_iLaufE))
  169.                            // solange nicht <ET> / Hotkey
  170.   DO WHILE .NOT.l_bExit2   // solange keine zulaessige Taste
  171.     l_sTaste := INKEY(0)
  172.     IF (l_sTaste = 27).AND.(aMenuArray[iMenuNum,12]=.T.)
  173.       AAdd(p_aRueck, 0)
  174.       l_bExit1 := .T.
  175.       l_iLaufA := l_iLaufE
  176.       exit  // Ende SAAMenu übergabe von 0 für <ESC>-Taste
  177.     ENDIF
  178.     IF (l_sTaste >= 97).AND.(l_sTaste <= 122)
  179.                       // Kleinbuchstaben -> Großbuchstaben
  180.       l_sTaste := l_sTaste-32
  181.     ENDIF
  182.     DO CASE
  183.       CASE (l_sTaste=19).OR.(l_sTaste=4).OR.(l_sTaste=1)
  184.         l_bExit2 := .T.
  185.       CASE (l_sTaste=13).OR.(l_sTaste=6)
  186.         l_bExit2 := .T.
  187.       CASE AScan(p_aKoordy, l_CodeBlock) <> 0
  188.         l_bExit2 := .T.
  189.       OTHERWISE
  190.         l_bExit2 := .F.
  191.     ENDCASE
  192.   ENDDO
  193.  
  194. /* ----- Menüzeile neu schreiben ------------------------ */
  195.   RestScreen(aMenuArray[iMenuNum, 14],  0, ;
  196.              aMenuArray[iMenuNum, 14], 79, l_sBild2)
  197.  
  198. /* ----- Leuchtbalken schreiben ------------------------- */
  199.   SetColor(p_aColor[2])
  200.   DO CASE
  201.     CASE (l_sTaste=4)   // Rechtspfeil
  202.     DO CASE
  203.       CASE (l_iLauf3 = l_iLaufE)
  204.                         // ist aktueller MP der letzte MP ?
  205.         l_iLauf3 := l_iLaufA             // gehe zum Anfang
  206.  
  207.       CASE (l_aHorMenu[l_iLauf3+1, 3]) = .F.
  208.                         // ist der naechste MP gesperrt   ?
  209.         l_iLauf3 := l_iLauf3+1  // Zeiger auf gesperrten MP
  210.  
  211.         DO WHILE (l_aHorMenu[l_iLauf3, 3]) = .F.
  212.           l_iLauf3 := l_iLauf3+1
  213.                                 // letzer freier MP
  214.           DO CASE
  215.             CASE ((l_iLauf3+1) = ;
  216.               l_iLaufE).AND.((l_aHorMenu[l_iLauf3+1,3])=.F.)
  217.  
  218.               l_iLauf3 := l_iLaufA    // Zeiger an Anfang
  219.               exit                    // Schleife verlassen
  220.             CASE ((l_iLauf3+1) = l_iLaufE)
  221.               l_iLauf3 := l_iLaufE    // Zeiger an Anfang
  222.               exit                    // Schleife verlassen
  223.           ENDCASE
  224.         ENDDO
  225.  
  226.       OTHERWISE                        // alles andere ...
  227.         l_iLauf3 := l_iLauf3+1         // Zeiger erhöhen
  228.     ENDCASE
  229.     CASE (l_sTaste=19)                 // Linkspfeil
  230.       DO CASE
  231.         CASE (l_iLauf3 = l_iLaufA)
  232.                         // ist aktueller  MP der erste MP ?
  233.           l_iLauf3 := l_iLaufE     // Zeiger an den Schluss
  234.         CASE (l_aHorMenu[l_iLauf3-1, 3]) = .F.
  235.                         // ist vorhergehender MP zulässig ?
  236.           l_iLauf3 := l_iLauf3-1   // gesperrter MP
  237.           DO WHILE (l_aHorMenu[l_iLauf3, 3]) = .F.
  238.                         // wiederhole solange MP gesperrt
  239.             l_iLauf3 := l_iLauf3-1 // Zeiger erniedrigen
  240.           ENDDO
  241.         OTHERWISE                  // alles andere ...
  242.           l_iLauf3 := l_iLauf3-1   // Zeiger erniedrigen
  243.       ENDCASE
  244.       CASE AScan(p_aKoordy, l_CodeBlock) <> 0
  245.                                    // auf Hot-key testen
  246.         l_iLauf3 := AScan(p_aKoordy, l_CodeBlock)
  247.         l_staste := 13
  248.     ENDCASE
  249.     l_sString := ListAsArray(l_aHorMenu[l_iLauf3, 1], '~')
  250.     SetColor(p_aColor[2])
  251.     @ aMenuArray[iMenuNum, 14], p_aKoordy[l_iLauf3, 3] ;
  252.       SAY l_sString[1]+l_sString[2]+l_sString[3]
  253.     SetCenterText(aMenuArray[iMenuNum, 1], ;
  254.                   aMenuArray[iMenuNum, 2], ;
  255.                   aMenuArray[iMenuNum, 5], ;
  256.                   aMenuArray[iMenuNum, 3], ;
  257.                   aMenuArray[iMenuNum, 4])
  258.     SetMessage(aMenuArray[iMenuNum, 6], ;
  259.                aMenuArray[iMenuNum, 7], ;
  260.                l_aHorMenu[l_iLauf3, 2], ;
  261.                aMenuArray[iMenuNum, 8], p_aColor[2])
  262.     IF l_sTaste = 13        // MP ausgewählt
  263.       l_bExit1 := .T.
  264.       l_iTaste := 1
  265.       p_aRueck := {}
  266.       AAdd(p_aRueck, l_iLauf3)
  267.         /* --- Test, ob Untermenü vorhanden ... --------- */
  268.       IF l_aHorMenu[l_iLauf3, 4] <> NIL
  269.         p_iLauf5 := 1
  270.         p_aUnterMenu := l_aHorMenu[l_iLauf3, 4]
  271.         AAdd(p_aUntMenSpeicher, NIL)
  272.         p_aUntMenSpeicher[p_iLauf5] := p_aUnterMenu
  273.         p_aColorA := ListAsArray(p_aUnterMenu[11], ',')
  274.         SetColor(p_aUnterMenu[11])
  275.         IF l_aHorMenu[l_iLauf3, 4] = NIL
  276.           l_bExit3 := .T.
  277.         ELSE
  278.           l_bExit3 := .F.
  279.         ENDIF
  280.                                  // Pulldown aufrufen
  281.         DO WHILE .NOT.l_bExit3
  282.           IF LEN(l_aBild3) < p_iLauf5
  283.             AAdd(l_aBild3, SaveScreen(0, 0, 24, 79))
  284.           ELSE
  285.             l_aBild3[p_iLauf5] := SaveScreen(0, 0, 24, 79)
  286.           ENDIF
  287.            /* ---- erster Untermenüaufruf -------------- */
  288.           p_aColorA := ;
  289.           ListAsArray(p_aUntMenSpeicher[p_iLauf5, 11],',')
  290.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  291.           IF (aMenuArray[iMenuNum, 9]).AND.(p_iLauf5 = 1)
  292.                                          // wenn Unterbalken
  293.             @ p_aUntMenSpeicher[p_iLauf5, 1]-1, ;
  294.               p_aUntMenSpeicher[p_iLauf5, 2]    ;
  295.               CLEAR TO p_aUntMenSpeicher[p_iLauf5, 1]+1, ;
  296.               p_aUntMenSpeicher[p_iLauf5,2]+3
  297.           ENDIF
  298.           BoxShadow(p_aUntMenSpeicher[p_iLauf5, 1], ;
  299.                     p_aUntMenSpeicher[p_iLauf5, 2], ;
  300.                     p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  301.                     p_aUntMenSpeicher[p_iLauf5, 4]+1)
  302.           @ p_aUntMenSpeicher[p_iLauf5, 1], ;
  303.             p_aUntMenSpeicher[p_iLauf5, 2]  ;
  304.             CLEAR TO p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  305.                      p_aUntMenSpeicher[p_iLauf5, 4]+1
  306.           @ p_aUntMenSpeicher[p_iLauf5, 1], ;
  307.             p_aUntMenSpeicher[p_iLauf5, 2]  ;
  308.             TO p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  309.                p_aUntMenSpeicher[p_iLauf5, 4]+1 DOUBLE
  310.           IF (aMenuArray[iMenuNum, 9]).AND.(p_iLauf5 = 1)
  311.                                      // wenn Unterbalken ...
  312.             @ p_aUntMenSpeicher[p_iLauf5, 1]-1, ;
  313.               p_aUntMenSpeicher[p_iLauf5, 2]    ;
  314.               SAY CHR(187) + '  ' + CHR(201)
  315.             @ p_aUntMenSpeicher[p_iLauf5, 1], ;
  316.               p_aUntMenSpeicher[p_iLauf5, 2]  ;
  317.               SAY CHR(186) + '  ' + CHR(200)
  318.           ENDIF
  319.           IF (p_iLauf5 = 1).AND. ;
  320.              (.NOT.(aMenuArray[iMenuNum, 9]))
  321.             @ p_aUntMenSpeicher[p_iLauf5, 1]-1, ;
  322.               p_aUntMenSpeicher[p_iLauf5, 2]    ;
  323.               CLEAR TO p_aUntMenSpeicher[p_iLauf5, 1]-1, ;
  324.                        p_aUntMenSpeicher[p_iLauf5, 2]+3
  325.             @ p_aUntMenSpeicher[p_iLauf5, 1]-1, ;
  326.               p_aUntMenSpeicher[p_iLauf5, 2]    ;
  327.               SAY CHR(186) + '  ' + CHR(186)
  328.             @ p_aUntMenSpeicher[p_iLauf5, 1], ;
  329.               p_aUntMenSpeicher[p_iLauf5, 2]  ;
  330.               SAY CHR(186) + '  ' + CHR(200)
  331.           ENDIF
  332.           IF p_iLauf5 > 1
  333.             @ p_aUntMenSpeicher[p_iLauf5, 1], ;
  334.               p_aUntMenSpeicher[p_iLauf5, 2] SAY CHR(17)
  335.           ENDIF
  336.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  337.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  338.             SAY ' ' + CHR(24) + CHR(25) + ' '
  339.           SetMessage(p_iZeile, p_iLaenge, ;
  340.                      p_aUntMenSpeicher[p_iLauf5, 6, ;
  341.                      p_aUntMenSpeicher[p_iLauf5, 9]], ;
  342.                      p_sFarbeMess, p_aColor[2])
  343.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  344.           l_iTaste := ;
  345.           Achoice(p_aUntMenSpeicher[p_iLauf5, 1]+1, ;
  346.                   p_aUntMenSpeicher[p_iLauf5, 2]+1, ;
  347.                   p_aUntMenSpeicher[p_iLauf5, 3],   ;
  348.                   p_aUntMenSpeicher[p_iLauf5, 4],   ;
  349.                   p_aUntMenSpeicher[p_iLauf5, 5],   ;
  350.                   p_aUntMenSpeicher[p_iLauf5, 7],   ;
  351.                   'PDownMessage',                   ;
  352.                   p_aUntMenSpeicher[p_iLauf5, 9],   ;
  353.                   p_aUntMenSpeicher[p_iLauf5,10])
  354.           IF l_iTaste <> 0
  355.             l_sOldColor := p_aUntMenSpeicher[p_iLauf5, 11]
  356.             l_sTempString := ;
  357.             trim(p_aUntMenSpeicher[p_iLauf5, 5, l_iTaste])
  358.             l_sTempString := SUBSTR(l_sTempString, 1, ;
  359.               (p_aUntMenSpeicher[p_iLauf5, 4] - ;
  360.                p_aUntMenSpeicher[p_iLauf5, 2] - 1))
  361.             SetColor(p_aColorA[2])
  362.             @ p_aUntMenSpeicher[p_iLauf5, 1] + l_iTaste, ;
  363.               p_aUntMenSpeicher[p_iLauf5, 2] + 1 ;
  364.               SAY l_sTempString
  365.             SetColor(l_sOldColor)
  366.           ENDIF
  367.           IF l_iTaste = 0
  368.             l_bExit1 := .F.
  369.             IF p_iLauf5 > 1
  370.               ASize(p_aRueck, p_iLauf5)
  371.             ELSE
  372.               p_aRueck := {}
  373.             ENDIF
  374.             ASize(l_aBild3, p_iLauf5)
  375.             ASize(p_aUntMenSpeicher, p_iLauf5)
  376.             IF p_iLauf5 = 1
  377.               l_bExit3 := .T.
  378.             ENDIF       // l_bExit3 := (p_iLauf5 = 1)
  379.             IF p_iLauf5 <= 1
  380.               p_iLauf5 := 1
  381.             ELSE
  382.               p_iLauf5 := p_iLauf5-1
  383.             ENDIF
  384.             RestScreen(0, 0, 24, 79, l_aBild3[p_iLauf5])
  385.           ELSE
  386.             l_bExit1 := .T.
  387.             IF LEN(p_aRueck) <= p_iLauf5
  388.               AAdd(p_aRueck, l_iTaste)
  389.             ELSE
  390.               p_aRueck[p_iLauf5+1] := l_iTaste
  391.             ENDIF
  392.             IF p_aUntMenSpeicher[p_iLauf5, 12] = NIL
  393.               l_bExit3 := .T.
  394.             ELSE
  395.               p_iLauf5 := p_iLauf5+1
  396.               IF LEN(p_aUntMenSpeicher) = p_iLauf5-1
  397.                 AAdd(p_aUntMenSpeicher, NIL)
  398.                 p_aUntMenSpeicher[p_iLauf5] := ;
  399.                   p_aUntMenSpeicher[p_iLauf5-1,  ;
  400.                   12, l_iTaste]
  401.               ELSE
  402.                 p_aUntMenSpeicher[p_iLauf5] := ;
  403.                   p_aUntMenSpeicher[p_iLauf5-1,  ;
  404.                   12, l_iTaste]
  405.               ENDIF
  406.               l_bExit3 := .F.
  407.               IF p_aUntMenSpeicher[p_iLauf5, 1] = NIL
  408.                 l_bExit3 := .T.
  409.                              // l_bExit3 := (p_ .... )
  410.               ENDIF
  411.             ENDIF
  412.           ENDIF
  413.         ENDDO
  414.                              // Ende der Bearbeitung
  415.       ENDIF
  416.       IF l_bExit1 = .T.
  417.         exit
  418.       ENDIF
  419.     ENDIF
  420.     l_bExit2 := .F.
  421.   ENDDO
  422.   SetCursor(1)
  423.   IF grundangaben[1, 12]
  424.     RestScreen(0, 0, 24, 79, l_sBild1)
  425.   ELSE
  426.     RestScreen(0, 0, 24, 79, l_sBild4)
  427.   ENDIF
  428. RETURN p_aRueck
  429. /* ------------------------------------------------------
  430.   ListAsArray( <cList>, <cDelimiter> ) --> aList
  431.   Konvertiert einen String mit Trennzeichen in ein Array.
  432.   gehört zum Lieferumfang und
  433.   muß an dieser Stelle eigebunden werden...
  434. ---------------------------------------------------------
  435.   Occurs( <cSearch>, <cTarget> ) --> nCount
  436.   Stellt die Anzahl des Zeichens <cSearch> in <cTarget> fest
  437.   gehört zum Lieferumfang und
  438.   muß an dieser Stelle eingebunden werden...
  439. --------------------------------------------------------- */
  440.  
  441. /* ------------------------------------------------------ */
  442. FUNCTION WHotKey(x, punkt)
  443. /*                    x     - Anzeigezeile für Hot-Key    */
  444. /*                    punkt - Nummer des Menupunktes      */
  445. IF p_aKoordy[punkt, 2] <> NIL
  446.   @ x, p_aKoordy[punkt, 1] SAY p_aKoordy[punkt, 2]
  447. ENDIF
  448. RETURN NIL
  449. /* ------------------------------------------------------ */
  450. FUNCTION SetCenterText(ls_menuname, li_zeile, ;
  451.                        ls_farbe1, ls_begrenz, ls_farbe2)
  452. /* ls_menuname = STRING    auszugebender Text             */
  453. /* li_zeile    = INTEGER   Ausgabezeile                   */
  454. /* ls_farbe1   = STRING    Farbe des Namens (vor/nint)    */
  455. /*                         (default='w+/r')               */
  456. /* ls_begrenz  = STRING[2] Begrenzungszeichen des Namens  */
  457. /*                         (default='')                   */
  458. /* ls_farbe2   = STRING    Farbe der Begrenzer (vor/hint) */
  459. /*                         (default=color_norm)           */
  460. PRIVATE pi_stranfang
  461. PRIVATE pi_strende
  462. PRIVATE pi_strlaenge := LEN(ls_menuname)
  463. PRIVATE ps_tmpcolor  := SetColor()
  464.  
  465. IF ls_begrenz <> NIL
  466.   PRIVATE ps_tmpbe1  := SUBSTR(ls_begrenz, 1, 1)
  467.   PRIVATE ps_tmpbe2  := SUBSTR(ls_begrenz, 2, 1)
  468. ENDIF
  469. IF ls_farbe1 = NIL
  470.   ls_farbe1 := 'w+/r'
  471. ENDIF
  472. IF ls_farbe2 = NIL
  473.   ls_farbe2 := color_norm
  474. ENDIF
  475. pi_stranfang := INT((80/2)-(pi_strlaenge/2))
  476. pi_strende   := pi_stranfang+pi_strlaenge
  477. IF ls_begrenz <> NIL
  478.   SetColor(ls_farbe2)
  479.   @ li_zeile, pi_stranfang-1 SAY ps_tmpbe1
  480.   @ li_zeile, pi_strende     SAY ps_tmpbe2
  481. ENDIF
  482. SetColor(ls_farbe1)
  483. @ li_zeile, pi_stranfang SAY ls_menuname
  484. SetColor(ps_tmpcolor)
  485. RETURN NIL
  486. /* ------------------------------------------------------ */
  487. FUNCTION SetMessage(p_iZeile, p_iLaenge, ;
  488.                     l_sMessage, l_sFarbe, l_sFarbeF1)
  489. /*  p_iZeile   - Zeile der Nachricht                      */
  490. /*  p_iLaenge  - Max. Länge der Nachricht                 */
  491. /*  l_sMessage - Nachricht-Text                           */
  492. /*  l_sFarbe   - Farbe d. Nachicht                        */
  493. /*  l_sFarbeF1 - Farbe für F1-Darstellung                 */
  494. LOCAL l_iSpalte1
  495. LOCAL l_iSpalte2
  496.  
  497. l_iSpalte1 := 40-Round((LEN(l_sMessage)/2), 0)
  498. l_iSpalte2 := 40-Round((p_iLaenge/2), 0)
  499. SetColor(l_sFarbe)
  500. @ p_iZeile, l_iSpalte2 SAY REPLICATE(' ', p_iLaenge)
  501. @ p_iZeile, l_iSpalte1 SAY l_sMessage
  502. @ p_iZeile, 0 SAY '│'
  503. SetColor(l_sFarbeF1)
  504. @ p_iZeile, 1 SAY '<F1>'
  505. @ p_iZeile, col() SAY 'Hilfe '
  506. SetColor(l_sFarbe)
  507. @ p_iZeile, col() SAY '│'
  508. RETURN NIL
  509. /* ------------------------------------------------------
  510.   BoxShadow( <nOben>, <nLinks>, <nUnten>, <nRechts> )
  511.   Zeichnet eine Schattenbox
  512.  
  513.   gehört zum Lieferumfang und
  514.   muß an dieser Stelle eingebunden werden.                */
  515. /* ------------------------------------------------------ */
  516. FUNCTION PDownMessage
  517. /* Ist eine UDF() für den aktuellen Menüpunkt vorhanden,  */
  518. /* werden die Rückgabe-Parameter von ACHOICE über         */
  519. /* PDOWNMESSAGE als PRIVATE-Variable an die UDF()         */
  520. /* weitergegeben.                                         */
  521. /*   aModus     -> aktueller ACHOICE-Modus                */
  522. /*   APosZeiger -> aktuelle Position d. Menüzeigers       */
  523. /*   APosRel    -> Relative  -"-         -"-              */
  524. /*   Rueck      -> Rueckgabewert wie bei ACHOICE()        */
  525. /*                 ( 0 / 1 / 2 / 3)                       */
  526. parameters aModus, APosZeiger, APosRel
  527.   LOCAL   l_sBild4
  528.   LOCAL   uFunc    := p_aUntMenSpeicher[p_iLauf5, 8]
  529.   PRIVATE Rueck    := 2
  530.  
  531. DO CASE
  532.   CASE aModus = 1
  533.     Rueck := 2
  534.     @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  535.       p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  536.       SAY '  ' + CHR(25) + ' '
  537.   CASE aModus = 2
  538.     Rueck := 2
  539.     @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  540.       p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  541.       SAY ' ' + CHR(25) + '  '
  542.   CASE (aModus = 0)
  543.     SetMessage(p_iZeile, p_iLaenge, ;
  544.                p_aUntMenSpeicher[p_iLauf5, 6, APosZeiger], ;
  545.                p_sFarbeMess, p_aColor[2])
  546.     DO CASE
  547.       CASE LastKey() = 13
  548.         Rueck := 1
  549.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  550.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  551.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  552.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  553.           SAY ' ' + CHR(24) + CHR(25) + ' '
  554.       CASE (LastKey() = 27).OR. ;
  555.            (LastKey() = 19).OR.(LastKey() = 4)
  556.         Rueck := 0
  557.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  558.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  559.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  560.           SAY ' ' + CHR(24) + CHR(25) + ' '
  561.       CASE (LastKey() = 5).OR.(LastKey() = 24)
  562.         Rueck := 2
  563.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  564.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  565.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  566.           SAY ' ' + CHR(24) + CHR(25) + ' '
  567.       CASE (LastKey() = 1).OR.(LastKey() = 6)
  568.         Rueck := 2
  569.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  570.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  571.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  572.           SAY ' ' + CHR(24) + CHR(25) + ' '
  573.       CASE (LastKey() = 18).OR.(LastKey() = 3)
  574.         Rueck := 2
  575.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  576.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  577.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  578.           SAY ' ' + CHR(24) + CHR(25) + ' '
  579.       OTHERWISE
  580.         Rueck := 2
  581.         SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  582.         @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  583.           p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  584.           SAY ' ' + CHR(24) + CHR(25) + ' '
  585.     ENDCASE
  586.     IF (uFunc <> NIL)
  587.       Eval(uFunc)
  588.     ENDIF
  589.     CASE (aModus = 3)
  590.       SetMessage(p_iZeile, p_iLaenge, ;
  591.                  p_aUntMenSpeicher[p_iLauf5,6, APosZeiger], ;
  592.                  p_sFarbeMess, p_aColor[2])
  593.  
  594.       DO CASE
  595.         CASE LastKey() = 13
  596.           Rueck := 1
  597.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  598.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  599.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  600.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  601.             SAY ' ' + CHR(24) + CHR(25) + ' '
  602.  
  603.         CASE (LastKey() = 27).OR. ;
  604.              (LastKey() = 19).OR.(LastKey() = 4)
  605.           Rueck := 0
  606.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  607.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  608.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  609.             SAY ' ' + CHR(24) + CHR(25) + ' '
  610.         CASE (LastKey() = 5).OR.(LastKey() = 24)
  611.           Rueck := 2
  612.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  613.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  614.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  615.             SAY ' ' + CHR(24) + CHR(25) + ' '
  616.         CASE (LastKey() = 1).OR.(LastKey() = 6)
  617.           Rueck := 2
  618.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  619.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  620.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  621.             SAY ' ' + CHR(24) + CHR(25) + ' '
  622.         CASE (LastKey() = 18).OR.(LastKey() = 3)
  623.           Rueck := 2
  624.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  625.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  626.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  627.             SAY ' ' + CHR(24) + CHR(25) + ' '
  628.         CASE ((LastKey() >= 65).AND. ;
  629.               (LastKey() <=90 )).OR. ;
  630.              ((LastKey() >= 97).AND.(LastKey() <=122 ))
  631.           Rueck := 3
  632.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  633.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  634.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  635.             SAY ' ' + CHR(24) + CHR(25) + ' '
  636.         OTHERWISE
  637.           Rueck := 2
  638.           SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  639.           @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  640.             p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  641.             SAY ' ' + CHR(24) + CHR(25) + ' '
  642.       ENDCASE
  643.     IF (uFunc <> NIL)
  644.       Eval(uFunc)
  645.     ENDIF
  646.   CASE aModus = 4
  647.     l_sBild4 := SaveScreen(0, 0, 24, 79)
  648.     SetColor('w+/r')
  649.     BoxShadow(8, 9, 14, 32)
  650.     @  7, 8 CLEAR TO 14,32
  651.     @  7, 8 TO 14,32 DOUBLE
  652.     @  7,15 SAY '╡ FEHLER ╡'
  653.     @  9,10 SAY '   Es ist kein'
  654.     @ 10,10 SAY 'Menupunkt anwählbar !'
  655.     SetColor('w+*/r')
  656.     @ 12,10 SAY '    <TASTE>'
  657.     SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  658.     INKEY(0)
  659.     RestScreen(0, 0, 24, 79, l_sBild4)
  660.     Rueck := 0
  661.     @ p_aUntMenSpeicher[p_iLauf5, 3]+1, ;
  662.       p_aUntMenSpeicher[p_iLauf5, 2]+3  ;
  663.       SAY ' ' + CHR(24) + CHR(25) + ' '
  664. ENDCASE
  665. SetColor(p_aUntMenSpeicher[p_iLauf5, 11])
  666. RETURN Rueck
  667. /* ------------------------------------------------------ */
  668. /*            Ende von SAAMENU.PRG                        */
  669.  
  670.