home *** CD-ROM | disk | FTP | other *** search
- '****************************************************************************
- 'Total Control Systems QuickBasic 4.5
- '****************************************************************************
- '
- ' Program : GINPUT.BAS
- ' Written by : Tim Beck
- ' Written On : 10-01-90
- ' Function : GET INPUT SUBROUTINE
- '
- '****************************************************************************
- ' This program and those associated with it were written for use with Quick-
- ' Windows Advanced (Version 1.5+). Possesion of this program entitles you
- ' to certain priviliges. They are:
- '
- ' 1. You may compile, use, or modify this program in any way you choose
- ' provided you do not sell or give away the source code to this prog-
- ' ram or any of it's companions to anyone for any reason. You may,
- ' however, sell the resulting executable program as you see fit.
- '
- ' 2. You may modify, enhance or change these programs as you see fit. I
- ' as that you keep a copy of the original code and that you notify
- ' me of any improvements you make. I like to think that the code is
- ' bug free and cannot be improved upon, but I'm sure someone will
- ' find a way to make it better. If it's you, I'm looking forward to
- ' seeing your changes. I can be reached at:
- '
- ' Tim Beck Tim Beck (C/O Debbie Beck)
- ' 19419 Franz Road 8030 Fairchild Avenue
- ' Houston, Texas 77084 Canoga Park, California 91306
- ' (713) 639-3079 (818) 998-0588
- '
- ' 3. This code has been tested and re-tested in a variety of applications
- ' and although I have not found any bugs, doesn't mean none exist. So,
- ' this program along with it's companions comes with NO WARRANTY,
- ' either expressed or implied. I'm sorry if there are problems, but
- ' I can't be responsible for your work. I've tried to provide a safe
- ' and efficient programming enviroment and I hope you find it helpful
- ' for you. I do, however, need to cover my butt!
- '
- ' I have enjoyed creating this library of programs and have found them to be
- ' a great time saver. I hope you agree.
- '
- ' Tim Beck //
- '
- '****************************************************************************
- DECLARE FUNCTION Show$ (Show.String$, Show.Len%)
- DECLARE SUB GET.INPUT (Row%, Col%, C.pos%, C.type%, AR.Flag%, C.Flag%, Blank%, I.Color%, Format$, Linp$, M.len%, E.Flag%, kb%)
- DECLARE SUB GET.FORMAT (kb%, kb$, C.pos%, Format$, Pass%)
- DECLARE SUB PRINT.CHARSTRING (Row%, Col%, FmtString$, I.Color%)
-
- '---------------------------------------------------------------------------
- ' Row%, Col% = Current Row and Column
- ' C.pos% = Cursor position within String
- ' C.type% = Cursor Type (0 = None, 1 = Single Line, 2 = Half Width, 3 = Full Height (Overwrite)
- ' AR.Flag% = Auto Return Flag (0 = No Auto Return, 1 = Auto Return Max Width)
- ' C.Flag% = Case Flag (0 = Upper & Lower, 1 = Upper Only)
- ' Blank% = Blank Input Flag (0 = Blank out incoming String, 1 = Leave String Alone)
- ' I.Color% = Color Flag% (0 = Use Current Colors, 1 = Use Input Colors)
- ' Format$ = String Format (See Below)
- ' Linp$ = Input / Output String
- ' M.len% = Maximum Length for Input
- ' E.Flag% = Error Flag (0 = OK, 1 = Error, 2 = Fatal Error or Time Out)
- ' kb% = Keyboard Scan Code
- '
- ' Format Codes:
- '
- ' 161 = (! + 128), Any Symbol
- ' 163 = (# + 128), Non-Signed Integer
- ' 171 = (+ + 128), Signed Decimal
- ' 174 = (. + 128), Non-Signed Decimal
- ' 193 = (A + 128), Upper-Case Alpha
- ' 206 = (N + 128), Upper-Case AlphaNumeric
- ' 208 = (P + 128), Proper Case AlphaNumeric
- ' 216 = (X + 128), Upper-Case Any Character
- ' 218 = (Z + 128), Upper-Case Any Character, except Quote (")
- ' 225 = (a + 128), Any-Case Alpha
- ' 230 = (f + 128), FileName Characters
- ' 238 = (n + 128), Any-case AlphaNumeric
- ' 244 = (t + 128), Logical (TF)
- ' 248 = (x + 128), Any-case Any Character
- ' 249 = (y + 128), Logical (YN)
- ' 250 = (z + 128), Any-case Any Character, except Quote (")
-
- REM $INCLUDE: 'STDCOM.INC'
-
- TIMER ON 'Enables Event Trapping (Used to Count time in Module!)
-
- ' ON ERROR GOTO ErrorTrap
-
- ErrorTrap:
-
- ' RESUME
-
- SUB GET.FORMAT (kb%, kb$, C.pos%, Format$, Pass%) STATIC
-
- FALSE = 0
- TRUE = NOT FALSE
-
- Pass% = TRUE
-
- F.Choices$ = CHR$(161) + CHR$(163) + CHR$(171) + CHR$(174) + CHR$(193)
- F.Choices$ = F.Choices$ + CHR$(206) + CHR$(216) + CHR$(218) + CHR$(225)
- F.Choices$ = F.Choices$ + CHR$(230) + CHR$(238) + CHR$(243) + CHR$(244)
- F.Choices$ = F.Choices$ + CHR$(248) + CHR$(249) + CHR$(250) + CHR$(208)
-
- IF C.pos% > 1 THEN
- IF ASC(MID$(Format$, C.pos%, 1)) < 128 AND ASC(MID$(Format$, C.pos% - 1, 1)) > 128 AND kb$ = MID$(Format$, C.pos% - 1, 1) THEN
- Last.Char% = -1
- ELSE
- Last.Char% = 0
- END IF
- END IF
-
- IF INSTR("+-.,1234567890", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 171 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF INSTR(".,1234567890", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 174 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF INSTR(",1234567890", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 163 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF INSTR("1234567890-ABCDEFGHIJKLMNOPQRSTUVWXYZ:\.", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 230 THEN
- IF ASC(MID$(Format$, C.pos%, 1)) = 230 AND kb% >= 97 AND kb% <= 122 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- ELSEIF Last.Char = 0 THEN
- PRINT Bell$;
- Pass% = FALSE
- ELSE
- Pass% = FALSE
- END IF
- ELSEIF INSTR("TF", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 244 THEN
- IF ASC(MID$(Format$, C.pos%, 1)) = 244 AND (kb$ = "t" OR kb$ = "f") THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- ELSEIF Last.Char = 0 THEN
- PRINT Bell$;
- Pass% = FALSE
- ELSE
- Pass% = FALSE
- END IF
- ELSEIF INSTR("YN", kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 249 THEN
- IF ASC(MID$(Format$, C.pos%, 1)) = 249 AND (kb$ = "y" OR kb$ = "n") THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- ELSEIF Last.Char = 0 THEN
- PRINT Bell$;
- Pass% = FALSE
- ELSE
- Pass% = FALSE
- END IF
- ELSEIF (ASC(MID$(Format$, C.pos%, 1)) = 225 OR ASC(MID$(Format$, C.pos%, 1)) = 193) THEN
- IF INSTR(" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", kb$) = 0 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 193 AND kb% >= 97 AND kb% <= 122 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- ELSEIF (ASC(MID$(Format$, C.pos%, 1)) = 238 OR ASC(MID$(Format$, C.pos%, 1)) = 206) THEN
- IF INSTR(" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", kb$) = 0 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 206 AND kb% >= 97 AND kb% <= 122 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- ELSEIF INSTR("~!@#$%^&*()_+|`-=\{}[]:;'<>,./?*" + CHR$(34), kb$) = 0 AND ASC(MID$(Format$, C.pos%, 1)) = 161 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 243 THEN
- IF EditFlag% THEN
- IF INSTR("!#+.AFNTYXZafntyxz", kb$) = 0 THEN
- PRINT Bell$;
- Pass% = FALSE
- ELSE
- IF INSTR("FTY", kb$) > 0 THEN
- kb% = kb% + 32
- END IF
- kb% = kb% + 128
- kb$ = CHR$(kb%)
- END IF
- ELSE
- IF INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+|`-=\{}[]:;'<>,./? ", kb$) = 0 THEN
- PRINT Bell$;
- Pass% = FALSE
- END IF
- END IF
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 248 OR ASC(MID$(Format$, C.pos%, 1)) = 216 OR ASC(MID$(Format$, C.pos%, 1)) = 208 THEN
- IF ASC(MID$(Format$, C.pos%, 1)) = 216 AND kb% >= 97 AND kb% <= 122 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- ELSEIF (ASC(MID$(Format$, C.pos%, 1)) = 250 OR ASC(MID$(Format$, C.pos%, 1)) = 218) THEN
- IF INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+|`-=\{}[]:;'<>,./? ", kb$) = 0 THEN
- IF Last.Char = 0 THEN
- PRINT Bell$;
- END IF
- Pass% = FALSE
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 218 AND kb% >= 97 AND kb% <= 122 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- ELSEIF INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0 THEN
- WHILE INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0
- C.pos% = C.pos% + 1
- WEND
- Pass% = FALSE
- END IF
-
- END SUB
-
- SUB GET.INPUT (SRow%, SCol%, C.pos%, C.type%, AR.Flag%, C.Flag%, Blank%, I.Color%, Format$, Linp$, M.len%, E.Flag%, kb%) STATIC
-
- DIM Scrn%(15)
-
- IF S.Fore% <= 7 THEN
- SB.attr% = S.Back% + (16 * S.Fore%)
- ELSE
- SB.attr% = S.Back% + (16 * (S.Fore% - 8))
- END IF
-
- IF Status.Line.Row% = 0 OR Status.Line.Row% > 24 THEN
- Status.Line.Row% = 24
- END IF
-
- IF Status.Line.Col% = 0 OR Status.Line.Col% > 65 THEN
- Status.Line.Col% = 65
- END IF
-
- CALL GETSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
-
- 'The following routine is designed to place the word 'CAPS'
- 'on the screen next to 'INSERT' if the caps lock key is on.
- 'Assuming I can get it to work, the next step is to do the
- 'same for the num lock key.
-
- CALL KBSTATUS(Status%, 0)
-
- IF (Status% AND 32) = 32 THEN
- IF Display.Num.Lock% THEN
- Num% = 1
- CALL PRINTA(Status.Line.Col% + 12, Status.Line.Row%, SB.attr%, "NUM")
- END IF
- ELSEIF (Status% AND 32) <> 32 THEN
- Num% = 0
- END IF
-
- IF (Status% AND 64) = 64 THEN
- IF Display.Cap.Lock% THEN
- Cap% = 1
- CALL PRINTA(Status.Line.Col% + 7, Status.Line.Row%, SB.attr%, "CAPS")
- END IF
- ELSEIF (Status% AND 64) <> 64 THEN
- Cap% = 0
- END IF
-
- kb% = 0
- Ins% = 0
- Tab.Spaces% = 5
- FALSE = 0
- TRUE = NOT FALSE
-
- IF SRow% = 0 THEN
- Row% = CSRLIN
- SRow% = Row%
- ELSE
- Row% = SRow%
- END IF
-
- IF SCol% = 0 THEN
- Col% = POS(X)
- SCol% = Col%
- ELSE
- Col% = SCol%
- END IF
-
- Col% = Col% - 1
-
- IF C.type% = 0 THEN
- C.on% = 0
- C.st% = 0
- C.fn% = 0
- ELSEIF C.type% = 1 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 7
- ELSEIF C.type% = 2 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 12
- ELSEIF C.type% = 3 THEN
- C.on% = 1
- C.st% = 0
- C.fn% = 12
- Ins% = 1
- IF Display.Insert.Key% THEN
- CALL PRINTA(Status.Line.Col%, Status.Line.Row%, (SB.attr%), "INSERT")
- END IF
- ELSEIF C.type% = 4 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 12
- ELSE
- C.type% = 1
- C.on% = 1
- C.st% = 6
- C.fn% = 7
- END IF
-
- F.Choices$ = CHR$(161) + CHR$(163) + CHR$(171) + CHR$(174) + CHR$(193)
- F.Choices$ = F.Choices$ + CHR$(206) + CHR$(216) + CHR$(218) + CHR$(225)
- F.Choices$ = F.Choices$ + CHR$(230) + CHR$(238) + CHR$(243) + CHR$(244)
- F.Choices$ = F.Choices$ + CHR$(248) + CHR$(249) + CHR$(250) + CHR$(208)
-
- IF M.len% < LEN(Format$) AND LEN(Format$) > 0 THEN
- M.len% = LEN(Format$)
- END IF
-
- IF LEN(Linp$) <= M.len% THEN
- IF M.len% > 0 THEN
- Linp$ = Show$(Linp$, M.len%)
- ELSE
- Linp$ = ""
- END IF
- ELSEIF LEN(Format$) = 0 THEN
- M.len% = LEN(Linp$)
- END IF
-
- IF Blank% THEN
- Linp$ = SPACE$(M.len%)
- END IF
-
- IF I.Color% THEN
- COLOR DE.Fore%, DE.Back%
- ELSE
- COLOR S.Fore%, S.Back%
- END IF
-
- IF LEN(Format$) THEN
-
- FOR RS% = 1 TO M.len%
- IF INSTR(F.Choices$, MID$(Format$, RS%, 1)) = 0 THEN
- MID$(Linp$, RS%, 1) = MID$(Format$, RS%, 1)
- END IF
- NEXT RS%
-
- IF C.pos% > 0 THEN
- Cur.pos% = C.pos%
- ELSE
- Cur.pos% = 1
- END IF
- WHILE INSTR(F.Choices$, MID$(Format$, Cur.pos%, 1)) = 0 AND Cur.pos% <= M.len%
- Cur.pos% = Cur.pos% + 1
- WEND
-
- IF AR.Flag% AND (Cur.pos% > M.len% OR C.pos% > M.len%) AND M.len% >= 1 THEN
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- EXIT SUB
- END IF
-
- END IF
-
- E.Flag% = 0
- CALL PRINT.CHARSTRING(Row%, Col% + 1, Linp$, I.Color%)
- IF C.pos% = 0 THEN
- C.pos% = 1
- ELSEIF C.pos% > M.len% THEN
- C.pos% = M.len%
- END IF
-
- IF C.on% THEN
- LOCATE Row%, Col% + C.pos%, C.on%, C.st%, C.fn%
- END IF
-
- Start:
-
- IF LEN(Format$) THEN
- WHILE INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0 AND C.pos% <= M.len%
- C.pos% = C.pos% + 1
- WEND
- IF AR.Flag% AND C.pos% > M.len% AND M.len% >= 1 THEN
- C.Flag% = 0
- M.pwd% = 0
- C.pos% = 1
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- END IF
-
- Wt! = TIMER
- LOCATE Row%, Col% + C.pos%, C.on%, C.st%, C.fn%
- CALL INKEY(kb%)
- 'kb$ = INKEY$
- 'WHILE LEN(kb$) = 0
- WHILE kb% = 0
- IF I.Color% THEN
- COLOR DE.Fore%, DE.Back%
- ELSE
- COLOR S.Fore%, S.Back%
- END IF
- CALL KBSTATUS(Status%, 0)
- IF ((Status% AND 64) <> 64) AND Cap% = 1 THEN
- Cap% = 0
- CALL PUTSCRNI(Status.Line.Col% + 7, Status.Line.Row%, Status.Line.Col% + 11, Status.Line.Row%, Scrn%(), 7)
- ELSEIF ((Status% AND 64) = 64) AND Cap% = 0 THEN
- IF Display.Cap.Lock% THEN
- Cap% = 1
- CALL PRINTA(Status.Line.Col% + 7, Status.Line.Row%, SB.attr%, "CAPS")
- END IF
- END IF
- IF ((Status% AND 32) <> 32) AND Num% = 1 THEN
- Num% = 0
- CALL PUTSCRNI(Status.Line.Col% + 12, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%(), 12)
- ELSEIF ((Status% AND 32) = 32) AND Num% = 0 THEN
- IF Display.Num.Lock% THEN
- Num% = 1
- CALL PRINTA(Status.Line.Col% + 12, Status.Line.Row%, SB.attr%, "NUM")
- END IF
- END IF
- CALL INKEY(kb%)
- 'kb$ = INKEY$
- Nt! = TIMER
- LOCATE Row%, Col% + C.pos%, C.on%, C.st%, C.fn%
- IF ((Nt! - Wt! > Mtt%) OR (Nt! - Wt! <= 0)) AND Mtt% THEN
- E.Flag% = 2
- EXIT SUB
- END IF
- WEND
-
- CheckChar:
-
- 'IF LEN(kb$) = 1 THEN
- ' kb% = ASC(kb$)
- 'ELSE
- ' kb% = 128 + ASC(MID$(kb$, 2, 1))
- 'END IF
- IF kb% > 0 AND kb% < 128 THEN
- kb$ = CHR$(kb%)
- END IF
-
- IF kb% = Back.Space% AND C.pos% > 1 THEN
- C.pos% = C.pos% - 1
- IF LEN(Format$) THEN
- WHILE INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0 AND C.pos% > 1
- C.pos% = C.pos% - 1
- WEND
- END IF
- kb% = Delete%
- LOCATE Row%, Col% + C.pos%
- END IF
-
- IF kb% = Ctrl.Y% THEN
- C.pos% = 1
- LOCATE Row%, Col% + C.pos%
- kb% = Ctrl.E%
- END IF
-
- IF kb% = F.9% THEN
- E.Flag% = 1
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSEIF kb% = F.10% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
-
- IF Tab.Flag% THEN
- IF kb% = Horiz.Tab% THEN
- kb% = Down.Arrow%
- ELSEIF kb% = Back.Tab% THEN
- kb% = Up.Arrow%
- END IF
- END IF
-
- IF kb% = Horiz.Tab% THEN
- C.pos% = C.pos% + Tab.Spaces%
- IF C.pos% > M.len% THEN
- C.pos% = M.len%
- END IF
- GOTO Start:
- ELSEIF kb% = Back.Tab% THEN
- C.pos% = C.pos% - Tab.Spaces%
- IF C.pos% < 1 THEN
- C.pos% = 1
- END IF
- GOTO Start:
- ELSEIF kb% = Ctrl.T% OR kb% = Ctrl.Right% OR kb% = Ctrl.F% THEN
- NC% = M.len%
- SF% = M.len%
- FOR RS% = C.pos% + 1 TO M.len%
- IF MID$(Linp$, RS%, 1) = " " THEN
- SF% = RS%
- WHILE MID$(Linp$, RS%, 1) = " " AND RS% <= M.len%
- RS% = RS% + 1
- WEND
- NC% = RS%
- EXIT FOR
- END IF
- NEXT RS%
- IF kb% = Ctrl.T% THEN
- Last.Item$ = MID$(Linp$, C.pos%, NC% - C.pos% - 1)
- Last.pos% = C.pos%
- FOR X6% = C.pos% + 1 TO NC%
- L.len% = LEN(RTRIM$(Linp$)) + 1
- IF L.len% = 0 THEN
- L.len% = 1
- END IF
- IF LEN(Format$) THEN
- FOR RS% = C.pos% + 1 TO L.len%
- IF INSTR(F.Choices$, MID$(Format$, RS%, 1)) = 0 THEN
- MID$(Linp$, RS%, 1) = MID$(Format$, RS%, 1)
- MID$(Linp$, RS% - 1, 1) = " "
- EXIT FOR
- ELSEIF INSTR(F.Choices$, MID$(Format$, RS% - 1, 1)) AND INSTR(F.Choices$, MID$(Format$, RS%, 1)) THEN
- MID$(Linp$, RS% - 1, 1) = MID$(Linp$, RS%, 1)
- IF RS% = M.len% THEN
- MID$(Linp$, M.len%, 1) = " "
- END IF
- END IF
- NEXT RS%
- IF C.pos% = M.len% THEN
- MID$(Linp$, M.len%, 1) = " "
- END IF
- ELSE
- FOR RS% = C.pos% + 1 TO L.len%
- MID$(Linp$, RS% - 1, 1) = MID$(Linp$, RS%, 1)
- NEXT RS%
- MID$(Linp$, L.len%, 1) = " "
- END IF
- NEXT X6%
- CALL PRINT.CHARSTRING(0, 0, RIGHT$(Linp$, M.len% - C.pos% + 1), I.Color%)
- ELSEIF kb% = Ctrl.Right% OR kb% = Ctrl.F% THEN
- C.pos% = NC%
- END IF
- GOTO Start:
- ELSEIF kb% = Ctrl.Left% OR kb% = Ctrl.A% THEN
- NC% = 1
- SB% = 1
- FOR RS% = C.pos% - 1 TO 1 STEP -1
- IF MID$(Linp$, RS%, 1) = " " THEN
- SB% = RS%
- WHILE MID$(Linp$, RS%, 1) = " " AND RS% > 1
- RS% = RS% - 1
- WEND
- WHILE MID$(Linp$, RS%, 1) <> " " AND RS% > 1
- RS% = RS% - 1
- WEND
- IF RS% = 1 THEN
- NC% = 1
- ELSE
- NC% = RS% + 1
- END IF
- EXIT FOR
- END IF
- NEXT RS%
- C.pos% = NC%
- GOTO Start:
- ELSEIF kb% = Page.Up% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSEIF kb% = Page.Down% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSEIF kb% = Insert% THEN
- IF C.type% <= 3 THEN
- Ins% = 1 - Ins%
- IF Ins% THEN
- C.st% = 0
- C.fn% = 10
- IF Display.Insert.Key% THEN
- CALL PRINTA(Status.Line.Col%, Status.Line.Row%, (SB.attr%), "INSERT")
- END IF
- LOCATE Row%, Col% + C.pos%, C.on%, C.st%, C.fn%
- ELSE
- IF C.type% = 0 THEN
- C.on% = 0
- C.st% = 0
- C.fn% = 0
- ELSEIF C.type% = 1 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 7
- ELSEIF C.type% = 2 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 12
- ELSEIF C.type% = 3 THEN
- C.on% = 1
- C.st% = 6
- C.fn% = 7
- END IF
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 6, Status.Line.Row%, Scrn%())
- LOCATE Row%, Col% + C.pos%, C.on%, C.st%, C.fn%
- END IF
- END IF
- GOTO Start:
- ELSEIF kb% = Delete% THEN
- IF LEN(Format$) THEN
- FOR RS% = C.pos% + 1 TO M.len%
- IF INSTR(F.Choices$, MID$(Format$, RS%, 1)) = 0 THEN
- MID$(Linp$, RS%, 1) = MID$(Format$, RS%, 1)
- MID$(Linp$, RS% - 1, 1) = " "
- EXIT FOR
- ELSEIF INSTR(F.Choices$, MID$(Format$, RS% - 1, 1)) > 0 AND INSTR(F.Choices$, MID$(Format$, RS%, 1)) > 0 THEN
- MID$(Linp$, RS% - 1, 1) = MID$(Linp$, RS%, 1)
- IF RS% = M.len% THEN
- MID$(Linp$, M.len%, 1) = " "
- END IF
- END IF
- NEXT RS%
- IF C.pos% = M.len% THEN
- MID$(Linp$, M.len%, 1) = " "
- END IF
- ELSE
- FOR RS% = C.pos% + 1 TO M.len%
- MID$(Linp$, RS% - 1, 1) = MID$(Linp$, RS%, 1)
- NEXT RS%
- MID$(Linp$, M.len%, 1) = " "
- END IF
- CALL PRINT.CHARSTRING(0, 0, RIGHT$(Linp$, M.len% - C.pos% + 1), I.Color%)
- GOTO Start:
- ELSEIF (kb% = Left.Arrow% OR kb% = Ctrl.S%) THEN
- IF C.pos% > 1 AND M.Arrow% = 0 THEN
- C.pos% = C.pos% - 1
- IF LEN(Format$) THEN
- WHILE INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0 AND C.pos% > 1
- C.pos% = C.pos% - 1
- WEND
- END IF
- GOTO Start:
- ELSEIF M.Arrow% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- M.up% = 0
- M.down% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- ELSEIF (kb% = Right.Arrow% OR kb% = Ctrl.D%) THEN
- IF C.pos% <= M.len% AND M.Arrow% = 0 THEN
- C.pos% = C.pos% + 1
- GOTO Start:
- ELSE
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- M.up% = 0
- M.down% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- ELSEIF kb% = Home% THEN
- C.pos% = 1
- IF M.len% = 0 THEN
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- GOTO Start:
- ELSEIF kb% = End.Key% THEN
- IF M.len% THEN
- C.pos% = M.len%
- WHILE C.pos% > 1 AND MID$(Linp$, C.pos%, 1) = " "
- C.pos% = C.pos% - 1
- IF LEN(Format$) THEN
- WHILE INSTR(F.Choices$, MID$(Format$, C.pos%, 1)) = 0 AND C.pos% > 1
- C.pos% = C.pos% - 1
- WEND
- END IF
- WEND
- C.pos% = C.pos% + 1
- GOTO Start:
- ELSE
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- ELSEIF kb% = Escape% OR kb% = Up.Arrow% OR (kb% = Back.Space% AND C.pos% = 1) THEN
- E.Flag% = 1
- C.Flag% = 0
- M.pwd% = 0
- M.up% = 0
- M.down% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSEIF kb% = Enter% OR kb% = Down.Arrow% OR kb% = Ctrl.I% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- M.up% = 0
- M.down% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSEIF kb% = Ctrl.E% THEN
- Last.Item$ = Linp$
- Last.pos% = C.pos%
- FOR RS% = C.pos% TO M.len%
- IF LEN(Format$) THEN
- IF INSTR(F.Choices$, MID$(Format$, RS%, 1)) = 0 THEN
- MID$(Linp$, RS%, 1) = MID$(Format$, RS%, 1)
- PRINT MID$(Format$, RS%, 1);
- ELSE
- MID$(Linp$, RS%, 1) = " "
- PRINT " ";
- END IF
- ELSE
- MID$(Linp$, RS%, 1) = " "
- PRINT " ";
- END IF
- NEXT RS%
- GOTO Start:
- ELSEIF kb% = Ctrl.U% THEN
- IF LEN(Last.Item$) > 0 AND Last.pos% <= M.len% THEN
- IF LEN(RTRIM$(Linp$)) + LEN(Last.Item$) <= M.len% THEN
- Linp$ = LEFT$(LEFT$(Linp$, Last.pos% - 1) + Last.Item$ + MID$(Linp$, Last.pos% + 1), M.len%)
- CALL PRINT.CHARSTRING(0, Col% + Last.pos%, RIGHT$(Linp$, M.len% - Last.pos% + 1), I.Color%)
- Last.Item$ = ""
- ELSE
- PRINT Bell$;
- END IF
- ELSE
- PRINT Bell$;
- END IF
- GOTO Start:
- ELSEIF (kb% < 0 OR kb% > 128) AND Key.Flag% THEN
- E.Flag% = 0
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
-
- IF C.Flag% AND (kb% >= 97 AND kb% <= 122) THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
-
- IF C.pos% > M.len% OR kb% < 32 OR kb% > 126 THEN
- IF AR.Flag% THEN
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- ELSE
- PRINT Bell$;
- GOTO Start:
- END IF
- END IF
-
- IF LEN(Format$) THEN
-
- CALL GET.FORMAT(kb%, kb$, C.pos%, Format$, Pass%)
- IF NOT Pass% THEN
- GOTO Start
- ELSEIF ASC(MID$(Format$, C.pos%, 1)) = 208 THEN
- IF C.pos% = 1 THEN
- IF kb% >= 97 AND kb% <= 127 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- ELSEIF C.pos% > 1 AND ASC(MID$(Linp$, C.pos% - 1, 1)) = 32 THEN
- IF kb% >= 97 AND kb% <= 127 THEN
- kb% = kb% - 32
- kb$ = CHR$(kb%)
- END IF
- END IF
- END IF
-
- END IF
-
- IF Ins% = 0 THEN
- MID$(Linp$, C.pos%, 1) = CHR$(kb%)
- C.pos% = C.pos% + 1
- IF M.pwd% THEN
- PRINT CHR$(178);
- ELSE
- CALL PRINT.CHARSTRING(0, 0, CHR$(kb%), I.Color%)
- END IF
- IF AR.Flag% AND C.pos% > M.len% AND M.len% >= 1 THEN
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- ELSEIF MID$(Linp$, M.len%, 1) <> " " THEN
- PRINT Bell$;
- ELSEIF C.pos% = M.len% THEN
- MID$(Linp$, C.pos%, 1) = CHR$(kb%)
- C.pos% = C.pos% + 1
- IF M.pwd% THEN
- PRINT CHR$(178);
- ELSE
- CALL PRINT.CHARSTRING(0, 0, CHR$(kb%), I.Color%)
- END IF
- IF AR.Flag% AND C.pos% > M.len% AND M.len% >= 1 THEN
- C.Flag% = 0
- M.pwd% = 0
- COLOR S.Fore%, S.Back%
- CALL PUTSCRN(Status.Line.Col%, Status.Line.Row%, Status.Line.Col% + 15, Status.Line.Row%, Scrn%())
- LOCATE SRow%, SCol%
- EXIT SUB
- END IF
- ELSE
- FOR RS% = M.len% - 1 TO C.pos% STEP -1
- MID$(Linp$, RS% + 1, 1) = MID$(Linp$, RS%, 1)
- NEXT RS%
- MID$(Linp$, C.pos%, 1) = CHR$(kb%)
- IF M.pwd% THEN
- PRINT CHR$(178);
- C.pos% = C.pos% + 1
- ELSE
- CALL PRINT.CHARSTRING(0, 0, RIGHT$(Linp$, M.len% - C.pos% + 1), I.Color%)
- C.pos% = C.pos% + 1
- END IF
- END IF
-
- GOTO Start:
-
- END SUB
-
- SUB PRINT.CHARSTRING (Row%, Col%, FmtString$, I.Color%) STATIC
-
- IF Row% = 0 THEN
- Row% = CSRLIN
- END IF
-
- IF Col% = 0 THEN
- Col% = POS(0)
- END IF
-
- LOCATE Row%, Col%
- FOR char% = 1 TO LEN(FmtString$)
- char$ = MID$(FmtString$, char%, 1)
- IF ASC(char$) > 128 THEN
- CALL PRINTA(Col% + char% - 1, Row%, DE.Back% + (16 * DE.Fore%), CHR$(ASC(char$) - 128))
- 'COLOR DE.Back%, DE.Fore%
- 'PRINT CHR$(ASC(Char$) - 128);
- 'COLOR DE.Fore%, DE.Back%
- ELSE
- IF I.Color% THEN
- CALL PRINTA(Col% + char% - 1, Row%, DE.Fore% + (16 * DE.Back%), char$)
- 'COLOR DE.Fore%, DE.Back%
- ELSE
- CALL PRINTA(Col% + char% - 1, Row%, S.Fore% + (16 * S.Back%), char$)
- END IF
- 'PRINT Char$;
- END IF
- NEXT char%
-
- END SUB
-
-