home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 12 / einsteig / tools.bas < prev    next >
Encoding:
BASIC Source File  |  1990-09-12  |  20.5 KB  |  641 lines

  1. 'tools.bas
  2.  
  3. 'enthält diverse SUB's und Function's
  4.  
  5. '----------------------------------------------------------
  6.  
  7. 'Definitionen und Deklarationen
  8.  
  9.  
  10. 'Sub-Deklarationen
  11.  
  12. DECLARE SUB Sonder (typ$, vorzeichen%, komma%, cursor%, einfmerker%, eingabe$, laenge%, position%, Zeile%, v$)
  13. DECLARE SUB HellBlinken ()
  14. DECLARE SUB Unterstrichen ()
  15. DECLARE SUB hell ()
  16. DECLARE SUB normal ()
  17. DECLARE SUB Blinken ()
  18. DECLARE SUB invers ()
  19. DECLARE SUB bildloeschen (ZeileLinksOben%, SpalteLinksOben%, ZeileRechtsUnten%, SpalteRechtsUnten%, LoeschZeichen$)
  20. DECLARE SUB rahmen (ZeileLinksOben%, SpalteLinksOben%, ZeileRechtsUnten%, SpalteRechtsUnten%, RahmenZeichen$)
  21. DECLARE SUB InputNeu (vorgabe$, gueltig$, typ$, laenge%, nachkomma%, Zeile%, Spalte%, taste$)
  22. DECLARE SUB pruefuebergabe (Zeile%, Spalte%, typ$, laenge%, nachkomma%, gueltig$, vorgabe$, vorzeichen%, komma%, fehler%)
  23. DECLARE SUB warten (ZeilenNr%)
  24. DECLARE SUB numerisch (komma%, vorzeichen%, einfmerker%, eingabe$, laenge%, position%, v$)
  25. DECLARE SUB zeichen (einfmerker%, eingabe$, laenge%, position%, v$)
  26. DECLARE SUB fehlmeld (ZeilenNr%, Fehlertext$)
  27.  
  28. 'Funktionsdeklarationen
  29.  
  30. DECLARE FUNCTION BalkenMenue% (ZeilenNr%, SpaltenNr%, Elemente%, ErsteWahl%, abstand%, Optionen$())
  31. DECLARE FUNCTION ZeilenMenue% (ZeilenNr%, SpaltenNr%, Elemente%, ErsteWahl%, Optionen$())
  32.  
  33. 'Variablendefinitionen
  34.  
  35. COMMON /Tools/ inversflag
  36.  
  37. FUNCTION BalkenMenue% (ZeilenNr%, SpaltenNr%, Elemente%, ErsteWahl%, abstand%, Optionen$())
  38.     FOR i% = 1 TO Elemente%
  39.         differenz% = abstand% * (i% - 1)
  40.         LOCATE ZeilenNr% + differenz%, SpaltenNr%, 0
  41.         IF i% = ErsteWahl% THEN
  42.             invers
  43.             PRINT "["; i%; "]"; SPACE$(3); Optionen$(i% - 1); " ";
  44.             normal
  45.         ELSE
  46.             PRINT "["; i%; "]"; SPACE$(3); Optionen$(i% - 1); " ";
  47.         END IF
  48.     NEXT i%
  49.     differenz% = abstand% * (ErsteWahl% - 1)
  50.     taste$ = CHR$(255)
  51.     WHILE taste$ <> CHR$(13)
  52.         taste$ = INKEY$
  53.         IF (LEN(taste$) = 2 AND (RIGHT$(taste$, 1) = CHR$(72) OR RIGHT$(taste$, 1) = CHR$(80))) OR taste$ = CHR$(27) THEN
  54.             LOCATE ZeilenNr% + differenz%, SpaltenNr%, 0
  55.             PRINT "["; ErsteWahl%; "]"; SPACE$(3); Optionen$(ErsteWahl% - 1); " ";
  56.             IF RIGHT$(taste$, 1) = CHR$(72) THEN
  57.                 ErsteWahl% = ErsteWahl% - 1
  58.                 IF ErsteWahl% < 1 THEN ErsteWahl% = Elemente%
  59.             END IF
  60.             IF RIGHT$(taste$, 1) = CHR$(80) THEN
  61.                 ErsteWahl% = ErsteWahl% + 1
  62.                 IF ErsteWahl% > Elemente% THEN ErsteWahl% = 1
  63.             END IF
  64.             IF taste$ = CHR$(27) THEN
  65.                 ErsteWahl% = Elemente%
  66.             END IF
  67.             differenz% = abstand% * (ErsteWahl% - 1)
  68.             invers
  69.             LOCATE ZeilenNr% + differenz%, SpaltenNr%, 0
  70.             PRINT "["; ErsteWahl%; "]"; SPACE$(3); Optionen$(ErsteWahl% - 1); " ";
  71.             normal
  72.         END IF
  73.     WEND
  74.     IF taste$ = CHR$(27) THEN
  75.         BalkenMenue% = Elemente%
  76.     ELSE
  77.         BalkenMenue% = ErsteWahl%
  78.     END IF
  79. END FUNCTION
  80.  
  81. SUB bildloeschen (ZeileLinksOben%, SpalteLinksOben%, ZeileRechtsUnten%, SpalteRechtsUnten%, LoeschZeichen$)
  82.     IF LoeschZeichen$ = "" THEN LoeschZeichen$ = " "
  83.     FOR i% = ZeileLinksOben% TO ZeileRechtsUnten%
  84.         LOCATE i%, SpalteLinksOben%
  85.         PRINT STRING$(SpalteRechtsUnten% - SpalteLinksOben% + 1, LoeschZeichen$);
  86.     NEXT i%
  87.     LOCATE 1, 1, 0
  88. END SUB
  89.  
  90. SUB Blinken
  91.     COLOR 18, 0
  92. END SUB
  93.  
  94. SUB fehlmeld (ZeilenNr%, Fehlertext$)
  95.    
  96.     SHARED inversflag
  97.  
  98.     normal
  99.     LOCATE ZeilenNr%, 2, 0
  100.     PRINT Fehlertext$;
  101.     CALL warten(23)
  102.     IF inversflag = 1 THEN
  103.         invers
  104.     END IF
  105. END SUB
  106.  
  107. SUB hell
  108.     COLOR 10, 0
  109. END SUB
  110.  
  111. SUB HellBlinken
  112.     COLOR 26, 0
  113. END SUB
  114.  
  115. SUB InputNeu (vorgabe$, gueltig$, typ$, laenge%, nachkomma%, Zeile%, Spalte%, taste$)
  116.  
  117. 'eingaberoutine als ersatz für input
  118. 'benötigt Zeilen- und Spaltenposition und Gesamtlänge des Eingabefeldes
  119. 'typ der Eingabe: (n)umerisch, nur (c)haracter oder (a)lphanumerisch
  120. 'anzahl der nachkommastellen
  121. 'string mit den gültigen zeichen, kann leer sein und wird dann mit
  122. 'default-zeichen belegt
  123. 'vorgabewert, kann auch leer sein
  124.  
  125. SHARED inversflag
  126.  
  127.     'initialisierungen und prüfungen
  128.     '-------------------------------
  129.  
  130.    
  131.     CONST ESC = 27
  132.     CONST ENTER = 13
  133.     CONST UEBER = 7
  134.     CONST EINF = 12
  135.     CONST BACKSPACE = 8
  136.  
  137.     steuerzeichen% = 0
  138.     cursor% = UEBER
  139.     IF LEN(vorgabe$) < laenge% THEN
  140.        position% = LEN(vorgabe$) + 1
  141.     ELSE
  142.        position% = LEN(vorgabe$)
  143.     END IF
  144.     vorzeichen% = 0
  145.     komma% = 0
  146.     einfmerker% = 0
  147.  
  148.     CALL pruefuebergabe(Zeile%, Spalte%, typ$, laenge%, nachkomma%, gueltig$, vorgabe$, vorzeichen%, komma%, fehler%)
  149.  
  150.     'Abbruch, falls Übergabefehler entdeckt
  151.     '--------------------------------------
  152.                        
  153.     IF fehler% THEN
  154.         EXIT SUB
  155.    
  156.     END IF
  157.  
  158.     'eingabe$ mit blanks bis laenge füllen
  159.     '--------------------------------------------------
  160.  
  161.     eingabe$ = vorgabe$ + SPACE$(laenge% - LEN(vorgabe$))
  162.  
  163.     'eingabeschleife
  164.     '---------------
  165.  
  166.     invers
  167.     inversflag = 1
  168.     LOCATE Zeile%, Spalte%, 1, 6, UEBER
  169.     PRINT eingabe$
  170.     LOCATE Zeile%, Spalte% + position% - 1, 1, 6, UEBER
  171.  
  172.     DO
  173.         fehler% = 0
  174.         a$ = ""
  175.         WHILE a$ = ""
  176.             a$ = INKEY$
  177.         WEND
  178.  
  179.         IF LEN(a$) = 1 THEN
  180.             sonderzeichen% = 0
  181.             v$ = a$
  182.         ELSE
  183.             sonderzeichen% = 1
  184.             v$ = RIGHT$(a$, 1)
  185.         END IF
  186.  
  187.         IF sonderzeichen% = 0 AND ASC(v$) <> BACKSPACE THEN
  188.             SELECT CASE ASC(v$)
  189.             CASE ESC
  190.                 taste$ = "ESC"
  191.                 EXIT DO
  192.             CASE ENTER
  193.                 taste$ = "ENTER"
  194.                 IF INSTR(eingabe$, ".") THEN
  195.                     vor$ = LEFT$(eingabe$, INSTR(eingabe$, ".") - 1)
  196.                     nach$ = RTRIM$(RIGHT$(eingabe$, laenge% - INSTR(eingabe$, ".")))
  197.                 ELSE
  198.                     vor$ = RTRIM$(eingabe$)
  199.                     nach$ = ""
  200.                 END IF
  201.                 IF LEN(vor$) > laenge% - nachkomma% - 1 AND typ$ = "N" THEN
  202.                     CALL fehlmeld(23, "Zu viele Vorkommastellen in der Eingabe")
  203.                     fehler% = 1
  204.                 END IF
  205.                 IF LEN(nach$) > nachkomma% AND typ$ = "N" THEN
  206.                     CALL fehlmeld(23, "Zu viele Nachkommastellen in der Eingabe")
  207.                     fehler% = 1
  208.                 END IF
  209.                 IF fehler% = 0 THEN
  210.                     EXIT DO
  211.                 END IF
  212.             CASE ELSE
  213.                 IF INSTR(gueltig$, v$) THEN
  214.                     SELECT CASE typ$
  215.                     CASE "C", "A"
  216.                         CALL zeichen(einfmerker%, eingabe$, laenge%, position%, v$)
  217.                     CASE "N"
  218.                         CALL numerisch(komma%, vorzeichen%, einfmerker%, eingabe$, laenge%, position%, v$)
  219.                     END SELECT
  220.                 ELSE
  221.                     BEEP
  222.                     fehler% = 1
  223.                 END IF
  224.             END SELECT
  225.         ELSE
  226.             CALL Sonder(typ$, vorzeichen%, komma%, cursor%, einfmerker%, eingabe$, laenge%, position%, Zeile%, v$)
  227.             IF ASC(v$) = 72 THEN taste$ = "CURHOCH": EXIT DO
  228.             IF ASC(v$) = 80 THEN taste$ = "CURRUNTER": EXIT DO
  229.             IF ASC(v$) = 59 THEN taste$ = "F1": EXIT DO
  230.         END IF
  231.       
  232.         LOCATE Zeile%, Spalte%, 1, 6, cursor%
  233.         CALL invers
  234.         PRINT eingabe$
  235.         CALL normal
  236.         LOCATE Zeile%, Spalte% + position% - 1, 1, 6, cursor%
  237.  
  238.     LOOP
  239.  
  240.     'Rechtsbündige BLANKS entfernen, falls ENTER oder CURHOCH oder CURRUNTER oder F1
  241.     'bei ESC bleibt vorgabe$ unverändert
  242.     '--------------------------------------------
  243.  
  244.     IF ASC(v$) = ENTER OR taste$ = "CURHOCH" OR taste$ = "CURRUNTER" OR taste$ = "F1" THEN
  245.         vorgabe$ = RTRIM$(eingabe$)
  246.     END IF
  247.   
  248.     normal
  249.     inversflag = 0
  250.  
  251. END SUB
  252.  
  253. SUB invers
  254.     COLOR 0, 7
  255. END SUB
  256.  
  257. SUB JaNein (Zeile%, Spalte%, text$, ant$)
  258.       CALL hell
  259.       LOCATE Zeile%, Spalte%, 0
  260.       PRINT text$
  261.       DO
  262.         ant$ = INKEY$
  263.       LOOP UNTIL UCASE$(ant$) = "J" OR UCASE$(ant$) = "N"
  264.       CALL normal
  265.       LOCATE Zeile%, Spalte%, 0
  266. END SUB
  267.  
  268. SUB normal
  269.     COLOR 7, 0
  270. END SUB
  271.  
  272. SUB numerisch (komma%, vorzeichen%, einfmerker%, eingabe$, laenge%, position%, v$)
  273.  
  274.     IF v$ = "," THEN v$ = "."
  275.     IF v$ = "." THEN
  276.         SELECT CASE einfmerker%
  277.         CASE 0
  278.             IF komma% = 1 AND INSTR(eingabe$, ".") <> position% THEN
  279.                 CALL fehlmeld(23, "Dezimalpunkt bereits vorhanden")
  280.                 EXIT SUB
  281.             END IF
  282.             IF komma% = 0 THEN
  283.                 komma% = 1
  284.             END IF
  285.         CASE 1
  286.             IF komma% = 1 THEN
  287.                 CALL fehlmeld(23, "Dezimalpunkt bereits vorhanden")
  288.                 EXIT SUB
  289.             END IF
  290.             IF LEN(RTRIM$(eingabe$)) < laenge% THEN
  291.                 komma% = 1
  292.             END IF
  293.         END SELECT
  294.     END IF
  295.     IF v$ <> "." AND INSTR(eingabe$, ".") = position% AND einfmerker% = 0 THEN
  296.         komma% = 0
  297.     END IF
  298.     IF (v$ = "+" OR v$ = "-") AND position% <> 1 THEN
  299.         CALL fehlmeld(23, "Vorzeichen nur am Anfang des Feldes möglich")
  300.         EXIT SUB
  301.     END IF
  302.     IF (v$ = "+" OR v$ = "-") AND position% = 1 AND einfmerker% = 1 AND vorzeichen% = 1 THEN
  303.         CALL fehlmeld(23, "Einfügen eines weiteren Vorzeichens unmöglich")
  304.         EXIT SUB
  305.     END IF
  306.     IF v$ = "+" OR v$ = "-" THEN
  307.         vorzeichen% = 1
  308.     END IF
  309.   
  310.     CALL zeichen(einfmerker%, eingabe$, laenge%, position%, v$)
  311.  
  312. END SUB
  313.  
  314. SUB pruefuebergabe (Zeile%, Spalte%, typ$, laenge%, nachkomma%, gueltig$, vorgabe$, vorzeichen%, komma%, fehler%)
  315.   
  316.     IF LEN(vorgabe$) > laenge% THEN
  317.         CALL fehlmeld(23, "Vorgabe ist zu lang")
  318.         fehler% = 1
  319.     END IF
  320.     SELECT CASE typ$
  321.     CASE "c", "C"
  322.         typ$ = "C"
  323.         nachkomma% = 0
  324.         IF LEN(gueltig$) = 0 THEN
  325.             gueltig$ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüÄÖÜß "
  326.         END IF
  327.     CASE "a", "A"
  328.         typ$ = "A"
  329.         nachkomma% = 0
  330.         IF gueltig$ = "" THEN
  331.             FOR i = 1 TO 255
  332.                 gueltig$ = gueltig$ + CHR$(i)
  333.             NEXT i
  334.         END IF
  335.     CASE "n", "N"
  336.         typ$ = "N"
  337.         IF LEN(gueltig$) = 0 THEN
  338.             gueltig$ = "0123456789+-.,"
  339.         END IF
  340.         IF laenge% - nachkomma% < 2 THEN
  341.             CALL fehlmeld(23, "Gesamtlaenge des Feldes nicht ausreichend")
  342.             fehler% = 1
  343.         END IF
  344.         SELECT CASE INSTR(vorgabe$, "+")
  345.         CASE 0
  346.             vorzeichen% = 0
  347.         CASE 1
  348.             vorzeichen% = 1
  349.         CASE IS > 1
  350.             CALL fehlmeld(23, "Vorzeichen nur an der ersten Position erlaubt")
  351.             fehler% = 1
  352.         END SELECT
  353.         SELECT CASE INSTR(vorgabe$, "-")
  354.         CASE 0
  355.             vorzeichen% = 0
  356.         CASE 1
  357.             vorzeichen% = 1
  358.         CASE IS > 1
  359.             CALL fehlmeld(23, "Vorzeichen nur an der ersten Position erlaubt")
  360.             fehler% = 1
  361.         END SELECT
  362.         komma% = 0
  363.         FOR i = 1 TO LEN(vorgabe$)
  364.             IF MID$(vorgabe$, i, 1) = "." OR MID$(vorgabe$, i, 1) = "," THEN
  365.                 komma% = komma% + 1
  366.             END IF
  367.             IF komma% > 1 THEN
  368.                 CALL fehlmeld(23, "Mehr als ein Dezimalpunkt in der Vorgabe")
  369.                 fehler% = 1
  370.             END IF
  371.         NEXT i
  372.         IF INSTR(vorgabe$, ",") <> 0 THEN
  373.             vorgabe$ = LEFT$(vorgabe$, INSTR(vorgabe$, ",") - 1) + "." + RIGHT$(vorgabe$, LEN(vorgabe$) - INSTR(vorgabe$, ","))
  374.         END IF
  375.         FOR i = 1 TO LEN(vorgabe$)
  376.             SELECT CASE MID$(vorgabe$, i, 1)
  377.             CASE "0" TO "9", "+", "-", "."
  378.             CASE ELSE
  379.                 CALL fehlmeld(23, "Ungültige Zeichen in der numerischen Vorgabe")
  380.                 fehler% = 1
  381.                 EXIT FOR
  382.             END SELECT
  383.         NEXT i
  384.     CASE ELSE
  385.         CALL fehlmeld(23, "Falsches Typkennzeichen gewählt, nur 'c', 'a' und 'n' erlaubt")
  386.         fehler% = 1
  387.     END SELECT
  388.     SELECT CASE Zeile%
  389.     CASE IS < 1, IS > 25
  390.         CALL fehlmeld(23, "Zeilenposition außerhalb des Bereichs")
  391.         fehler% = 1
  392.     END SELECT
  393.     SELECT CASE Spalte%
  394.     CASE IS < 1, IS > 80
  395.         CALL fehlmeld(23, "Spaltenposition außerhalb des Bereichs")
  396.         fehler% = 1
  397.     END SELECT
  398.     IF INSTR(vorgabe$, ".") THEN
  399.         vor$ = LEFT$(vorgabe$, INSTR(vorgabe$, ".") - 1)
  400.         nach$ = MID$(vorgabe$, INSTR(vorgabe$, ".") + 1)
  401.     ELSE
  402.         vor$ = RTRIM$(vorgabe$)
  403.         nach$ = ""
  404.     END IF
  405.     IF LEN(vor$) > laenge% - nachkomma% - 1 AND typ$ = "N" THEN
  406.         CALL fehlmeld(23, "Zu viele Vorkommastellen in der Vorgabe")
  407.         fehler% = 1
  408.     END IF
  409.     IF LEN(nach$) > nachkomma% AND typ$ = "N" THEN
  410.         CALL fehlmeld(23, "Zu viele Nachkommastellen in der Vorgabe")
  411.         fehler% = 1
  412.     END IF
  413.  
  414. END SUB
  415.  
  416. SUB rahmen (ZeileLinksOben%, SpalteLinksOben%, ZeileRechtsUnten%, SpalteRechtsUnten%, RahmenZeichen$)
  417.     SELECT CASE RahmenZeichen$
  418.         CASE CHR$(201)
  419.             ZeichenLinksOben$ = CHR$(201)
  420.             ZeichenLinksUnten$ = CHR$(200)
  421.             ZeichenRechtsOben$ = CHR$(187)
  422.             ZeichenRechtsUnten$ = CHR$(188)
  423.             ZeichenWaagrecht$ = CHR$(205)
  424.             ZeichenSenkrecht$ = CHR$(186)
  425.         CASE CHR$(218)
  426.             ZeichenLinksOben$ = CHR$(218)
  427.             ZeichenLinksUnten$ = CHR$(192)
  428.             ZeichenRechtsOben$ = CHR$(191)
  429.             ZeichenRechtsUnten$ = CHR$(217)
  430.             ZeichenWaagrecht$ = CHR$(196)
  431.             ZeichenSenkrecht$ = CHR$(179)
  432.         CASE CHR$(213)
  433.             ZeichenLinksOben$ = CHR$(213)
  434.             ZeichenLinksUnten$ = CHR$(212)
  435.             ZeichenRechtsOben$ = CHR$(184)
  436.             ZeichenRechtsUnten$ = CHR$(190)
  437.             ZeichenWaagrecht$ = CHR$(205)
  438.             ZeichenSenkrecht$ = CHR$(179)
  439.         CASE CHR$(214)
  440.             ZeichenLinksOben$ = CHR$(214)
  441.             ZeichenLinksUnten$ = CHR$(211)
  442.             ZeichenRechtsOben$ = CHR$(183)
  443.             ZeichenRechtsUnten$ = CHR$(189)
  444.             ZeichenWaagrecht$ = CHR$(196)
  445.             ZeichenSenkrecht$ = CHR$(186)
  446.         CASE ELSE
  447.             ZeichenLinksOben$ = RahmenZeichen$
  448.             ZeichenLinksUnten$ = RahmenZeichen$
  449.             ZeichenRechtsOben$ = RahmenZeichen$
  450.             ZeichenRechtsUnten$ = RahmenZeichen$
  451.             ZeichenWaagrecht$ = RahmenZeichen$
  452.             ZeichenSenkrecht$ = RahmenZeichen$
  453.     END SELECT
  454.     LOCATE ZeileLinksOben%, SpalteLinksOben%
  455.     PRINT ZeichenLinksOben$; STRING$(SpalteRechtsUnten% - SpalteLinksOben% - 1, ZeichenWaagrecht$); ZeichenRechtsOben$;
  456.     FOR i% = ZeileLinksOben% + 1 TO ZeileRechtsUnten% - 1
  457.         LOCATE i%, SpalteLinksOben%
  458.         PRINT ZeichenSenkrecht$;
  459.         LOCATE i%, SpalteRechtsUnten%
  460.         PRINT ZeichenSenkrecht$;
  461.     NEXT i%
  462.     LOCATE ZeileRechtsUnten%, SpalteLinksOben%
  463.     PRINT ZeichenLinksUnten$; STRING$(SpalteRechtsUnten% - SpalteLinksOben% - 1, ZeichenWaagrecht$); ZeichenRechtsUnten$;
  464. END SUB
  465.  
  466. SUB Sonder (typ$, vorzeichen%, komma%, cursor%, einfmerker%, eingabe$, laenge%, position%, Zeile%, v$)
  467.   
  468.     CONST UEBER = 7
  469.     CONST EINF = 12
  470.     CONST BACKSPACE = 8
  471.     CONST BLANK = " "
  472.     CONST CURLINKS = 75
  473.     CONST CURRECHTS = 77
  474.     CONST CURHOCH = 72
  475.     CONST CURRUNTER = 80
  476.     CONST HOME = 71
  477.     CONST ENDE = 79
  478.     CONST DEL = 83
  479.     CONST INS = 82
  480.   
  481.     'DEL
  482.     '---
  483.     IF ASC(v$) = DEL THEN
  484.         loesch$ = MID$(eingabe$, position%, 1)
  485.         IF typ$ = "N" AND loesch$ = "." THEN komma% = 0
  486.         IF typ$ = "N" AND (loesch$ = "+" OR loesch$ = "-") THEN vorzeichen% = 0
  487.         eingabe$ = LEFT$(eingabe$, position% - 1) + RIGHT$(eingabe$, laenge% - position%) + BLANK
  488.         EXIT SUB
  489.     END IF
  490.              
  491.     'BACKSPACE
  492.     '---------
  493.     IF ASC(v$) = BACKSPACE THEN
  494.         IF position% = 1 THEN
  495.             BEEP
  496.             EXIT SUB
  497.         ELSE
  498.             IF position% = laenge% THEN
  499.                 loesch$ = MID$(eingabe$, position%, 1)
  500.                 IF MID$(eingabe$, laenge%, 1) = BLANK THEN
  501.                     position% = position% - 1
  502.                     eingabe$ = LEFT$(eingabe$, position% - 1) + RIGHT$(eingabe$, laenge% - position%) + BLANK
  503.                 ELSE
  504.                     eingabe$ = LEFT$(eingabe$, position% - 1) + BLANK
  505.                 END IF
  506.             ELSE
  507.                 loesch$ = MID$(eingabe$, position% - 1, 1)
  508.                 position% = position% - 1
  509.                 eingabe$ = LEFT$(eingabe$, position% - 1) + RIGHT$(eingabe$, laenge% - position%) + BLANK
  510.             END IF
  511.         END IF
  512.         IF typ$ = "N" AND loesch$ = "." THEN komma% = 0
  513.         IF typ$ = "N" AND (loesch$ = "+" OR loesch$ = "-") THEN vorzeichen% = 0
  514.         EXIT SUB
  515.     END IF
  516.              
  517.     'Sonderzeichen
  518.     '-------------
  519.  
  520.         SELECT CASE ASC(v$)
  521.         CASE CURHOCH, CURRUNTER
  522.             'BEEP
  523.         CASE CURLINKS
  524.             IF position% > 1 THEN
  525.                 position% = position% - 1
  526.             ELSE
  527.                 BEEP
  528.             END IF
  529.         CASE CURRECHTS
  530.             IF typ$ <> "N" THEN
  531.                 IF position% < laenge% THEN
  532.                     position% = position% + 1
  533.                 ELSE
  534.                     BEEP
  535.                 END IF
  536.             ELSE
  537.                 IF MID$(eingabe$, position%, 1) <> BLANK THEN
  538.                     position% = position% + 1
  539.                 ELSE
  540.                     BEEP
  541.                 END IF
  542.             END IF
  543.         CASE HOME
  544.             position% = 1
  545.         CASE ENDE
  546.             IF typ$ <> "N" THEN
  547.                 position% = laenge%
  548.             ELSE
  549.                 position% = LEN(RTRIM$(eingabe$)) + 1
  550.             END IF
  551.         CASE INS
  552.             IF einfmerker% THEN
  553.                 einfmerker% = 0
  554.                 cursor% = 7
  555.             ELSE
  556.                 einfmerker% = 1
  557.                 cursor% = 12
  558.             END IF
  559.         END SELECT
  560. END SUB
  561.  
  562. SUB Unterstrichen
  563.     COLOR 1, 0
  564. END SUB
  565.  
  566. SUB warten (ZeilenNr%)
  567.     LOCATE ZeilenNr%, 2, 0
  568.     PRINT " Weiter mit ";
  569.     invers
  570.     PRINT "<TASTE>";
  571.     normal
  572.     dummy$ = INPUT$(1)
  573.     LOCATE ZeilenNr%, 2, 0
  574.     PRINT SPACE$(78);
  575. END SUB
  576.  
  577. SUB zeichen (einfmerker%, eingabe$, laenge%, position%, v$)
  578.  
  579.     IF einfmerker% = 1 THEN
  580.         IF LEN(RTRIM$(eingabe$)) < laenge% THEN
  581.             eingabe$ = LEFT$(eingabe$, position% - 1) + v$ + MID$(eingabe$, position%, laenge% - position%)
  582.         ELSE
  583.             CALL fehlmeld(23, "Einfügen unmöglich, Feld bereits gefüllt")
  584.             position% = position% - 1
  585.         END IF
  586.     ELSE
  587.         eingabe$ = LEFT$(eingabe$, position% - 1) + v$ + MID$(eingabe$, position% + 1, laenge% - position%)
  588.     END IF
  589.     IF position% < laenge% THEN
  590.         position% = position% + 1
  591.     END IF
  592.  
  593. END SUB
  594.  
  595. FUNCTION ZeilenMenue% (ZeilenNr%, SpaltenNr%, Elemente%, ErsteWahl%, Optionen$())
  596.     DIM OptionsLaenge%(Elemente% - 1)
  597.     OptionsLaenge%(0) = 0
  598.     LOCATE ZeilenNr%, SpaltenNr%, 0
  599.     FOR i% = 1 TO Elemente%
  600.         IF i% = ErsteWahl% THEN
  601.             invers
  602.             PRINT " "; Optionen$(i% - 1); " ";
  603.             normal
  604.         ELSE
  605.             PRINT " "; Optionen$(i% - 1); " ";
  606.         END IF
  607.         IF i% > 1 THEN
  608.             OptionsLaenge%(i% - 1) = OptionsLaenge%(i% - 2) + (LEN(Optionen$(i% - 2)) + 2)
  609.         END IF
  610.     NEXT i%
  611.     taste$ = CHR$(255)
  612.     WHILE taste$ <> CHR$(13)
  613.         taste$ = INKEY$
  614.         IF (LEN(taste$) = 2 AND (RIGHT$(taste$, 1) = CHR$(75) OR RIGHT$(taste$, 1) = CHR$(77))) OR taste$ = CHR$(27) THEN
  615.             LOCATE ZeilenNr%, SpaltenNr% + OptionsLaenge%(ErsteWahl% - 1), 0
  616.             PRINT " "; Optionen$(ErsteWahl% - 1); " ";
  617.             IF RIGHT$(taste$, 1) = CHR$(75) THEN
  618.                 ErsteWahl% = ErsteWahl% - 1
  619.                 IF ErsteWahl% < 1 THEN ErsteWahl% = Elemente%
  620.             END IF
  621.             IF RIGHT$(taste$, 1) = CHR$(77) THEN
  622.                 ErsteWahl% = ErsteWahl% + 1
  623.                 IF ErsteWahl% > Elemente% THEN ErsteWahl% = 1
  624.             END IF
  625.             IF taste$ = CHR$(27) THEN
  626.                 ErsteWahl% = Elemente%
  627.             END IF
  628.             LOCATE ZeilenNr%, SpaltenNr% + OptionsLaenge%(ErsteWahl% - 1), 0
  629.             invers
  630.             PRINT " "; Optionen$(ErsteWahl% - 1); " ";
  631.             normal
  632.         END IF
  633.     WEND
  634.     IF taste$ = CHR$(27) THEN
  635.         ZeilenMenue% = Elemente%
  636.     ELSE
  637.         ZeilenMenue% = ErsteWahl%
  638.     END IF
  639. END FUNCTION
  640.  
  641.