home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1989 / 21 / editor.bas < prev    next >
BASIC Source File  |  1989-10-31  |  5KB  |  136 lines

  1. '********** EDITOR.BAS
  2.  
  3. DEFINT A-Z
  4. DECLARE SUB Editor (Text$, LeftCol, RightCol, KeyCode)
  5.  
  6. COLOR 7, 1                              'Clear the screen to white on blue
  7. CLS
  8.  
  9. COLOR 0, 7                              'Set inverse video for editing
  10. Text$ = "This is a test"                'Make some sample text
  11. LeftCol = 20                            'Set left column for editing
  12. RightCol = 40                           'Ditto for right column
  13. LOCATE 10                               'Set the line number for editing
  14.  
  15. DO
  16.                                         'Edit the field
  17.    Editor Text$, LeftCol, RightCol, KeyCode
  18.  
  19. LOOP UNTIL KeyCode = 13 OR KeyCode = 27 'Do until Enter or Escape is pressed
  20.  
  21. COLOR 7, 0
  22.  
  23. SUB Editor (Text$, LeftCol, RightCol, KeyCode)
  24.  
  25.     '----- Find the cursor's size in Scan Lines
  26.     DEF SEG = 0                                 'Peek at low memory to see
  27.     IF PEEK(&H463) = &HB4 THEN                  'what type of monitor we have
  28.        CsrSize = 12                             'Monochrome uses 13 scan lines
  29.     ELSE                                        '  (numbered 0 to 12)
  30.        CsrSize = 7                              'Color uses 8 (0 to 7)
  31.     END IF
  32.  
  33.     Edit$ = SPACE$(RightCol - LeftCol + 1)      'Make a temporary string for
  34.     LSET Edit$ = Text$                          '  editing
  35.  
  36.     TxtPos = POS(0) - LeftCol + 1               'Get the cursor's location to
  37.     IF TxtPos < 1 THEN TxtPos = 1               '  see where to begin editing
  38.     IF TxtPos > LEN(Edit$) THEN TxtPos = LEN(Edit$)
  39.  
  40.     LOCATE , LeftCol                            'Print the editing string
  41.     PRINT Edit$;
  42.  
  43.     '----- Main loop for handling key presses
  44.     DO
  45.        LOCATE , LeftCol + TxtPos - 1, 1         'Locate the cursor, turn it on
  46.  
  47.        DO                                       'Wait for a key press
  48.           Ky$ = INKEY$
  49.        LOOP UNTIL LEN(Ky$)
  50.  
  51.        IF LEN(Ky$) = 1 THEN                     'Make a key code from Ky$
  52.           KeyCode = ASC(Ky$)                    'Single character key
  53.        ELSE
  54.           KeyCode = -ASC(RIGHT$(Ky$, 1))        'Extended keys are negative
  55.        END IF
  56.  
  57.        '----- Branch according to the key pressed
  58.        SELECT CASE KeyCode
  59.  
  60.           '----- Backspace
  61.           CASE 8
  62.              TxtPos = TxtPos - 1                'Back up the text pointer
  63.              LOCATE , LeftCol + TxtPos - 1, 0   'Locate 1 to the left
  64.              IF TxtPos > 0 THEN                 'Still within the field?
  65.                 IF Insert THEN                  'Truncate the string
  66.                    MID$(Edit$, TxtPos) = MID$(Edit$, TxtPos + 1) + " "
  67.                 ELSE                            'Blank the letter
  68.                    MID$(Edit$, TxtPos) = " "
  69.                 END IF
  70.                 PRINT MID$(Edit$, TxtPos);      'Print the new part of text
  71.              END IF
  72.  
  73.           '----- Enter or Escape
  74.           CASE 13, 27
  75.              EXIT DO                            'Bail out
  76.  
  77.           '----- Letter keys
  78.           CASE 32 TO 254
  79.              LOCATE , , 0                       'Turn the cursor off
  80.              IF Insert THEN                     'Expand the text string
  81.                 MID$(Edit$, TxtPos) = Ky$ + MID$(Edit$, TxtPos)
  82.                 PRINT MID$(Edit$, TxtPos);      'Print the expanded part
  83.              ELSE
  84.                 MID$(Edit$, TxtPos) = Ky$       'Put the new letter in string
  85.                 PRINT Ky$;                      'Print the letter
  86.              END IF
  87.              TxtPos = TxtPos + 1                'Increment the text pointer
  88.  
  89.           '----- Left arrow
  90.           CASE -75
  91.              TxtPos = TxtPos - 1                'Decrement the text pointer
  92.  
  93.           '----- Right arrow
  94.           CASE -77
  95.              TxtPos = TxtPos + 1                'Increment the text pointer
  96.  
  97.           '----- Home
  98.           CASE -71
  99.              TxtPos = 1                         'Move text pointer to 1
  100.  
  101.           '----- End
  102.           CASE -79
  103.              FOR N = LEN(Edit$) TO 1 STEP -1    'Look backwards for non-blank
  104.                 IF MID$(Edit$, N, 1) <> " " THEN EXIT FOR
  105.              NEXT
  106.              TxtPos = N + 1                     'Set pointer to last char +1
  107.              IF TxtPos > LEN(Edit$) THEN TxtPos = LEN(Edit$)
  108.  
  109.           '----- Insert key
  110.           CASE -82
  111.              Insert = NOT Insert                'Toggle the Insert state
  112.              IF Insert THEN                     'Adjust the cursor size
  113.                 LOCATE , , , CsrSize \ 2, CsrSize
  114.              ELSE
  115.                 LOCATE , , , CsrSize - 1, CsrSize
  116.              END IF
  117.  
  118.           '----- Delete
  119.           CASE -83                              'Truncate the text
  120.              MID$(Edit$, TxtPos) = MID$(Edit$, TxtPos + 1) + " "
  121.              LOCATE , , 0                       'Print the truncated part
  122.              PRINT MID$(Edit$, TxtPos);
  123.  
  124.           CASE ELSE                             'All other keys,
  125.              EXIT DO                            '  bail out
  126.        END SELECT
  127.  
  128.     LOOP UNTIL TxtPos < 1 OR TxtPos > LEN(Edit$) 'If cursor is out of field,
  129.                                                  '  quit editing
  130.  
  131.     Text$ = RTRIM$(Edit$)                       'Trim the right side of text
  132.  
  133. END SUB
  134.  
  135.  
  136.